软件工程

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

1
“正当的做法”有多少嘲笑?
我开玩笑地为这个问题命名,因为我确定“取决于情况”,但是我有一些具体的问题。 在具有许多深层依赖项的软件中工作时,我的团队已经习惯了使用相当广泛的模拟将每个代码模块与其下的依赖项分开的习惯。 因此,令我惊讶的是Roy Osherove在此视频中建议您仅在5%的时间内使用模拟。我猜我们坐在70-90%之间。我也时常看到其他类似的指导。 我应该定义我认为是“集成测试”的两类,它们是如此不同,以至于它们实际上应该被赋予不同的名称:1)集成多个代码模块的进程内测试;以及2)进行对话的进程外测试。到数据库,文件系统,Web服务等。我关心的是类型#1,这些测试将所有代码模块都集成在进程中。 我阅读的许多社区指南都建议您应该使用大量独立的,细粒度的单元测试,以及少量的粗粒度的端到端集成测试,因为单元测试会为您提供有关确切位置的精确反馈可能已经创建了回归,但是设置繁琐的粗略测试实际上验证了系统的更多端到端功能。 鉴于此,似乎有必要经常使用模拟来隔离这些单独的代码单元。 给定一个对象模型,如下所示: ...还要考虑到我们应用程序的依赖深度比我在该图中适合的深度要深得多,因此在2-4层和5-13层之间有多层N。 如果我想测试在单元#1中做出的一些简单的逻辑决定,并且是否将每个依赖项都构造函数注入到依赖于它的代码模块中,例如将2、3和4构造函数注入到模块1中,图片,我宁愿将2、3和4的模拟物注入1。 否则,我将需要构造2、3和4的具体实例。这可能比仅仅进行一些额外的键入要困难得多。通常2、3和4会有构造器要求,要满足这些挑战可能很困难,根据图(并根据我们项目的实际情况),我将需要构造N到13的具体实例,以满足N的构造器。 2 3 3 当我需要2、3或4以某种方式运行时,这种情况变得更具挑战性,以便我可以测试#1中的简单逻辑决策。我可能需要一次理解整个对象图/树并“在逻辑上进行推理”,以使2、3或4以必要的方式运行。做myMockOfModule2.Setup(x => x.GoLeftOrRight())。Returns(new Right());通常看起来容易得多。当模块2告诉它正确时,测试模块1是否按预期响应。 如果我要一起测试2 ... N ... 13的具体实例,那么测试设置将非常大,并且几乎是重复的。测试失败可能无法很好地指出回归失败的位置。测试不会是独立的(另一个支持链接)。 当然,对底层进行基于状态的测试,而不是基于交互的测试,通常是合理的,因为这些模块很少具有任何进一步的依赖性。但似乎从定义上讲,模拟几乎是必要的,以隔离最底层之上的任何模块。 考虑到所有这些,谁能告诉我我可能会缺少什么?我们的团队过度使用模拟吗?还是在典型的单元测试指南中可能存在一些假设,即大多数应用程序中的依赖层将足够浅,因此测试集成在一起的所有代码模块确实是合理的(使我们的案例“特殊”)?或者,也许是不同的,我们的团队是否没有适当地限制我们有限的环境?

4
为什么Web框架不像编程语言那样简单,优雅且有趣?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 当我想到几乎任何编程语言(例如C,C ++,PHP,SQL,JavaScript,Python,ActionScript,Haskell,Lua,Lisp,Java等)时,我都很棒,我很乐意使用任何一种语言来开发计算机应用程序这些语言。 但是,当我想到Web框架(我大部分都使用PHP)时,例如Cake,CI,Symfony,Laravel,Zend,Drupal,Joomla,Wordpress,Rails,Django等,我就像是上帝。 为什么没有提供像编程语言一样为我提供简单,有趣和强大功能的Web框架?

2
倒计时数字回合问题的名称-算法解决方案?
对于非英国观众,在白天的游戏节目中有一部分,参赛者有一组6个数字和一个随机生成的目标数字。他们必须仅使用算术运算符使用6个数字中的任何一个(但不一定是全部)达到目标数字。所有计算必须得出正整数。 例如:Youtube:倒计时-有史以来最非凡的数字游戏? 有关详细说明,请参见Wikipedia:Countdown(游戏节目) 例如: 竞争者选择6个数字-两个大数字(可能包括25、50、75、100)和四个小数字(数字1 ..10,每个数字在池中包含两次)。 挑号码75,50,2,3,8,7则列出的目标数量812。 一次尝试是(75 + 50-8)* 7-(3 * 2)= 813(这在目标5内的解决方案中得到7分) 准确的答案是(50 + 8)* 7 * 2 = 812(这将获得与目标完全匹配的10分)。 显然,这个问题在电视问世之前就已经存在,但是Wikipedia文章并没有给它起一个名字。我还曾在我上过的一所小学里看过这款游戏,当时该游戏被称为“加密”游戏,属于班际竞赛-但是现在搜索它并没有发现任何问题。 我参加了几次,我的父亲写了一个Excel电子表格企图蛮力的问题,我不记得它是如何工作(只是它没有工作,有什么用Excel的65535行限制),但当然,必须有一个针对该问题的算法解决方案。也许有一种解决方案可以像人类认知一样工作(例如,并行查找“足够接近”的数字,然后选择候选人并执行“较小”的操作)。

6
可选分号
通常,在通用命令式语言中,分号作为语句分隔符是必需的,或者是完全不允许使用的(例如C和Python)。 但是,某些语言(例如JavaScript)允许您选择不使用分号来分隔语句,而支持其他分隔符(例如换行符)。 这背后的设计决策是什么?我知道在同一行上编写多个语句时,分号是必不可少的,但是还有其他理由使分号成为强制性的(除了C之后)?


7
嵌套实体和叶实体属性的计算-SQL或NoSQL方法
我正在从事一个名为“菜单/食谱管理”的业余项目。 这就是我的实体及其关系的样子。 A Nutrient具有属性Code和Value 一个Ingredient具有集合Nutrients 一个Recipe具有的收藏,Ingredients有时也可以具有其他的收藏recipes 一个Meal有一个收集Recipes和Ingredients 一个Menu有集合Meals 关系可以描述为 在其中一个页面中,对于所选菜单,我需要显示根据其成分(膳食,食谱,成分和相应的营养素)计算出的有效营养素信息。 到目前为止,我正在使用SQL Server来存储数据,我正在从C#代码导航链,从菜单的每一餐开始,然后汇总营养值。 我认为这不是一种有效的方法,因为每次请求页面时都会进行此计算,并且成分会偶尔更改。 我在考虑有一个后台服务,该服务维护一个称为MenuNutrients({MenuId, NutrientId, Value})的表,并且在任何成分(餐,菜谱,成分)发生变化时,将使用有效营养素填充/更新该表。 我认为GraphDB非常适合此要求,但是我接触NoSQL的机会有限。 我想知道显示给定菜单营养的这种要求的替代解决方案/方法是什么。 希望我对场景的描述清楚。

5
为桌面应用程序提供“管理员密码”的可能替代方法有哪些?
我目前正在管理和重构已经在我公司使用了十多年的软件。此应用程序的元素之一是一种管理员或高级用户模式,它提供诸如一些附加/内部输入之类的功能以及关闭输入限制的功能。 从历史上看,通过将一个专门命名的文件放置在Windows系统目录中的特定位置(这两个文件都已硬编码到应用程序中)中来打开该模式,即使该文件为空,该文件也被命名为“ something.DLL”。 ASCII文件而不是dll。 因此,我最近添加了一些代码和一些模式形式,允许用户输入管理员密码以启用此功能。这是一个设置的密码,而不是特定于用户的。输入正确的密码后,它会在应用程序的根目录中创建一个“密钥文件”,从而起到类似的作用,以便该程序可以在管理员模式下启动(如果存在该文件)。 现在,该软件主要用于的部门经理不太喜欢这个主意。他认为,如果我们只有一个简单的预设密码,它将很容易“滚蛋”,他不希望没有经验的用户访问这些额外功能。 所以我的问题是,还有什么其他方法可以提供这种访问,这种访问会更加安全?在维护和管理该软件时,几乎只有我一个人,所以几乎没有完全内置或自动化的任何内容都无济于事(例如发送对“许可证密钥”的请求或类似的请求)。 注意:此应用程序是用VB.NET(.NET 4.0)编写的,当前我计划在完成新版本后使用单击一次部署。
10 .net  passwords 

12
“如果重新使用某个方法而不进行更改,将该方法放在基类中,否则创建一个接口”是否是一种很好的经验法则?
我的一位同事想出了一个在创建基类或接口之间进行选择的经验法则。 他说: 想象一下您将要实现的每个新方法。对于它们中的每一个,请考虑以下问题:是否可以由多个类以完全相同的形式实现此方法,而无需进行任何更改?如果答案为“是”,则创建一个基类。在其他所有情况下,请创建一个接口。 例如: 考虑类cat和dog,它们扩展了类mammal并具有一个方法pet()。然后我们添加类alligator,该类不会扩展任何内容并且具有一个方法slither()。 现在,我们要eat()为所有这些方法添加一个方法。 如果实施eat()方法将是完全一样的cat,dog而且alligator,我们应该创建一个基类(比方说,animal),它实现了这个方法。 但是,如果它的实现alligator有丝毫不同,我们应该创建一个IEat接口并制作mammal和alligator实现它。 他坚持认为这种方法适用于所有情况,但对我来说似乎过于简化了。 遵循此经验法则是否值得?

2
在哪里验证依赖于数据库内容的域模型规则?
我正在使用允许管理员定义包含字段的表单的系统。然后,使用定义的表格将数据输入系统。有时,表单是由用户通过GUI填写的,有时,表单是根据另一个系统报告的值来填写的。 对于每个字段,管理员可以定义一个验证规则,以限制该字段的允许值。验证规则可以是“在字段中输入的值必须为True或False”到“在字段中输入的值必须存在于数据库表B的A列中”的任何内容。管理员可以随时更改字段的验证规则。 在这种情况下,您认为最适合验证每个字段正确填写的位置是什么?我目前有两种主要方法: 选项1:在域模型中验证 每个字段对象将包含管理员指定的验证规则。Field对象还将引用IValidator。尝试设置字段的值时,字段会将给定的值和验证规则传递给IValidator。如果给定的值无效,则将在另一个系统的GUI /接口中引发ValidationException并进行适当处理。 优点: 强大的保护功能,防止字段被意外分配违反验证规则的值 缺点: 数据访问层需要能够绕过验证并构造违反当前验证规则的字段。尽管管理员更改了字段的验证规则,但我们仍然需要能够基于旧数据构造Field对象,例如,当渲染多年前填充的表单时。每当我们存储字段时,都可以通过存储当前的验证规则来解决此问题。 在这种设计中,Field模型通过IValidator间接链接到数据访问层/存储库。服务/存储库的领域模型的注入似乎被普遍令人难以接受的。 选项2:在服务中验证 尝试确保所有尝试设置字段值的尝试都通过可确保验证规则成立的服务。如果违反了验证规则,则抛出ValidationException。 当然,当创建以前一直保存在数据库中的字段对象时,数据访问层将不会使用服务。 优点: 不违反“不要将服务/存储库注入您的域模型”的思想。 保留字段时,无需保留当前的验证规则。该服务可以简单地查询该字段的当前验证规则;查看历史记录数据时,字段的值不会更改。 缺点: 不能保证应该使用服务设置字段值的所有逻辑实际上都这样做。我认为这是一个主要缺点。似乎要做的就是有人写“ thisField.setValue(thatField.getValue())”,并且可能会违反thisField的验证规则,而没有人明智。当数据访问层将要保留字段时,可以通过确保字段的值与验证规则匹配来缓解这种情况。 我目前更喜欢选项#1,而不是选项#2,主要是因为我将其视为业务逻辑,并认为选项2带来了将不良数据引入系统的更大风险。您更喜欢哪个选项,或者是否有比上述两个选项更适合这种情况的设计? 编辑(验证的复杂性) 目前出现的验证案例相对简单。字段值必须是例如数字,日期,带时间的日期,或者是数据库列中的现有值。但是,我怀疑复杂性会随着时间逐渐增加。例如,验证解决方案的构建必须考虑国际化-诸如Date之类的内容可能会以特定于语言环境的语法输入。 我现在决定继续使用选项#1,尝试注意不要为域模型分配太多职责。那些面临类似情况的人可能还想查看相关问题分层体系结构中的验证和授权以及数据输入验证-在哪里?多少?。

2
C#编程语言中变量的命名约定
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我正在观看有关变量的C#视频。作者在方法内声明了一个变量,并按如下方式命名:string MyName =“ James”; 我的问题是:.Net Framework建议使用哪种约定。是上面示例中的Pascal机壳,还是骆驼皮?

1
匹配两个字符串,但允许一定程度的错误
如何匹配两个字符串,但同时允许X个字符在匹配中不正确。错误数量应该是一个可控制的变量。 虽然字符串中X个字符的数量不匹配,但是应该限制序列中有多少个字符。给定两个字符串,我可能允许5个字符不同,但不能连续超过2个。 我正在寻找一种推荐的算法来比较这两个字符串,或者也许已经有一个已知的解决方案。

5
C程序员阅读K&R有优势吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 这个问题一直困扰着我,因为我现在正在阅读Kernighan&Ritchie的《 C编程语言(K&R)》,但我遇到了很多,我的意思是很多从未读过C语言的程序员。 因此,我的问题是:阅读K&R有优势吗?应该是必需品吗?
10 c 

3
为什么必须将我的开源软件许可证保留在根目录下?
几乎所有开源软件许可证都要求(或者至少律师通常建议他们要求)用户将完整许可证包含在他们要保护的项目的根目录中。 与我交谈的一位律师建议,这是CD时代的遗产,当时有必要在珠宝盒中包括完整的许可证。 但是今天,我们生活在云时代。例如,为什么我不能简单地在我的网站上托管完整的许可证,而在源文件的标题中包含该许可证的标题+ URL? 奖励:如果大家普遍同意必须在根目录中保留完整的许可证,那么FSF的OSI为什么不批准您可以通过URL引用的许可证,这又是什么使某人无法创建该许可证?

4
如何评估迁移到Team Foundation Server
我的开发团队目前在我们的工作流程中使用以下软件: 吉拉 Bamboo(Atlassian持续集成) Greenhopper(Atlassian敏捷项目管理) 合流 Git,托管在BitBucket上 Visual Studio 2012 如您所见,我们在Atlassian生态系统中投入了大量资金。我们正在考虑转向TFS,以便获得高级Visual Studio集成的优点,例如代码审查,更重要的是Microsoft测试管理器。 我以前在TFS上的经验是在2005或2008年(我不记得了),尽管对我而言,对它的记忆很差,尽管不如我在ClearCase上的经历那么糟糕。 为了正确评估我们向TFS的迁移,我们应该考虑哪些标准?

3
我必须妥协:DRY还是Command-Query-Separation?
我最近正在重构既是命令又是查询方法的方法。 将其分为一个命令方法和一个查询方法后,我发现代码中现在有多个地方可以调用命令,然后从查询中获取值,这似乎违反了DRY原理。 但是,如果我要将通用代码包装到一个方法中,则该方法既是命令又是查询。这可以接受吗?

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.