软件工程

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

5
敏捷MVP(最有价值的播放器/程序员)
最近,我参与了一个敏捷项目(使用Scrum),管理层提出了一个想法,即团队将在每个sprint的末尾提名开发人员“ MVP”和QA“ MVP”。球队。然后,MVP将获得少量金钱奖励,免费午餐以及奖杯,以展示在他的办公桌上。到目前为止,我们已经有了两个冲刺,并且有了这个奖励系统。 我从中看到的好处如下: 已修复了更多错误(这是高层管理人员希望看到的,其所需方向发生了变化) 每个“团队”的MVP都会得到认可并获得自尊心的提升(或者这是自我的提升?) 我已经注意到做这种事情的一些不利方面(至少从开发人员的角度来看): 有一些开发人员非常关注数量,以致错误修复的质量下降了。一个区域的修复导致另一区域的退化。 有一些开发人员正在挑选“更轻松/更快捷”的错误来增加错误数量。我猜这里可能是好是坏。 较高的优先级(很多时候与“更难/更长的修复时间”相关)实际上已变为较低的优先级。 阻塞性缺陷无法及时解决,因为通常它们会花费更长的时间,并且需要与质量保证部门进行更多的协调。 开发团队中的团队方面已丢失。开发人员和质量检查人员在团队合作方面的合作也没有改善,但与以前相比并没有太大改变。 无法轻松识别/跟踪超出错误修复范围或朝着那个数字方向努力。 我确实相信上述每个“坏”问题都可以在一定程度上得到解决,具体取决于团队如何处理每个“坏问题”。 那么我的问题是,有没有人成功完成过类似的事情,您在每个冲刺中都认可了MVP?如果是这样,您认为促成成功的因素是什么?


6
如果模型正在验证数据,那么是否应该在输入错误时抛出异常?
读这个SO问题,似乎不赞成抛出用于验证用户输入的异常。 但是谁应该验证这些数据呢?在我的应用程序中,所有验证都是在业务层完成的,因为只有类本身才真正知道哪些值对其属性中的每个属性都有效。如果我要将用于验证属性的规则复制到控制器,则验证规则可能会更改,并且现在有两个地方需要进行修改。 我以为应该在业务层上进行验证的前提是否错误? 我做的事 因此,我的代码通常最终如下所示: <?php class Person { private $name; private $age; public function setName($n) { $n = trim($n); if (mb_strlen($n) == 0) { throw new ValidationException("Name cannot be empty"); } $this->name = $n; } public function setAge($a) { if (!is_int($a)) { if (!ctype_digit(trim($a))) { throw new ValidationException("Age $a …

7
确保标头明确包含在CPP文件中
我认为,#include对于CPP文件中使用的任何类型的标头,通常都是一种好习惯,无论该HPP文件中已经包含了什么。因此#include <string>,例如,即使在CPP中跳过它,我仍然可以编译,但我可能同时在HPP和CPP中使用。这样,我不必担心我的HPP是否使用前向声明。 是否有任何工具可以强制执行此#include编码样式?我应该执行这种编码样式吗? 由于预处理器/编译器不在乎#include是来自HPP还是CPP,因此如果我忘记遵循这种样式,则不会得到任何反馈。

3
在REST中创建实体关系:我可以通过发布到子ID来创建父关系吗?
我们目前正在设计一种REST API,以访问经典客户数据。API中的元素之一是用户的资产。资产在给定服务下添加。后端API仅会在给定服务下向用户添加资产。因此,没有用户-资产关系,而是用户-[服务]-资产关系。 我们的URI如下所示: /users/{id}/assets/{id}/services/{id} 使用API​​会知道资产ID和服务ID,以创建新条目。我们正在努力的是建立这种关系。 一种简单的方法是将整个关系发布到 /users/{id}/assets/ POST /users/{id}/assets {asset:${id}, service:{id}, attribute1:"{var}", attribute2:"{var}"} 但是我们实际上并不是在创建URI可能表明的资产,而是资产-服务关系。 作为替代方案,我们正在考虑将POST'ing到解决该关系的URI,如下所示: POST /users/{id}/assets/{id}/service/{id} {attribute1:"{var}", attribute2:"{var}"} 但是在这种情况下,资源路径/users/{id}/assets/{id}在POST之前将不存在,并且将被创建为副作用。 是否将POST发送到尚不存在的资源路径? 谢谢你的想法 杰拉德。

6
从未排序数组的范围中检索最大值
我有一个未排序的数组。我在查询中给出一个范围,然后必须返回该范围的最大值。例如: array[]={23,17,9,45,78,2,4,6,90,1}; query(both inclusive): 2 6 answer: 78 我构造了哪种算法或数据结构来快速检索任何范围内的最大值。(有很多查询) 编辑: 这确实是实际问题的简单版本。我可以将数组的大小设置为最大100000,查询数量最多为100000。因此,我绝对需要进行一些预处理,以利于快速查询响应。


1
相关类和接口的命名
我创建了一个ObjectParser类,该类使用IObjectParserDataSource用作数据源将数据解析为强类型对象(数据可以是Excel文件,文本文件,数组,查询字符串等)。 我的实现示例IObjectParserDataSource包括: TextFileObjectParserDataSource ExcelFileObjectParserDataSource 这些类名对我来说真的很长且令人困惑。 我可以给他们起个名字: TextFileDataSource ExcelFileDataSource 但这带来了一定程度的模糊性,IObjectParserDataSource乍一看它们之间并没有那么明显地相关。这一点很重要,因为定义这些数据源将在客户端代码中进行,并且我希望将潜在的混乱和不确定性降至最低。 在这种情况下,您将如何命名这些类?


1
麻省理工学院许可的版权作品版权声明
我们正在考虑在我们的一个Web项目(一个jQuery datetime插件)中使用一些经过MIT许可的开源软件。 MIT许可证的第一行是: 版权(c)[年份] [版权所有者] 如果我们按原样包含插件(不做任何更改),那么我知道我们只需要包含原始作者的许可(尽管js文件顶部的实际版权声明并未指定年份): 版权所有(c)2013 Keith Wood 如果我们对插件进行了更改,版权声明会变成什么? 版权所有(c)2013 Keith Wood,2013年[我的名字/公司名称] 您是否需要包括所有以前的作者,还是有另一种方式处理此类通知?

1
可以改善Damerau-Levenshtein吗?
我最近从Wikipedia上的伪代码实现了Damerau-Levenshtein距离算法。我找不到它是如何工作的任何解释和伪采用完全无信息变量的名称,如DA,DB,i1,和j1我留下抓我的头。 这是我在Python中的实现:https : //gist.github.com/badocelot/5327337 Python的实现帮助我遍历了程序并弄清了正在发生的事情,将变量重命名为更有用的名称。我很熟悉Wagner-Fischer的方法来计算Levenshtein距离,因此有了参考系。 冒着过长的风险,这就是我对Damerau-Levenshtein的理解: 神秘变量: DA(last_row在我的代码中)是一种地图,其中包含每个元素被查看到的最后一行;在我的代码中,这是一个实际的Python字典 DB(last_match_col)保留最后一列,其中输入的字母b与a当前行的输入字母匹配 i1(last_matching_row)是来自DA当前字母的行号b j1只是DB/ 值last_match_col可能被更新之前的副本;在我的代码中,我只是移动了last_match_col更新并消除了此变量的位置 换位成本: H[i1][j1] + (i-i1-1) + 1 + (j-j1-1) 正在计算将当前字符换成已知b的最后一个字符(最后一个匹配项)所花费的费用,将之间的所有字符都视为增加或删除。ba 成本要素: H[i1][j1] 将基本成本还原到转置之前的计算点,因为找到转置会使先前的工作无效 (i-i1-1) 是当前行与匹配当前字符的最后一行之间的距离,这是需要删除的数量 (j-j1-1) 是当前列与具有匹配项的最后一列之间的距离,即相加次数 多余+ 1的只是换位本身的成本 如果此分析不正确,我很想知道我哪里做错了。就像我说的那样,我找不到关于该算法如何在线工作的任何详细说明。 改进版? 已经想通了这一点,虽然,它让我吃惊的是,通过计算成本都增加和调换字母之间的缺失似乎有缺陷的:一个加法和一个删除相当于替代,这,这是不检查。 如果一切正确,那么解决方案应该是微不足道的:转置字母之间的字母成本应为添加和删​​除中的较高者:将尽可能多的字母转换为替换,并添加所有剩余的添加或删除。 因此成本为: H[i1][j1] + max((i-i1-1), (j-j1-1)) + 1 这是该版本的代码:https : //gist.github.com/badocelot/5327427 从一些简单的测试来看,这似乎是正确的。例如,“ abcdef”->“ abcfad”的编辑距离为2(转置“ d”和“ f”,将“ e”更改为“ …


2
如何在C#中封装“全局”变量?/最佳实践
想要改善这篇文章吗?提供此问题的详细答案,包括引文和为什么答案正确的解释。答案不够详细的答案可能会被编辑或删除。 在C#中,封装需要在多种方法中使用的变量的最佳实践是什么?可以简单地在这两个方法上方的类顶部声明它们吗? 另外,如果我从配置文件中使用应用程序设置,是否应该使用吸气剂?像这样... private string mySetting{ get { return WebConfigurationManager.AppSettings["mySetting"]; } } 什么是最佳做法?


4
春季-对配置感到困惑吗?
我读过Spring的某个地方为配置提供了便利。但是Spring人员在配置方面带来了很多变化,以至于我现在真的很困惑使用xml配置或注释。 我希望有人建议使用xml和批注的surefire方法或经验法则。 SO上的示例表明,像我这样的许多初学者对配置感到困惑。 链接1 我似乎并没有掌握<context:annotation-config>and 背后的功能<context:component-scan>。 从我阅读的内容来看,它们似乎处理不同的注释(@ Required,@ Autowired等与@ Component,@ Repository,@ Service等),但从我阅读的内容来看,它们注册了相同的bean后处理器类。 更让我感到困惑的是annotation-config,<context:component-scan>... 连结2 我仍然有组件扫描标签: <context:component-scan base-package="com.mycompany.maventestwebapp" /> 但是我还有另一个标签(看起来有类似的任务),这个标签是: <annotation-driven /> 这两个标签有什么区别?另一个“奇怪”的事情是,前面的示例(不使用注释驱动的标签)与使用Spring MVC Template项目的STS创建的项目非常相似,但是如果我从其配置中删除了注释驱动的标签,文件项目无法运行,并给我以下错误:HTTP状态404 -... Spring 3.2不再需要cglib进行代理,但是较低版本使用cglib。引用springsource博客 为了生成此类代理,Spring使用了名为cglib的第三方库。不幸的是,该项目不再活跃。在Spring 3.2中,默认情况下很有可能Spring将使用Javassist代替。 这些足以表明Spring是对配置的困惑吗?
9 java  spring 

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.