软件工程

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

2
如何使用逻辑编程实现交互式程序(例如游戏/模拟)?
我听说逻辑编程可以用作其他编程范例(例如OO或函数式编程)的通用替代品。(因为Prolog是图灵完整的,所以一定是这样!) 但是,我很难看到如何实现交互式程序,例如Prolog或类似语言的简单图形控制台游戏。您具有事实,可以推导出更多事实的规则以及可以检索事实的查询。很容易看出如何使用这些基本元素来创建诸如数独求解器之类的东西。但是吃豆人,或者更简单地说是Pong呢? 请注意:我不是在寻找底层细节,而是在概念上进行概述。(例如:从高级的角度来说,您将如何处理I / O?如何存储游戏状态?如何实现“主循环”之类的东西?如何测量和响应时间流逝? )

3
TDD和重构遇到的困难(或者-为什么这比应该的要痛苦得多?)
我想教自己使用TDD方法,而我有一个项目想要工作一段时间。这不是一个大项目,所以我认为这将是TDD的不错的选择。但是,我感觉有些不对劲。让我举个例子: 在较高级别上,我的项目是Microsoft OneNote的加载项,它使我可以更轻松地跟踪和管理项目。现在,如果我决定建立自己的自定义存储和后端的一天,我还希望保持与OneNote分离的业务逻辑。 首先,我从一个基本的普通单词接受测试开始,概述了我希望我的第一个功能要做的事情。看起来像这样(为简洁起见,将其复制): 用户点击创建项目 用户输入项目标题 验证项目创建正确 跳过UI内容和一些中介计划,我来进行第一次单元测试: [TestMethod] public void CreateProject_BasicParameters_ProjectIsValid() { var testController = new Controller(); Project newProject = testController(A.Dummy<String>()); Assert.IsNotNull(newProject); } 到目前为止,一切都很好。红色,绿色,重构等。现在它实际上需要保存内容。在这里减少一些步骤,我对此很满意。 [TestMethod] public void CreateProject_BasicParameters_ProjectMatchesExpected() { var fakeDataStore = A.Fake<IDataStore>(); var testController = new Controller(fakeDataStore); String expectedTitle = fixture.Create<String>("Title"); Project newProject = testController(expectedTitle); Assert.AreEqual(expectedTitle, newProject.Title); } …

5
为什么git commit不包含在其上创建分支的名称?
在使用功能分支的团队中使用git时,我经常发现很难理解历史上的分支结构。 例: 假设有一个功能分支Feature / make-coffee,并且在master上与该功能分支并行地进行了错误修复。 历史记录可能如下所示: * merge feature/make-coffee |\ | * small bugfix | | * | fix bug #1234 | | | * add milk and sugar | | * | improve comments | | * | fix bug #9434 | | | * make coffe (without milk …
20 git  branching 

5
实体组件系统体系结构对象是否按定义定向?
按照定义,实体组件系统体系结构是否面向对象?对我来说,这似乎更具程序性或功能性。我的观点是,它不会阻止您以OO语言实现它,但是以坚定的OO方式实现它并不是惯用的。 似乎ECS会将数据(E&C)与行为(S)分开。作为证据: 这个想法是在实体中没有嵌入任何游戏方法。 和: 该组件包含用于特定目的的最少数据集 系统是具有一组具有特定组件的实体的单一目的功能 我认为这不是面向对象的,因为面向对象的很大一部分是将您的数据和行为结合在一起。 作为证据: 相反,面向对象的方法鼓励程序员将数据放置在程序其余部分无法直接访问的位置。而是通过调用专门编写的函数(通常称为方法)来访问数据,这些函数与数据捆绑在一起。 另一方面,ECS似乎只不过是将数据与行为分开。

8
为什么将需要排序数据的二进制搜索比线性搜索更好?
我一直听说线性搜索是一种幼稚的方法,并且由于渐近复杂性的提高,二进制搜索的性能要优于线性搜索。但是我从来不明白为什么在二进制搜索之前需要排序时,为什么它比线性搜索更好? 线性搜索为O(n),二进制搜索为O(log n)。这似乎是说二进制搜索更好的基础。但是二进制搜索需要O(n log n)对最佳算法进行排序。因此,二进制搜索实际上不应该更快,因为它需要排序。 我正在阅读CLRS,作者在其中表示,在插入排序中而不是使用朴素的线性搜索方法,最好使用二进制搜索来查找必须插入项目的位置。在这种情况下,这似乎是合理的,因为在每次循环迭代时,都有一个可以应用二分查找的排序列表。但是在通常情况下,对于不能保证我们需要搜索的数据集,由于排序要求,使用二进制搜索实际上并不比线性搜索差吗? 我是否忽略了使二进制搜索比线性搜索更好的实际考虑因素?还是不考虑排序所需的计算时间而认为二进制搜索比线性搜索更好?

3
编写代码时,我是否必须考虑编译后的机器代码?
例如,我有以下代码: auto z = [](int x) -> int { if (x > 0) { switch (x) { case 2: return 5; case 3: return 6; default: return 1; } } return 0; }; 后来我多次打电话给我。在asm代码中,我看到了使用lambda进行的外部调用。因此,也许我在元编程中获胜,但在asm调试和性能方面是否会输?我是否应该避免使用现代语言功能,宏和其他元编程方面,以确保性能和调试简便性?

8
Java-为什么我们将数组称为“向量”?
我正在阅读有关Java编程的书,并希望确认我理解“向量”一词的定义。维基百科说向量是“一个一维数组”,来源http://en.wikipedia.org/wiki/Vector。 将数组简单地称为数组会更简单吗?我们是否有任何理由需要使用这种奇特的语言作为“向量”?数组和向量之间有区别吗? 资料来源:《破解编码访谈》,第4版,盖尔·麦克道威尔,第47页。 常见问题 Q-为什么不将其发布在english.stackexchange.com上? 答:因为我认为只有面向计算机科学的人才能有一个好的答案。
20 java 

5
测试人员应该批准发布,还是只报告测试?
将签名授权给测试人员是否有意义?应该有一个测试团队 只需测试功能,问题等,并仅在通过/失败的基础上进行报告,然后由其他人根据这些结果采取行动,或者 是否有权根据这些结果自行阻止发布? 换句话说,应该要求测试人员实际批准发布吗?与我一起工作的测试团队认为他们确实这样做了,因为“测试范围蠕变”,我们对此有疑问-拒绝批准发行版有时是基于有问题的发行版未明确解决的问题。

3
我为什么要使用Angular?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6个月前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 从基本的Angular教程来看,似乎所做的只是从API中获取一些JSON并显示它。此外,还有双重绑定魔术。 但是,为什么我要使用它来代替后端解决方案(例如Rails),后者在后端中构建视图并将其提供给用户,而一切都已经就绪?有哪些用例?
20 javascript 

5
如何说服团队成员“ mandelbug”的存在
我们正在开发一个应用程序;它包括由另一个编码器开发的库,该库通过多个网络连接与服务器通信,并且涉及多个线程一起工作。服务器端代码非常复杂,我们无法访问源代码。 最近,我发现了一个Mandelbug有时会使应用程序崩溃。我可以重现一次并获得堆栈跟踪,因此打开了一个错误报告。该错误本身易于修复(后台线程之一中未捕获的Web异常,这使CLR终止程序)。 问题是开发人员拒绝修复该错误,因为“他不相信它的存在”。不幸的是,老板对我表示支持,并说除非我创建一个“可靠的测试用例”以证明该错误的存在并进行单元测试以确认该错误已消失,否则无法修复该错误。由于bug的性质,基本上是不可能的。 有什么建议吗?

5
使用自动格式化在Eclipse中格式化代码是一个好主意
我使用eclipse进行编码,而我们使用的语言是Java。一旦有人建议使用自动格式化程序(CTRL + SHIFT + F)来正确格式化代码,尽管此命令确实对代码进行格式化,但有时我会觉得整体外观很奇怪,并且实际上不太可读。 那么这是推荐做的事情吗?如果不是,在eclipse中格式化我们的代码会更好吗?

5
随机播放对象的有效方法
我正在为一些测验软件编写程序。我有一个问题类,其中包含用于问题,答案,选项,标记和否定标记的ArrayList。像这样: class question { private ArrayList<Integer> index_list; private ArrayList<String> question_list; private ArrayList<String> answer_list; private ArrayList<String> opt1_list; private ArrayList<String> opt2_list; } 我想打乱所有问题,但要打乱所有问题,则所有对象都需要打乱。我本可以以这种方式解决这个问题: 首先,我将不会使用此设计,也不会使用String而不是ArrayList<String>类型作为实例变量,然后会使用该Collections.shuffle方法来随机播放对象。但是我的团队坚持采用这种设计。 现在,问题类别包含输入问题时不断增加的ArrayLists。现在如何洗牌?
20 java  collections 

2
JPEG-2000的软件支持的当前状态是什么?
一般建议记录原始扫描图像曾经是“使用TIFF”。但是程序员需要格式的演变才能实现“软件的演变”,而我需要发展自己的系统以从TIFF转换为JP2。 我有一个很大的图像存储区(TB),用于存放法律和科学扫描的材料,它们需要原始记录。我使用了一些缓存规则,但是系统需要显示(通过Web下载)或操纵(ImageMagick等)原始数据。 我读过一篇关于将图像存储从无损TIFF迁移到无损JPEG-2000的文章,其结论是继续使用TIFF。但是,该文章来自2009年,当时他们发现可用软件对JPEG-2000格式的支持非常差。在他们测试的软件中,向JPEG-2000的转换是有损的,并且用于消费图像的可用软件也不支持该格式。 现在是时候从TIFF更改为JP2了吗?软件支持是否仍然像2009年那样存在缺陷?

5
他们如何在受保护的内存之前调试分段错误?
现在,当我用C中的指针犯了一个编程错误时,我遇到了一个很好的分段错误,程序崩溃了,调试器甚至可以告诉我哪里出错了。 在没有内存保护的情况下,他们是如何做到的?我可以看到一个DOS程序员在弄错时摆弄着他,并使整个操作系统崩溃。虚拟化不可用,因此他所能做的就是重新启动并重试。真的那样吗?

6
Java序列化-优点和缺点,使用还是避免?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 序列化用于Java的持久性。可以使用序列化持久化一些对象。但是,对于大量对象,ORM,数据库等可能会更好。似乎序列化仅对小型作业有用。可能是我错了。因此,请告诉我序列化比非序列化方法有什么优势?什么时候应该使用,什么时候应该避免使用? 看到DZone文章“对象序列化是否有害”之后,这个问题浮现在我脑海。 以下是引起我疑问的内容: 如果您查看Java及其会话对象,则使用纯对象序列化。假设应用程序会话的寿命很短(最多几个小时),则对象序列化非常简单,得到了很好的支持,并内置在会话的Java概念中。但是,当数据持久性处于较长的时间段(可能是数天或数周)时,并且您不得不担心应用程序的新发行版时,序列化很快就会变成邪恶。正如任何优秀的Java开发人员所知道的那样,如果您打算序列化对象(即使在会话中),则需要一个真实的序列化ID(serialVersionUID),而不仅仅是1L,并且您需要实现Serializable接口。但是,大多数开发人员都不知道Java反序列化过程背后的实际规则。如果您的对象已更改,则不仅仅向对象添加简单字段,即使序列号未更改,Java也可能无法正确反序列化对象。突然,您无法再检索数据,这本质上是糟糕的。 现在,可能开发人员阅读此文章可能会说他们将永远不会编写有此问题的代码。可能是这样,但是您使用的库或公司不再雇用的其他开发人员呢?您能保证这个问题永远不会发生吗?保证的唯一方法是使用其他序列化方法。

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.