软件工程

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

3
这是象征性的不断过度使用吗?
我刚接触软件工程,因此作为一项学习练习,我写了一个国际象棋游戏。我的朋友看了一下,并指出我的代码看起来像 for (int i = 0; i < 8; i++){ for (int j = 0; j < 8; j++){ 他坚持认为应该改为 for (int i = 0; i < CHESS_CONST; i++){ for (int j = 0; j < CHESS_CONST; j++){ 带有一些更好的符号名称,我现在就不用考虑了。 现在,我当然知道通常会避免使用幻数,但是我觉得 这个数字永远不会改变; 该名称无论如何都不能这么具有描述性,因为在整个代码中很多地方都使用了该数字;和 任何经过国际象棋程序源代码的人都应该对国际象棋有足够的了解,以便知道8是什么, 确实不需要符号常量。 那么你们怎么看?这是矫kill过正吗,还是我应该遵循惯例并使用符号?

6
是否应该对复杂的正则表达式进行单元测试?
我应该在应用程序中为复杂的正则表达式编写单元测试吗? 一方面:它们易于测试,因为输入和输出格式通常很简单且定义明确,而且它们往往变得如此复杂,因此对它们的测试特别有价值。 另一方面:它们本身很少是某个单元界面的一部分。最好只测试接口,然后以隐式测试正则表达式的方式进行操作。 编辑: 我同意布朗博士的意见,他在评论中指出这是内部组件单元测试的特例。 但是正则表达式作为内部组件具有一些特殊特征: 没有真正的单独模块,单行正则表达式可能非常复杂。 正则表达式将输入映射到输出而没有任何副作用,因此真正易于单独测试。

1
DRY不相关但几乎相同的代码
我有一些几乎相同的代码,但是在主变量上使用绝对不同的类型,它们之间没有继承。具体来说,我正在用Roslyn针对C#和VB.NET编写具有以下类型的分析器: Microsoft.CodeAnalysis.CSharp.Syntax.AttributeSyntax Microsoft.CodeAnalysis.VisualBasic.Syntax.AttributeSyntax 我想知道是否因为代码在做相同的事情,我应该将其保持为DRY,将其尽可能少地拆分为单独的(但类型除外),还是将它们完全分开,因为这两种方法是不相关,将来的更改可能会迫使一个版本更改,而另一个版本则不能更改(尽管这不太可能)? 编辑:大约一年后,我遇到了同样的问题,罗斯林(Roslyn)团队帮助我解决了这个问题:编写一个采用泛型并具有TAttributeSyntax完成大部分工作的参数的基类。然后,使用最少的需要特定类型的数据编写派生类。
34 c#  design  dry 

7
为什么大多数主流语言不支持“ x <y <z”语法进行三路布尔比较?
如果我想比较两个数字(或其他排序良好的实体),则可以使用x &lt; y。如果我想比较其中的三个,那位高中代数的学生会建议尝试x &lt; y &lt; z。然后,我中的程序员将回答“不,那是无效的,您必须这样做x &lt; y &amp;&amp; y &lt; z”。 我遇到的大多数语言似乎都不支持这种语法,考虑到它在数学中的普遍性,这很奇怪。Python是一个明显的例外。JavaScript 看起来像是一个异常,但实际上,它只是运算符优先级和隐式转换的不幸产物。在node.js中,1 &lt; 3 &lt; 2评估为true,因为它确实是(1 &lt; 3) &lt; 2 === true &lt; 2 === 1 &lt; 2。 所以,我的问题是这样的:为什么x &lt; y &lt; z具有预期语义的编程语言不常见?

1
返回其参数的函数的名称?
不执行任何操作,不接受任何参数且不返回任何内容的函数在传统上称为noop或no-op。下面是一个noop的示例: function noop(){} http://en.wikipedia.org/wiki/NOP 那么,是否有一个函数名称仅用于返回其参数,而不做其他任何事情?这种功能的一个例子: function(a){return a}
34 functions 

6
如何测试难以模拟对象的系统?
我正在使用以下系统: Network Data Feed -&gt; Third Party Nio Library -&gt; My Objects via adapter pattern 最近,我们遇到了一个问题,即我更新了所使用的库的版本,这尤其导致时间戳(第三方库返回该时间戳long)从时期后的毫秒数更改为时期后的毫微秒。 问题: 如果编写模拟第三方库对象的测试,则如果我对第三方库的对象犯了错误,则我的测试将是错误的。例如,我没有意识到时间戳会改变精度,这导致需要更改单元测试,因为我的模拟返回了错误的数据。这不是库中的错误,它的发生是因为我错过了文档中的某些内容。 问题是,我无法确定这些数据结构中包含的数据,因为如果没有真实的数据馈送,我将无法生成真实的数据。这些对象又大又复杂,并且其中包含许多不同的数据。第三方库的文档很差。 问题: 如何设置测试以测试此行为?我不确定我可以在单元测试中解决此问题,因为测试本身很容易出错。另外,集成系统又大又复杂,容易遗漏一些东西。例如,在上述情况下,我已经在几个地方正确地调整了时间戳记处理,但是我错过了其中之一。在我的集成测试中,该系统似乎在做正确的事情,但是当我将其部署到生产环境(具有大量数据)时,问题变得很明显。 我目前没有集成测试过程。测试本质上是:尝试保持单元测试良好,在出现问题时添加更多测试,然后部署到我的测试服务器并确保一切正常,然后部署到生产中。这个时间戳问题通过了单元测试,因为模拟创建错误,然后通过了集成测试,因为它没有引起任何直接的,明显的问题。我没有质量检查部门。

6
使用两个队列实现堆栈的意义何在?
我有以下作业问题: 使用两个队列实现堆栈方法push(x)和pop()。 我觉得这很奇怪,因为: 堆栈是(LIFO)队列 我不明白为什么您需要两个队列来实现它 我到处搜寻: 极客 堆栈溢出 并找到了一些解决方案。我最终得到的是: public class Stack&lt;T&gt; { LinkedList&lt;T&gt; q1 = new LinkedList&lt;T&gt;(); LinkedList&lt;T&gt; q2 = new LinkedList&lt;T&gt;(); public void push(T t) { q1.addFirst(t); } public T pop() { if (q1.isEmpty()) { throw new RuntimeException( "Can't pop from an empty stack!"); } while(q1.size() &gt; 1) …
34 java  stack 

8
重写Object.finalize()真的不好吗?
反对重写的两个主要论点Object.finalize()是: 您不必决定何时调用它。 它可能根本不会被调用。 如果我正确理解了这一点,我认为这些理由不足以令人讨厌Object.finalize()。 由VM实施和GC决定何时分配对象的正确时间,而不是开发人员。为什么决定何时Object.finalize()打电话很重要? 通常,如果我错了,请纠正我,唯一的一次Object.finalize()调用是在GC有机会运行之前终止应用程序的时间。但是,无论如何,当应用程序的进程终止时,对象都会被释放。因此Object.finalize()没有被调用,因为它不需要被调用。开发人员为什么要关心? 每次我使用必须手动关闭的对象(例如文件句柄和连接)时,我都会感到非常沮丧。我必须不断检查对象是否具有的实现close(),并且我肯定在过去的某些时候错过了对它的一些调用。为什么不把它放到VM和GC中,而是通过将close()实现放入其中来处置这些对象,这将变得更加简单,安全Object.finalize()呢?

3
Forking GPL项目:我对新的fork有完整的权限还是与原始所有者有依存关系
我正在考虑创建一个由GPLv2许可的小型项目的分支,并且我在一些有关各种站点和论坛的研究中未能解决的一些非常具体的问题。 当我分叉代码时,我被迫按照与我相同的许可证(GPL)来发布新项目,但是我是否也可以决定以双重许可(其中之一是商业许可)发布该新项目? 分叉项目时,我是否自动拥有整个作品的版权?这是有关时,例如,在决定许可未来的变化,或者能够执行GPL许可证3 次聚会
34 gpl 

7
RESTful API是否倾向于鼓励贫血领域模型?
我正在一个项目中,我们试图将域驱动设计和REST都应用于面向服务的体系结构。我们不必担心100%符合REST。最好说我们正在尝试构建面向资源的HTTP API(Richardson REST成熟度模型的第2级)。但是,我们试图远离RPC样式的HTTP请求的使用,即,我们尝试根据RFC2616实现我们的HTTP动词,而不是使用POSTdo来实现IsPostalAddressValid(...)。 但是,对此的强调似乎是以我们尝试应用域驱动设计为代价的。只有GET,POST,PUT,DELETE和其他一些很少使用的方法,我们倾向于建立眉头服务和眉头服务往往有贫血的域模型。 POST:接收数据,对其进行验证,然后将其转储到数据中。GET:检索数据,然后将其返回。那里没有真正的业务逻辑。我们还在服务之间使用消息(事件),在我看来,大多数业务逻辑最终都围绕该消息构建。 REST和DDD是否处于某种程度的紧张状态?(或者我在这里误解了什么?我们是否可能在做其他错误?)是否有可能在面向服务的体系结构中构建强大的域模型,同时避免RPC样式的HTTP调用?

3
Java开发是否通常比C#/。NET涉及更多的子类化?
我最近开始研究Android开发。这使我回到了Java软件开发领域。我承认,上一次我使用Java时,我对OOP的了解不如现在(我认为)那么多。 在我的职业生涯中主要使用C#之后,我注意到Java和C#在继承使用方式方面的惊人差异。 在C#中,似乎在大多数情况下都可以避免继承。通常,可以通过使用.NET框架的具体类来完成当前的任务。 在Java中,从我从代码示例中收集的信息来看,Java框架似乎提供了许多接口或抽象类,这些接口或抽象类将由开发人员实现/扩展。 这似乎太大了,不能简单地归结为风格。这背后的原因是什么?我觉得直到我理解这一点,我才会写干净的Java代码。 此外,这是否仅限于Android SDK还是Java范围内的OOP方法? 或换种说法, 这两种语言(似乎鼓励)比另一种或多或少使用继承的设计是什么? 如果语言对继承的处理相同,并且假设我的观察是有效的,则意味着这与框架/库的设计有关,而与语言无关。这种设计的动机是什么?

6
为什么某些函数式编程语言在函数应用程序中使用空格?
在看过一些用于函数式编程的语言之后,我总是想知道为什么某些fp语言会在功能应用程序(和定义)中使用一个或多个空格字符,而大多数(全部?)命令式/面向对象的语言都在使用括号,这似乎在是更数学的方式。我也认为后者的样式比没有括号的样式更清晰易读。 因此,如果我们有一个函数f(x)=x²,则有两种调用方法: FP: f x 例子: ML,Ocaml,F# 哈斯克尔 LISP,方案(以某种方式) 非FP: f(x) 例子: 几乎所有命令式语言(我知道,请参阅评论/答案) Erlang Scala(也允许单个参数使用“运算符”) “省略”括号的原因是什么?

8
开发人员为什么不在Linux上制作安装向导?[关闭]
我敢肯定这不是关于懒惰之类的事情,但是我无法理解为什么什至主要面向消费者的应用程序的开发人员都没有做出任何安装向导来进行下一步。相同的应用程序通常都具有Windows和Mac OS的安装程序,那么为什么不使用Linux? 这种趋势是否有任何技术原因,还是仅仅是惯例? 编辑(2014年9月23日):并未询问此问题来启动Windows vs Linux的火焰大战。我已经使用了所有3种主要操作系统,除了Linux,其他两个(Windows和Mac OS)都具有安装程序。我尚未安装Oracle,但无论需要安装什么,都从未见过任何Linux的GUI安装程序。 是的,我知道Linux具有软件包管理器,因此开发人员无需“不需要”进行安装。但是,仍然有大量软件要么在默认程序包管理器中已过时,要么根本不可用。另外,由于Linux是针对休闲用户的Windows的替代产品(Ubuntu在该领域正在努力),因此仅向用户提供他们熟悉的内容会更有意义。 例如,设置一个LAMP堆栈。这些都是默认存储库中的所有开源软件,但是您可以在没有脚本的情况下一次性设置所有内容吗?现在查看Windows中的WAMP服务器。您只需要运行一个安装程序,它就会以相互协作的方式安装多个软件。然后,它会设置好的默认值和内容。安装程序可以做到这一点,而程序包管理器则不能。是的,您可以在网上找到该脚本,但是在哪里?哪一个? 安装程序不是过去的过时技术。它们仍然有用,并且95%的用户已经对它们感到满意。

1
什么是表格编程?
在猎鹰的编程语言标榜自己是支持表格程序: Falcon提供了六个集成的编程范例:过程式,面向对象,面向原型,函数式,表格式和消息式。而且您不必掌握所有这些知识。您只需要选择所需的成分,然后让代码遵循您的灵感即可。 该文档在某种程度上扩展了表格式编程语言的工作方式,但重点在于该语言自身的结构和语法,并没有真正解释该范式的好处(当然,从那些简单的例子中可以明显看出这些范例的好处) 。 我对整个内部运作方式有些困惑,据我了解,Falcon Table是一个或多或少可以用作关系表的本机结构,并且可以描述为(具有面向对象的语言)(具有面向对象的关系集)。我知道这是一个可怕的描述(怪罪我的OO根源和多年滥用龙舌兰酒)。 您能帮助我更好地了解什么是表格编程及其内部运作方式吗? 澄清:我不是在询问表格模型编程。
34 paradigms 

5
明确禁止军事应用的“开源”许可证
我是一名研究员,在我的研究中,我做了很多编程工作。我是开放源代码概念的忠实拥护者-尤其是在研究中,透明性和可重复性已经是文化的重要组成部分。我很高兴为社区做出最大的贡献,其中的一部分就是发布我的代码供任何人使用。 但是,在研究中,对于您生产的产品将用于何种用途,始终存在一定程度的不确定性。我完全理解我不能为任何结果或结论提供版权-但我可以保护他人如何使用我的代码,并且我想确保没有(合法)方式将我生产的软件整合到军事应用程序中。 我已经阅读了一些较短的通用OSS许可证,以及更多的摘要,但它们似乎都只集中在“您是否从我的代码中赚钱?”这一问题上。和“您是否将我的代码与您的程序一起使用?” -与程序实际对代码的处理无关。 是否有任何明确禁止各种军事应用的良好开源许可证? 更新: 在阅读了有关OSS的工作原理的更多信息之后,我意识到,根据定义,满足我的需求的许可证将不是开源的,因为开源许可证无法区分字段。因此,我宁愿寻找一个类似于开源许可证的许可证,只是它禁止军事用途。我希望此许可证已经存在,创作或至少由真正了解许可证的人审查,因为我不知道。 另外,在回应几句话时,这将很难执行:是的,我意识到这一点。但这更多的是我自己,而不是法律含义。如果我使用这样的许可证,而一个军事组织仍在使用我的代码,则尽管我明确指示不这样做,但他们正在违反法律并且正在这样做。因此,他们对包含我编写的软件的应用程序执行的可能令人讨厌的事情不再“凭我的意识”,因为它们从我身上偷走了该软件。(在某个地方,我天真地希望,如果他们需要我做的事情,并且我的许可证禁止他们合法使用它,他们会得到别人做同样事情并允许他们使用的程序。不是那个政府总是这样做,但他们总是应该遵守法律...) 可以这么说,这是一种道德保障,而不是我实际上希望在法庭上提出的东西(如果我的平庸代码曾被CIA使用过……)

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.