软件工程

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

3
如果仅分发客户端软件,我可以在服务器上商业使用GPL许可的软件吗?
我了解 GPL 的规则,该规则指出,如果我使用GPL代码分发任何软件,则该代码必须要采用GPL许可协议。 但是,我想知道在这种情况下的规则是什么:我正在创建一个将在其中进行销售和分销的服务 客户端软件。 客户端软件中绝对没有GPL代码。这是我自己的代码的100%。 但是,客户端软件将连接到我的服务器,该服务器内部使用GPL代码。 我不是分发服务器端软件;服务器端软件将驻留在我独自控制的专用服务器上,但是如果不连接到该服务器,客户端软件将无法工作。 这算作一个软件吗?如果要这样做,是否需要将我的客户端源代码许可为GPL?或者,我可以在不发布其源代码的情况下出售客户端软件吗?
15 licensing  gpl 

6
正在创建您认为需要在TDD中进行第一次测试的对象
我对TDD相当陌生,在创建任何测试代码之前的第一个测试时遇到了麻烦。在没有任何实现代码框架的情况下,我可以随意编写我的第一个测试,但是它似乎总是被我的Java / OO问题思考方式所困扰。 例如,在我的Github ConwaysGameOfLifeExample中,我编写的第一个测试(rule1_zeroNeighbours)首先创建了一个尚未实现的GameOfLife对象。称为不存在的set方法,不存在的step方法,不存在的get方法,然后使用断言。 随着我编写了更多测试并进行了重构,这些测试也在不断发展,但最初看起来是这样的: @Test public void rule1_zeroNeighbours() { GameOfLife gameOfLife = new GameOfLife(); gameOfLife.set(1, 1, true); gameOfLife.step(); assertEquals(false, gameOfLife.get(1, 1)); } 当我根据在早期阶段决定编写此第一项测试的方式来强制实施设计时,这感觉很奇怪。 以您理解TDD的方式可以吗?我似乎遵循TDD / XP的原则,因为我的测试和实现随着时间的推移随着重构的发展而发展,因此,如果这种最初的设计被证明是无用的,那就可以改变了,但是感觉就像我在向开发者强加一个方向。通过这种方式解决。 人们还如何使用TDD?我可以从没有GameOfLife对象开始,而只有原语和静态方法开始,进行更多的重构迭代,但这似乎太虚构了。

3
使用接口而不是一般约束类型的原因是什么
在支持通用类型参数(也称为类模板和参数多态性,尽管每个名称当然都带有不同含义)的面向对象的语言中,通常可以在类型参数上指定类型约束,以便将其约束从另一种类型。例如,这是C#中的语法: //for classes: class ExampleClass<T> where T : I1 { } //for methods: S ExampleMethod<S>(S value) where S : I2 { ... } 在那些接口所约束的类型上使用实际接口类型的原因是什么?例如,进行方法签名的原因是什么I2 ExampleMethod(I2 value)?

4
有人可以重新许可我的代码,然后起诉我进行分发吗?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 4年前关闭。 假设我已经发布了一些代码,并通过一些极其宽松的许可证(例如unlicense)放弃了该代码的所有版权权益。 公司可以接受我的代码,以专有许可证重新发布它,然后起诉我违反该新许可证吗?

3
我应该使用哪种Java版本的桌面应用程序吸引最多的用户?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我是否可以假设大多数最终用户使用的版本都比Java 8老?由于我不想强迫人们升级以使用我的应用程序,因此我是否应该计划从一开始就使用Java 7甚至6,即使这意味着我不能自己使用较新版本的好处作为开发者?

2
Java有JVM,C有什么?
我知道C具有编译器,但是决定执行性能的是什么? 例如,在一个if else块中,如果代码仅包含所有ifs而不是if elses,怎么确定所有ifs将被运行?在Java中将是JVM,但在C中,执行编译器是什么?
15 java  c 

5
否则-重复代码逻辑
老板给了我一个具有特定逻辑的项目。我必须开发一个网页,该网页必须带领导航员处理很多情况,直到他/她找到产品为止。 这是站点中导航的路径方案: 重要! 在产品页面中,导航器可以选择他想要的过滤器。 如果是A,则他/她必须通过B(然后是C)或C,然后到达产品。 如果是B,则他/她必须经过C并到达产品。 如果为C,则他/她直接到达产品。 当然,如果我从AI开始走的是最长的路,当我到达产品时,我将拥有3个有源滤波器。 到目前为止,我开发了下面的代码,效果很好。 if filter_A if filter_B filter_C() .. else .. else filter_C .. else .. else if filter_B filter_C() .. else .. else filter_C() .. else .. 我在这里问一个更专业的程序员在这种情况下会做什么。我不尊重DRY原理,我不喜欢它,我想知道开发这种逻辑的另一种方法。 我曾考虑过将代码的每个部分拆分为函数,但是在这种情况下,这是一个好主意吗?

3
ref和out在运行时之间有什么区别?
C#提供ref和out关键字,以使参数通过引用传递。两者的语义非常相似。唯一的区别在于标记变量的初始化: ref要求在将变量传递给函数之前进行初始化,out而不是。 out要求变量在函数内部初始化,ref不需要。 这两个关键字的用例也几乎相同,它们的使用频率太高了,我相信这是代码的味道(尽管有诸如TryParse和TryGetValue模式之类的有效用例)。 因此,有人可以解释一下,为什么C#中有两个非常相似的工具用于如此狭窄的用例? 另外,在MSDN上,它们具有不同的运行时行为: 尽管ref和out关键字导致不同的运行时行为,但在编译时它们不被视为方法签名的一部分。 它们的运行时行为有何不同? 结论 这两个答案看起来都是正确的,谢谢你们。我接受jmoreno是因为它更明确。

1
何时在JavaScript中使用原型编程
我花了很多时间通过以下方式为项目开发简单的小部件: var project = project || {}; (function() { project.elements = { prop1: val1, prop2: val2 } project.method1 = function(val) { // Do this } project.method2 = function(val) { // Do that } project.init = function() { project.method1(project.elements.prop1) project.method2(project.elements.prop2) } })() project.init(); 但是我已经开始将格式更改为以下格式: function Project() { this.elements = { prop1: …

3
在项目的第一次迭代中要投入多少细节?
我刚刚开始一个新的个人项目(Python),并且正在编写相当于该程序“草稿”的内容,这是完成我想做的事情的最低要求。我尚未投入大量的错误/异常处理或美观的UI元素(即使在我最终将需要这些东西的情况下),并且该文档仅足以帮助我将来了解自己在做什么。 如此粗糙地违反项目设计/管理的既定原则?我是科学家,而不是程序员,因此无法及时掌握这些信息。因此,主要问题是,是否应该就介于以下两个极端之间的目标达成共识: 从一开始就编写全面,高质量的代码,包括所有异常处理,使您知道最终需要使用。 从一开始就编写一份工作最少的草稿,然后再填写所有细节。 相关问题:什么时候可以牺牲设计的“整洁度”来完成项目?

6
在冲刺中计划扑克的目的是什么?
我们的业务分析师和项目负责人告诉我们客户的故事要求。在每个Sprint计划中,我们(开发人员)都被要求玩计划扑克。 他们要求我们所有人考虑“复杂性”而不是“努力”。我们真的很困惑,我们在浪费时间开会。一位开发人员提出了一个问题:“我们真正要考虑什么?是关于我们在此需求(时间估计)中必须进行的代码/ DDL更改,还是关于我们是否已理解该需求? 但是,他们(业务分析师和项目负责人)真正的含义是“了解需求”并“举起名片”? 另外,我们为各个Scrum团队举行切片会议,每个开发人员都为每个Scrum团队估计完成给定任务的时间。那么,他们在计划扑克中真正谈论的是什么呢? 谁能用一个例子解释一下?当他们说“复杂性”和“努力”时,尝试区分他们真正在谈论什么。
15 agile  scrum  planning 

2
创建REST API错误响应模型和错误代码系统的最佳方法是什么?
我的REST实现将使用以下结构在JSON中返回错误: { "http_response":400, "dev_message":"There is a problem", "message_for_user":"Bad request", "some_internal_error_code":12345 } 我建议创建一个特殊的响应模型,在该模型中,我可以传递所需的属性值(dev_message,message_for_user,some_internal_error_code)并返回它们。在代码中将类似于以下内容: $responseModel = new MyResponseModel(400,"Something is bad", etc...); 此模型应如何显示?是否应该在仅传递文本信息的地方实现例如successResponse()这样的方法,并且那里的代码默认为200?我坚持这一点。这是我的问题的第一部分:我是否需要实现此模型,这是一种很好的做法吗?因为现在,我只是直接从代码返回数组。 第二部分是关于错误代码系统。错误代码将在文档中进行描述。但是我遇到的问题是代码。管理错误代码的最佳方法是什么?我应该在模型中编写它们吗?还是最好创建单独的服务来处理此问题? 更新1 我已经实现了响应的模型类。这类似于格雷格的答案,逻辑相同,但是另外,我在模型中对错误进行了硬编码,这是它的样子: class ErrorResponse { const SOME_ENTITY_NOT_FOUND = 100; protected $errorMessages = [100 => ["error_message" => "That entity doesn't exist!"]]; ...some code... } 我为什么要这样做?那又是为了什么呢? 代码看起来很酷: return new ErrorResponse(ErrorResponse::SOME_ENTITY_NOT_FOUND ); …
15 php  mvc  rest  api 

2
将Apache Software License 2.0应用于项目时,是否需要源文件中的许可证标头?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 关闭 5个月前。 通读Apache Software License 2.0附录,我不清楚现在到底需要做什么: 附录:如何将Apache许可证应用于您的工作 要将Apache许可证应用于您的工作,请附上以下样板声明,并用括号“ []”括起来的字段替换为您自己的标识信息。(不包括方括号!)文本应包含在文件格式的相应注释语法中。我们还建议在与版权声明相同的“印刷页面”中包含文件或类名称以及用途说明,以便在第三方档案中更容易识别。 进一步说明:我目前正在github上的一个开源项目中做出贡献,在该项目中做出了根据ASL2.0进行许可的决定。在最新提交中,许可证文本已添加LICENSE到根目录。 现在最有趣的部分是:要在Apache Software License下完全许可代码,还需要做些什么。具体来说:什么是“工作”?在项目中的每个源文件中都必须包含样板声明吗? 我认为应该可以将通知添加到已经存在的通知中README,就像我在其他开源项目中看到的那样。类似于以下内容: 执照: 除非另有明确说明,否则此存储库中的所有文件均根据Apache软件许可2.0许可[在此处插入样板声明] 我认为应该没问题,因为Apache Source Header政策(即使仅适用于Apache Software Foundation拥有的项目)指出: 每个原始源文档(代码和文档,但不包括LICENSE和NOTICE文件)应在顶部包含一个简短的许可证标头。如果分发中包含CLA,CCLA或软件授权未涵盖的文档(例如第三方库),请参阅策略指南。 每个源文件应包括以下许可证标头-请注意,标头中不应包含版权声明: 具体地说,这里的“应该”让我认为,对于根据ASL许可的项目的每个源文件,每个文件中的许可证标头不是强制性的。

4
编写作为另一个测试的子集的单元测试是否有任何价值?
举一个稍微做作的例子,假设我要测试一个函数返回两个数字,并且第一个小于第二个: def test_length(): result = my_function() assert len(result) == 2 def test_order() a, b = my_function() assert a < b 在这里,如果test_length失败,那么test_order也会失败。编写test_length或跳过是一种最佳实践吗? 编辑:请注意,在这种情况下,两个测试大多彼此独立,每个测试可以独立运行,也可以以相反的顺序运行,这无关紧要。所以这些以前的问题都没有 我应该如何测试在其中使用其他功能的功能的功能? 如果我已经有集成测试,是否需要单元测试? 如何在一个测试是另一测试的设置的地方构造测试? 如何管理单元测试之间的成功依赖关系 与上述内容重复。

2
驯服“实用功能”类
在我们的Java代码库中,我不断看到以下模式: /** This is a stateless utility class that groups useful foo-related operations, often with side effects. */ public class FooUtil { public int foo(...) {...} public void bar(...) {...} } /** This class does applied foo-related things. */ class FooSomething { int DoBusinessWithFoo(FooUtil fooUtil, ...) { if (fooUtil.foo(...)) fooUtil.bar(...); …

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.