软件工程

针对在系统开发生命周期中工作的专业人士,学者和学生的问答


3
销毁大型列表会溢出我的堆栈吗?
考虑以下单链表实现: struct node { std::unique_ptr<node> next; ComplicatedDestructorClass data; } 现在,假设我停止使用某个std::unique_ptr<node> head超出范围的实例,从而导致其析构函数被调用。 这会否使我的堆栈大到无法容纳足够大的列表?假设编译器会做一个相当复杂的优化(将inline unique_ptr的析构函数插入node,然后使用尾部递归)是否公平,如果我执行以下操作,这会变得更加困难(因为data析构函数会混淆next's',使其变得困难)让编译器注意到潜在的重新排序和尾部调用机会): struct node { std::shared_ptr<node> next; ComplicatedDestructorClass data; } 如果data某种程度上有指向它的指针,node那么尾部递归甚至是不可能的(尽管我们当然应该努力避免这种封装破坏)。 通常,那么应该如何销毁该列表呢?我们无法遍历列表并删除“当前”节点,因为共享指针没有release!唯一的方法是使用自定义删除器,这对我来说真的很臭。

3
什么时候使用REST处理请求与使用AJAX处理请求[关闭]
已关闭。这个问题需要细节或说明。它当前不接受答案。 想改善这个问题吗?添加详细信息并通过编辑此帖子来澄清问题。 6年前关闭。 在我的网页上,如果希望显示动态下拉列表(例如,基于所选国家/地区的城市名称),则可以使用AJAX进行。但是我也可以使用REST调用来做到这一点。那我应该使用哪个呢? 我的问题是我真的没有得到REST和任何其他HTTP浏览器请求(也就是表单提交)之间的区别。我查看了REST的正式定义,它似乎与HTTP请求相同。那么REST与AJAX本质上有何不同?
12 rest  ajax 


4
哪种方法仅对实现接口的一个类可用,而对另一种则不可用,则是一种更好的方法?
基本上,我需要在特定条件下执行不同的操作。现有代码以这种方式编写 基本介面 // DoSomething.java interface DoSomething { void letDoIt(String info); } 实施第一类工人 class DoItThisWay implements DoSomething { ... } 实施第二类工人 class DoItThatWay implements DoSomething { ... } 主班 class Main { public doingIt(String info) { DoSomething worker; if (info == 'this') { worker = new DoItThisWay(); } else { worker …

7
在面向对象的语言中,对象应何时对自己进行操作,何时应对对象进行操作?
假设有一个Page类,它表示对页面渲染器的一组指令。假设有一个Renderer知道如何在屏幕上呈现页面的类。可以通过两种不同的方式来构造代码: /* * 1) Page Uses Renderer internally, * or receives it explicitly */ $page->renderMe(); $page->renderMe($renderer); /* * 2) Page is passed to Renderer */ $renderer->renderPage($page); 每种方法的优缺点是什么?什么时候会更好?什么时候会更好? 背景 为了增加一些背景知识-我发现自己在同一代码中同时使用了这两种方法。我正在使用名为的第三方PDF库TCPDF。在我的代码中的某些地方,必须具备以下条件才能使PDF呈现工作: $pdf = new TCPDF(); $html = "some text"; $pdf->writeHTML($html); 假设我希望创建页面的表示形式。我可以创建一个模板,其中包含用于呈现PDF页面摘要的说明,如下所示: /* * A representation of the PDF page snippet: * a …

5
Git提交尚未完成,但无法在该机器上继续
有时,我遇到的问题是工作站上未提交代码,但尚未准备好提交但需要在其他工作站或笔记本电脑上完成。 是否有人可以解决此问题,例如“软提交”或将更改转移到另一台计算机以在其他地方使用的其他方法? 我希望不要被迫提交和推送未正确实施的更改。
11 git 


7
技术经理保持最新技术的最佳方法
我的经理询问了他应该关注的技术博客列表,以便随时了解技术。他的问题是他不断听到自己从未听说过的术语(例如,NoSql,分片,agure,服务总线等),并且他希望至少有一定的战斗机会来了解它们,而不必做出反应和查找他们。另外,我认为他希望对所有新兴技术及其融合在一起有一个全面了解,而不是孤立地了解每件事。 他询问了博客,但我认为印刷杂志也可能会有所帮助。 我该怎么回答他?
11 management 


5
您如何调试二进制格式?
我希望能够调试构建二进制生成器。现在,我基本上是将输入数据输出到二进制解析器,然后深入代码并打印输入到输出的映射,然后获取输出映射(整数)并使用它来定位对应的整数在二进制文件中。非常笨拙,并且需要我对源代码进行深度修改才能获得输入和输出之间的映射。 似乎您可以查看不同变体形式的二进制文件(在我的情况下,我想以十进制数字形式以8位块形式查看二进制文件,因为它非常接近输入内容)。实际上,有些数字是16位,有些是8位,有些是32位,等等。因此,也许会有一种查看二进制文件的方式,这些内存中的每个不同数字都以某种方式突出显示。 我看到的唯一可能的方法是,如果您实际上构建了特定于实际二进制格式/布局的可视化工具。因此,它知道序列中的32位数字应位于何处,以及8位数字应位于何处,等等。在某些情况下,这是很多工作并且有些棘手。所以想知道是否有通用的方法可以做到这一点。 我也想知道目前调试这种类型的东西的一般方法是什么,所以也许我可以从中得到一些尝试的想法。
11 debugging  binary 

3
如何防止用户在其浏览器中编辑我的代码?
描述 我正在设计一个Node.JS应用程序(更像一个完整的网站)。该应用程序将发送五个JavaScript文件,并将具有<script>将它们链接在一起的标签。 题 如何防止用户和攻击者窥视和编辑我的代码? 一个例子是: Ctrl+ Shift+I 在Devtools的 goto Sources中,选择一个文件进行编辑(即index.html)并进行编辑 按Ctrl+ S会导致实时编辑发生 我想防止上述例子的发生...可能吗? 这是我的想法: 我将创建另一个客户端JavaScript文件prevent_keys.js 它将监听Ctrl+ Shift+ I。 如果返回true(即按下了按键),它将log显示按键。 但是,这不会阻止用户直接使用Devtools。

5
如何使用依赖注入并避免时间耦合?
假设我有Service通过构造函数接收依赖项的,但还需要使用自定义数据(上下文)进行初始化,然后才能使用它: public interface IService { void Initialize(Context context); void DoSomething(); void DoOtherThing(); } public class Service : IService { private readonly object dependency1; private readonly object dependency2; private readonly object dependency3; public Service( object dependency1, object dependency2, object dependency3) { this.dependency1 = dependency1 ?? throw new ArgumentNullException(nameof(dependency1)); this.dependency2 = dependency2 …

2
实体组件系统对解耦/信息隐藏不是很可怕吗?
标题故意是双曲线的,可能只是我对模式的经验不足,但这是我的理由: 实现实体的“通常”或可以说是直接的方法是通过将它们实现为对象并将其子类化为常规行为。这导致了经典的问题“是或EvilTree的子类”。如果我们允许多重继承,就会出现钻石问题。我们可以代替拉的组合功能,并进一步向上层次导致神类,或者我们可以故意留出的行为在我们和类(使他们在极端情况下接口),以便可以实现本身-这会导致如果有一个代码复制。TreeEnemyTreeEnemyTreeEntityEvilTreeSomewhatEvilTree 实体组件系统试图通过将解决这一问题Tree和Enemy对象到不同的组件-比如Position,Health和AI-和执行系统,例如AISystem,根据AI决定改变一个Entitiy的位置。到目前为止,EvilTree还算不错,但是如果可以启动电源并造成损害该怎么办?首先,我们需要一个CollisionSystem和一个DamageSystem(我们可能已经有了这些)。CollisionSystem与进行通信的需求DamageSystem:每次两件事冲突时,CollisionSystem都会向发送一条消息,DamageSystem以便减少健康状况。损坏也会受到通电的影响,因此我们需要将其存储在某个地方。我们是否创建一个PowerupComponent附加到实体的新商品?但是然后DamageSystem需要知道一些它宁愿一无所知的东西-毕竟,有些东西会造成无法获得能量的伤害(例如Spike)。我们是否允许PowerupSystem修改StatComponent与该答案类似的用于损伤计算的?但是现在两个系统访问相同的数据。随着我们的游戏变得越来越复杂,它将变成无形的依赖图,其中组件在许多系统之间共享。在这一点上,我们可以使用全局静态变量并摆脱所有样板。 有解决此问题的有效方法吗?我曾经有过一个想法,就是让组件具有某些功能,例如,给StatComponent attack()它默认情况下只返回一个整数,但是可以在上电时进行组合: attack = getAttack compose powerupBy(20) compose powerdownBy(40) 这不能解决attack必须保存在多个系统访问的组件中的问题,但是如果我有足够的语言来支持它,至少我可以正确键入这些函数: // In StatComponent type Strength = PrePowerup | PostPowerup type Damage = Int type PrePowerup = Int type PostPowerup = Int attack: Strength = getAttack //default value, can be changed by systems getAttack: PrePowerup // these functions …

6
开发后创建软件设计文档是否合理?
我目前正在为我的“软件开发”研究而毕业,在该研究中,我必须在外部公司中单独开发复杂的软件。所有这些都需要以结构化的方式完成,创建所有相应的文档。 对于这个项目,我选择使用IEEE标准文档:软件需求文档(SRS),软件体系结构文档(SAD)和软件设计文档(SDD)。尽管在学校另有授课,但对于该项目,我选择在开发后(而不是之前)创建SDD 。我的理由是: 我从事实习的公司给了我指导,以实验方式创建满足某些要求的复杂软件。由于他们在项目定义中给了我很大的自由度,因此几乎没有什么可以事先确定的,并且在开发过程中进行试验时最好能遇到。此外,我以个人方式创建软件,对于公司中的其他任何人来说,事先进行此软件设计对我来说都是没有好处的。事前做会花很多时间,以后再做,因为我可以确定由于项目的不确定性,我做的设计必须作很多改动。这对我来说适得其反。 在开发后创建SDD是否有充分的理由?如果没有,那有什么正当理由吗? 编辑:之后创建SDD的原因是为了将来的开发人员继续该项目。在毕业期间,我将无法完成整个项目,因此其他开发人员将不得不继续使用当前的代码库。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.