软件工程

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

10
将goto用于这些明显且相关的情况下,它有什么不好?
我一直都知道那goto是不好的事情,被锁在一个地下室,永远不会永远变好,但是今天我遇到了一个代码示例,使用起来很合理goto。 我有一个IP,需要检查它是否在IP列表中,然后继续执行代码,否则引发异常。 <?php $ip = '192.168.1.5'; $ips = [ '192.168.1.3', '192.168.1.4', '192.168.1.5', ]; foreach ($ips as $i) { if ($ip === $i) { goto allowed; } } throw new Exception('Not allowed'); allowed: ... 如果我不使用,goto那么我必须使用一些变量,例如 $allowed = false; foreach ($ips as $i) { if ($ip === $i) { $allowed = true; …
40 php  goto 

4
是否应该将测试数据检查到版本控制中?
我正在为处理PDF文件的功能编写一些测试代码。测试背后的基本思想是,将它们指向我专门选择的一些PDF,它们会对其进行处理,然后检查输出是否符合我的期望。 我的问题是:我应该在哪里存储这些大尺寸的PDF?我应该将它们与代码一起检查到版本控制中吗?还是将它们放在其他地方?显然,没有PDF(甚至不同的PDF)的测试代码是没有用的,但是仍然将它们放入我们的存储库中仍然感觉不对。

9
我应该在遍历它们的方法中接受空集合吗?
我有一个方法,其中所有逻辑都在foreach循环内执行,该循环遍历该方法的参数: public IEnumerable<TransformedNode> TransformNodes(IEnumerable<Node> nodes) { foreach(var node in nodes) { // yadda yadda yadda yield return transformedNode; } } 在这种情况下,发送一个空集合会导致一个空集合,但是我想知道这是否不明智。 我的逻辑是,如果有人正在调用此方法,那么他们打算传入数据,并且只会在错误的情况下将空集合传递给我的方法。 我应该捕获此行为并抛出异常,还是返回空集合的最佳实践?

5
将函数作为参数传递给其他函数,不好的做法?
我们一直在改变AS3应用程序与后端通信的方式,并且正在实现REST系统以替换旧系统。 不幸的是,开始工作的开发人员现在正在休长期病假,并且已移交给我。在过去的一周左右的时间里,我一直在使用它,并且我了解该系统,但是有一件事让我感到担心。函数似乎有很多传递给函数。例如,调用服务器的类具有一个函数,该函数将在过程完成且已处理错误时调用并传递对象。 它给我一种“糟糕的感觉”,让我感觉这是一种可怕的做法,我可以想到一些原因,但是在我建议对系统进行重新设计之前,我需要一些确认。我想知道是否有人对这个可能的问题有任何经验?

3
什么是帮手?是设计模式吗?是算法吗?
也许有点tongue之以鼻,但由于我无法在Google的任何地方找到此答案,因此请确保Software Engineering拥有以下答案: 什么是帮手? 我已经看到该名称在每个地方都被使用(模块名称,类名称,方法名称),好像语义是深刻而有意义的,但是在计算机科学的背景下(尽管我没有学位),我从未在任何地方看到描述或定义! 是设计模式吗?是算法吗?我曾经在一个程序中工作过,在该程序中,模块和类都被称为somethingsomethinghelper(其中某些东西也是相当通用的),然后我立即将其重命名为对我来说有意义的东西,但是我感觉好像在这里丢失了一些东西!

3
关于DDD,什么是有界上下文?
在阅读沃恩·弗农(Vaughn Vernon)的《实施域驱动的设计》(Implementing Domain Driven Design)一书时,我无法很好地理解什么是真正的有限上下文。 本书将有界上下文定义为“适用领域模型的概念边界。它提供了由团队说出并以其精心设计的软件模型表达的无处不在的语言”(“本书指南”的开头部分)。此定义听起来似乎是有界上下文是子域的模型和语言,在该子域中,该子域可能恰好是核心域(似乎应该将其称为“核心子域”,但这是另一个讨论...)。对于有限的上下文提供了什么仍然有些含糊。它是一个或多个子域的分组吗?如果只有一个子域对应一个有界上下文,那么有界上下文实际上告诉我们什么? 但是,同一本书的第3章涉及有界上下文之间的集成技术。但是,这似乎暗示着有限的上下文实际上是软件系统或某种人工制品。 马丁·福勒(Martin Fowler)简要讨论了有界上下文的概念(http://martinfowler.com/bliki/BoundedContext.html),但并未真正阐明问题。 归根结底,什么是有限的上下文?它是一组子域吗?子域的模型和语言?执行一个子域?没有这些答案,似乎很难理解如何将现实问题空间分解为有限的上下文。

9
在进行TDD时需要记录日志吗?
在进行红色,绿色和重构循环时,我们应始终编写最少的代码以通过测试。这就是我被教导有关TDD的方式,以及几乎所有书籍都描述该过程的方式。 但是日志记录呢? 老实说,除非发生真正复杂的事情,否则我很少在应用程序中使用日志记录,但是,我看到无数篇文章都谈到了正确日志记录的重要性。 因此,除了记录异常外,我无法证明在适当的经过测试的应用程序(单元/集成/验收测试)中记录日志的真正重要性。 所以我的问题是: 如果正在执行TDD,是否需要记录?失败的测试不会揭示应用程序有什么问题吗? 是否应该在每个类的每个方法中为日志记录过程添加测试? 例如,如果在生产环境中禁用了某些日志级别,这是否会在测试和环境之间引入依赖性? 人们谈论日志如何简化调试,但是TDD的主要优点之一是,我始终知道由于测试失败而出了什么问题。 有什么我想念的吗?

2
混合Angular和ASP.NET MVC / Web API?
我来自使用ASP.NET MVC / Web API,现在我开始使用Angular,但不清楚混合它们的正确方法。 一旦我使用Angular,MVC服务器端概念是否仍然提供任何价值?还是我应该严格使用Web API来纯粹获取角度HTTP调用的数据? 如果VS模板添加了很多我不需要的东西,也许我应该使用更简化的起点吗? 我喜欢严格区分服务器端=纯数据和客户端=纯HTML处理的想法。


11
提交非工作代码可以吗?
要求仅提交工作代码是个好主意吗? 此提交无需使存储库处于工作状态,如下所示: ...我们正处于早期设计阶段,代码尚不稳定。 ...您是该项目的唯一开发人员。你知道为什么事情不起作用。此外,您不会通过提交损坏的代码来停止任何人的工作。 ...该代码目前无法正常工作。我们将对其进行重大更改。让我们承诺,以便在事情变得丑陋时有一点可以还原。 ...链很长,如果本地分支中存在损坏的代码,则不会有任何麻烦。即 本地文件 暂存区 提交到本地分支 提交到远程个人功能分支 与远程develop分支合并 与远程master分支合并 与远程release分支合并 ...提早提交,经常提交。 因此,在上面链接的问题中,大多数答案都说,提交不可编译的代码在本地和功能分支中没有问题。为什么?提交失败的价值是什么? 补充:有几条备受赞誉的评论,说在当地一家人可以做任何想做的事。但是,我对该问题的技术方面不感兴趣。相反,我想学习最佳实践-习惯,这些习惯在行业中已经工作了很多年,他们的工作效率最高。 我惊讶于大量的出色答案!他们得出的结论是,我不擅长使用分支来组织代码。

5
Lambda表达式除了具有单个方法的匿名内部类之外,还具有其他功能吗?
期待已久的Java 8中的lambda表达式有了新的炒作;每三天有一篇关于他们有多酷的文章随他们出现。 据我了解,lambda表达式只不过是具有单个方法的匿名内部类(至少在字节码级别)。除此之外,它还具有另一个不错的功能-类型推断,但我相信可以在某种程度上使用泛型来实现这一点(当然不能像使用lambda表达式那样巧妙)。 知道了这一点,lambda表达式不仅会带来Java语法上的加糖功能吗?是否可以使用无法使用当前语言功能构建的lambda表达式来创建功能更强大,更灵活的类或其他面向对象的构造?

4
实现零停机时间部署
我正在尝试实现零停机时间部署,因此在理论上,我可以在下班时间减少部署,而在“更慢”的时间内部署更多。 我当前的设置,有些简化: Web服务器A(.NET App) Web服务器B(.NET App) 数据库服务器(SQL Server) 我当前的部署过程: “停止” Web服务器A和B上的站点 升级数据库架构以获取正在部署的应用程序的版本 更新Web服务器A 更新Web服务器B 将所有内容恢复在线 当前问题 每月导致少量的停机时间-大约30分钟。我在下班时间这样做,所以这不是一个大问题-但这是我想摆脱的事情。 另外-没有办法真正退缩。我通常不制作回滚DB脚本-仅升级脚本。 利用负载均衡器 我希望能够一次升级一台Web服务器。从负载均衡器中取出Web服务器A,对其进行升级,使其重新联机,然后对Web服务器B重复上述步骤。 问题是数据库。我的软件的每个版本都需要针对不同版本的数据库执行-所以我有点“卡住了”。 可能的解决方案 我正在考虑的当前解决方案采用以下规则: 切勿删除数据库表。 永远不要删除数据库列。 切勿重命名数据库列。 切勿重新排列列。 每个存储过程都必须进行版本控制。 含义-编辑后,“ spFindAllThings”将变为“ spFindAllThings_2”。 然后在再次编辑时变成“ spFindAllThings_3”。 相同的规则适用于视图。 虽然,这似乎有点极端-我认为它可以解决问题。该应用程序的每个版本都将以不间断的方式访问数据库。该代码期望视图/存储过程产生某些结果-并使该“合同”有效。问题是-它只是马虎了。我知道我可以在应用程序部署一段时间后清理旧的存储过程,但是感觉很脏。另外-这取决于所有遵循这些规则的开发人员,这大部分都会发生,但是我想有人会犯错。 最后-我的问题 这是草率的还是朴拙的? 还有其他人这样做吗? 其他人如何解决这个问题?

9
寻找有意义的,有力的理由支持开发机器上的防病毒软件[关闭]
当形成意见,这是一个很好的做法,遵循的学术传统-觉得很难,因为你可以对你持有的意见,并设法找到反驳。 但是,无论我多么努力,我都无法在开发机器上找到支持防病毒(及相关安全措施)的合理论据。 针对开发中的防病毒(AV)的争论很多: 在AV开启的情况下,进行1分钟构建需要花费10倍的时间并不少见 在一次会议演讲中,IntelliJ开发人员声称当他们的IDE缓慢时,AV软件是第一大嫌疑人。 开启AV时,解压缩速度约为100 kb / s AV导致Cygwin完全无法使用(vim需要1分钟才能打开一个简单的文件) AV阻止我从同事的电子邮件中下载有用的文件(JAR,DLL) 我不能使用多台计算机进行开发,因为AV /安全措施阻止我解除端口阻塞 AV会破坏文件高周转率的程序(例如Maven或Ant)的性能 最后但并非最不重要的一点-AV实际上可以保护我免受什么侵害?我不知道我的AV程序曾经停止过任何安全线程。 如果原因是担心泄露NDA内容-如果我下定决心,任何AV都无法阻止我这样做。 如果原因是担心丢失源代码和/或文档-为此,可以使用分布式修订系统(我们的回购至少有20份副本,并且每天进行同步)。 如果担心害怕泄露客户数据的原因是,开发人员很少与真实的生产数据库建立联系,而是在玩具环境中玩耍。 即使有支持在开发计算机上使用AV的有意义的论点,当面对在偏执的受保护环境中运行虚拟机的能力时,它们也会瓦解。 由于我想对此问题保持开放态度,因此有人可以提出有意义的,有力的论据来支持开发人员使用防病毒软件吗?

11
是否有任何理由不接受可作为虚拟机交付的软件?
这是有关物流的问题,而不是技术问题。 我公司已将一些嵌入式软件工作外包。具体来说,由于我们没有足够的内部知识来自己完成这项工作(我们只有桌面应用程序开发人员),因此我们已经向承包商支付了开发嵌入式系统的费用。 因此,承包商已经完成了软件,并询问是否可以通过虚拟机将其交付给我们。VM是一台Windows 8计算机,其中包含预配置的CodeWarrior IDE,并将源代码作为CodeWarrior项目。想法是,这将使我们能够在已配置用于该项目进一步开发的VM中更改代码。 与让他们逐步引导我们如何配置自己的开发机器以对项目进行代码更改相比,这样做有什么弊端吗?我可以预见的唯一问题是VM运行缓慢,并且在进行代码更改时重建项目需要很长时间。但是另一方面,我喜欢获得预配置的嵌入式系统开发环境的想法,因此不必在台式机应用程序开发计算机上添加另一个IDE。 我真的想不起来为什么不接受VM交付的很好的理由,但是我只是想由这个社区来运行它,以防万一我丢失了某些东西。

3
Clojure的优点是什么?[关闭]
我最近一直在研究Clojure,偶然发现了Stackoverflow上的这篇帖子,该帖子指出了一些遵循最佳实践的项目以及总体上不错的Clojure代码。在阅读了一些基本教程之后,我想对这种语言有所了解,因此我看了一些“实际”项目。 看完ClojureScript和Compojure(前面提到的两个“好的”项目)后,我觉得Clojure是个玩笑。我不明白为什么有人会选择Clojure,例如Ruby或Python,这是我喜欢的两种语言,它们的语法很简洁,很容易上手,而Clojure 到处都使用了太多的括号和符号,从而破坏了其可读性。我。 我认为Ruby和Python美观,可读且优雅。即使对于完全不了解该语言的人,它们也很容易阅读。但是,Clojure对我来说并不透明,我觉得我必须了解有关语言实现的每一个细微细节,以便能够理解任何代码。 所以,请赐教! Clojure有什么好处? 为了欣赏它,我应该了解的最低语言是多少?
40 clojure 

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.