软件工程

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

7
在业务逻辑中引用数据库值
我想这是关于硬编码和最佳实践的另一个问题。假设我有一个值列表,可以说是水果,存储在数据库中(它必须在数据库中,因为该表用于其他目的,例如SSRS报告),其ID为: 1 Apple 2 Banana 3 Grapes 我可以将它们呈现给用户,他选择一个,将其作为FavouriteFruit存储在他的个人资料中,并将ID存储在他的数据库记录中。 当涉及到业务规则/域逻辑时,将逻辑分配给特定值的建议是什么。假设用户选择了葡萄我想执行一些额外的任务,那么引用葡萄值的最佳方法是什么: // Hard coded name if (user.FavouriteFruit.Name == "Grapes") // Hard coded ID if (user.FavoriteFruit.ID == 3) // Grapes // Duplicate the list of fruits in an enum if (user.FavouriteFruit.ID == (int)Fruits.Grapes) 或者是其他东西? 当然,由于FavouriteFruit将在整个应用程序中使用,因此可以将列表添加或编辑。 有人可能会决定将“葡萄”重命名为“葡萄”,这当然会破坏硬编码的字符串选项。 硬编码的ID尚不完全清楚,如图所示,您可以添加注释以快速识别它是哪个项目。 枚举选项涉及从数据库中复制数据,这似乎是错误的,因为它可能不同步。 无论如何,在此先感谢您的任何意见或建议。
43 design 

8
自动还原失败的提交
我的一位同事告诉我,他正在考虑使我们的CI服务器还原失败构建的提交,因此HEADin master始终是稳定的(至少在通过构建时如此)。 这是最佳实践master吗?还是比在开发人员修复它之前让它崩溃更成问题? 我的想法是,还原提交会使读取提交和修复的任务变得更加复杂(开发人员必须先还原还原,然后提交修复,这也会使混乱git log),我们应该离开提交然后提交固定。尽管我看到了master稳定的优点,但是这种失败提交的还原并不能说服我。 编辑:不管是master开发分支还是其他任何开发分支都没有关系,但问题仍然存在:CI系统是否应还原使构建失败的提交? 另一个(冗长)编辑:好的,我们git以一种奇怪的方式使用。我们认为,分支的概念与真实CI背道而驰,因为提交分支会使您与其他开发人员及其更改隔离开来,并在您不得不重新集成分支并处理可能的冲突时增加了时间。如果每个人都致力于master此冲突,则将冲突减至最少,并且每次提交均通过所有测试。 当然,这迫使您只推稳定(或破坏构建)并更仔细地编程,以免在引入新功能时破坏向后兼容性或进行功能切换。 以此方式进行CI时需要权衡取舍,但这超出了问题的范围(有关此问题,请参阅相关问题)。如果您愿意,我可以改写这个问题:一小群开发人员在功能分支中一起工作。如果一个开发人员提交的内容破坏了该分支的构建,则CI系统是否应还原提交?

2
了解Visual Studio Community Edition许可证
最近,Microsoft发布了Visual Studio的免费版本:Visual Studio Community Edition 执照上说 如果您遵守这些许可条款,则您拥有以下权利。 安装和使用权。 一种。个人许可证。如果您是一个人,正在处理自己的应用程序以进行销售或用于其他目的,则可以使用该软件来开发和测试这些应用程序。 b。组织许可证。如果您是组织,则用户可以按以下方式使用该软件: ·您的任何数量的用户都可以使用该软件来开发和测试根据Open Source Institute(OSI)批准的开源软件许可发布的应用程序。 ·您的任何数量的用户都可以使用该软件来开发和测试您的应用程序,作为在线或面对面的课堂培训和教育或进行学术研究的一部分。 ·如果以上都不适用,并且您也不是企业(定义如下),那么最多有5位个人用户可以同时使用该软件来开发和测试您的应用程序。 ·如果您是一家企业,则您的员工和承包商不得使用该软件来开发或测试您的应用程序,但上述允许的开源和教育目的除外。“企业”是指拥有(a)250台PC或用户或(b)年收入超过100万美元(或等值的其他货币)的任何组织及其关联公司,而“关联公司”是指控制(通过多数所有权),由组织控制或受组织共同控制的实体。 C。演示使用。以上允许的用途包括在演示您的应用程序时使用该软件。 d。备份副本。您可以为该软件制作一份备份副本,以重新安装该软件。 作为“个人”,我对子句“ a”感兴趣,但是它并不那么明确。对我来说,这听起来有点限制性,因为它没有涵盖广泛的用途(开源,自由职业,对您不拥有的应用程序的贡献等),这种混淆完全来自句子中的“ OWN ”一词,我可能会误解整个事情,因为英语不是我的母语。那么,您将如何解释这句话?如果许可证中没有明确说明,我们是否可以假定可以使用软件,例如,“ b”子句中的“企业”,例如“不允许在此版本或该版本中使用它”?

7
什么时候不应用依赖倒置原则?
我目前正在尝试弄清SOLID。因此,依赖倒置原则意味着任何两个类都应该通过接口而不是直接进行通信。示例:如果class A有一个方法,该方法需要一个指向类型的对象的指针class B,则该方法实际上应在一个类型为对象的对象abstract base class of B。这对打开/关闭也有帮助。 如果我理解正确,那么我的问题是将其应用于所有类交互是一种好习惯还是应该尝试从层次上考虑? 我对此表示怀疑是因为我们为遵循这一原则付出了一些代价。说,我需要实现feature Z。经过分析,我的结论是功能Z包含的功能A,B和C。我创建了一个门面类Z,即,通过接口,使用类A,B和C。我开始编码的实施,在某些时候我意识到,任务Z实际上是由功能性A,B和D。现在,我需要取消C界面,C类原型并编写单独的D界面和类。如果没有接口,则只需要替换该类。 换句话说,要更改某些内容,我需要更改1.调用者2.接口3.声明4.实现。在python直接耦合的实现中,我只需要更改实现。

3
我应该如何为(主要是)废弃的GitHub项目做出贡献?
我最近一直在尝试在GitHub中进行开源协作,并且遇到了一种情况,我对此感到好奇,这是首选的处理方式。 大约一个月前,我在GitHub上找到了一个项目库,该项目已经使用了一段时间,并且在其中找到(并修复了)一些错误。 作为与GitHub合作的最初尝试,我发现该回购似乎是最近活动量最大,修复了一个错误,添加了单元测试,推送到GitHub并发出请求的仓库。在几个小时内,我分叉的仓库的维护者接受了PR,并合并了其他也在等待中的PR。 受此刺激,我修复了另外三个bug,分别在我自己的repo的单独分支中,并分别提交了问题和请求请求。 那是一个多月前的事,从那以后,请求就一直没有动过。我分叉的存储库的用户似乎并不活跃,在过去的一年中,他在GitHub上总共贡献了7次,并且自从我提出第一个请求请求以来,该存储库就没有任何提交。 所以我的问题是: 在这种情况下如何进行?理想情况下,我想避免关闭库并在我自己的存储库中进行一堆未合并到父存储库中的更改来避免造成数据库碎片。尽管如此,我仍想继续进行错误修复并添加功能,但是如果我将所有内容合并到我的master分支中,并基于该分支建立所有新的修复程序,那么如果我分叉的仓库的维护者回来了,我就赢了。无法针对每个功能/错误修复将所有更改拆分为单独的拉取请求(我已经阅读到,拉取请求通常应该是每个功能或错误修复的一个拉取请求)。 我应该保留一个与原始存储库保持一致的分支,将所有新分支作为该分支的基础,然后将所有提交合并到我的主分支中吗?每次我需要将新更改合并到我的主分支中时,这似乎将给我留下大量的分支和越来越繁重的任务。 应对这种情况的典型方式是什么?在原始贡献者不在的情况下,一个项目将被放弃而无法审查新的请求请求,这似乎很普遍。是在这种情况下,有人应该承担起并掌舵吗?如果原始贡献者再次回来并希望再次从事该项目,则似乎会造成碎片。

2
排序算法“稳定”是什么意思?
在阅读有关各种排序算法的文章时,我已经看到它提到有些是“稳定的”,有些不是。这是什么意思,选择算法时要在此基础上进行哪些权衡?
43 sorting 

1
程序员为什么要使用Acme作为包,名称空间或目录名称
这可能不是愚蠢的问题,但我真的很想知道困扰我一段时间的事情的答案。 我经常看到编程示例/约定,程序员在其中创建了一个目录,acme用于放置内容。 什么Acme意思 为什么选择Acme而不选择Emca或其他? Acme是否像用于将其他OOP类分组的通用文件夹名称? 根据编程约定,该术语从何而来。据我所知,它与程序员的用户界面无关http://plan9.bell-labs.com/sys/doc/acme.html


5
MVC的劣势是什么?[关闭]
自多年前开始真正组织代码以来,我一直在使用MVC / MV *。我使用它已经很久了,以至于我什至无法想到其他任何方式来构造我的代码,而成为实习生后我做的每一项工作都是基于MVC的。 我的问题是,MVC的劣势是什么?在什么情况下,MVC对项目来说是一个错误的选择,那么(更多)正确的选择是什么?当我查找MVC替代方案时,几乎每个结果都是不同类型的MVC。 为了缩小范围,使之不会关闭,对于Web应用程序来说。我确实在不同项目的后端和前端上工作,所以我不能只说前端或后端。

7
您如何跟踪团队编写的类和职能?
在编写代码时,我遇到了许多与队友一样的挑战,并且编写了一些有用的函数和类,它们也是如此。如果能保持良好的沟通,我会听说有人将一些很棒的东西组合在一起,六个月后,当我需要它时,我可能会记住它并调用该函数,从而节省了时间。如果我不记得它,或者从不知道它,我可能会重新发明轮子。 是否有记录此类事情的特殊实践?您如何使它们容易找到? 如果您的团队没有这样的文档,您如何查找车轮是否已经存在? 编辑: 到目前为止,除了一个答案以外,所有答案都与理想情况有关。因此,让我总结一下这些解决方案:文档和通讯;这些都是很棒的事情,但是它们依赖于程序员有时间(和技能)来编写文档,参加会议,做笔记并记住一切。 到目前为止,最流行的答案(Caleb答案)是程序员无法使用的唯一答案,它没有文档和会议的能力,并且只做一件事:编程。编程是程序员的工作,是的,一个优秀的程序员可以编写文档,进行单元测试等,但是让我们面对现实吧-我们大多数人都喜欢编程而不是文档。他的解决方案是程序员识别可重用的代码并将其拉到其自己的类或存储库等中,并且由于它是孤立的,因此变得可查找并简化了使用它的学习曲线。这是通过编程来完成的。 从某种角度来说,我是这样看的:我刚刚编写了三个函数,我想到其他人应该也了解它们。我可以记录它们,编写它们,在会议上宣布它们,等等。-我可以做,但是这不是我的强项-或....我可以将它们提取到一个类中,命名好,使它们像一个黑盒子,然后将其粘贴到其他类文件所在的位置。然后,一封简短的电子邮件宣布它很容易。其他开发人员可以扫描代码并更好地理解代码,而不是使用他们无法完全理解的代码中使用的隔离功能-删除上下文。 我之所以喜欢它,是因为这意味着拥有一组具有良好名称的类文件以及具有良好名称的方法,是一个很好的解决方案,可以通过良好的编程来实现。它不需要开会,并且可以减轻对详细文档的需求。 在这种情况下,还有其他想法吗……针对孤立的且时间紧迫的开发人员?

13
我的故事点数比平均水平高4-5倍,但错误产生率却是平均水平的一半。图说它的错误多出2倍,如何处理?
因此,通常公认的是,顶级程序员可以比普通程序员产生更多/更好的代码。 人们也普遍认为,对于程序员而言,代码中的错误率相对恒定。 相反,它倾向于受到编写代码时和编写代码后使用的过程的影响。(据我了解)人类倾向于以相当恒定的速度犯错误-更好的程序员只会注意到更多的错误,并且会更快地解决它们。 请注意,以上两个断言都来自史蒂夫·麦康奈尔(Steve McConnell)的Code Complete,因此这不是不同观点的问题。 因此,我最近开始在代码中看到这一点。我可以像其他同等人(以团队估计的故事点来衡量)的代码量提高大约4-5倍,并且质量更高(基于性能指标和签入后所做的更改数量)。但是我仍然会犯错误。在进行更好的单元测试,更好地理解代码的功能以及更好地了解代码审查时的问题之间,我没有产生4-5倍的错误数。 但是我仍然产生的质量保证发现的错误是我团队中其他开发人员的两倍。您可能会想到,这会导致非技术人员进行度量标准测量时出现一些问题(请参阅:我的老板)。 我试图指出,我的错误产生率是同龄人的一半(并且修复了两倍),但是当图表显示我产生的错误数目却是两倍时,这是很难的。 那么,如何应对生产率提高会导致错误数量增加这一事实呢?

2
为什么(或为什么不这样)存在性类型在函数式编程中被认为是不好的做法?
我可以使用哪些技术来一致地重构代码,以消除对存在类型的依赖?通常,这些用于取消您不希望使用的类型的构造的资格,并允许在对给定类型有最少了解的情况下进行消耗(或者我的理解是这样)。 有没有人想出一种简单而一致的方法来消除对代码中这些内容的依赖,而这些代码仍然保留了一些好处?还是至少有任何一种滑入抽象的方式,使得它们可以删除而无需大量的代码改动来应对这种变更? 您可以在此处阅读有关存在性类型的更多信息(“如果您敢..”)。

7
非FP人员可以理解少量的函数式编程吗?[关闭]
案例:我在一家公司工作,用Python编写一个处理数组中大量数据的应用程序。我目前是该程序的唯一开发者,但将来(1-3年)可能会被其他一些程序员使用/修改/扩展,目前我还不知道。那时我可能不会在那里直接提供帮助,但是如果有时间的话,也许可以通过电子邮件提供一些支持。 因此,作为一个学习过函数式编程(Haskell)的开发人员,我倾向于解决例如以下过滤问题: filtered = filter(lambda item: included(item.time, dur), measures) 其余的代码是OO,这只是我想解决的一些小案例,因为根据我的说法,它更简单,更漂亮。 问题:今天可以编写这样的代码吗? 没有编写/学习FP的开发人员如何对这样的代码做出反应? 可读吗? 可以修改吗? 我是否应该写文件给孩子解释该行的用途? # Filter out the items from measures for which included(item.time, dur) != True 我问过我的老板,他只是说“ FP是黑魔法,但如果它有效并且是最有效的解决方案,那么可以使用它。” 你对此的看法如何?作为非FP程序员,您如何应对代码?代码是“ googable”的,这样您可以了解它的作用吗?我希望收到反馈。

8
如何为动态的,大小不受限制的“迷宫”构建数据结构?
我实际上不确定“迷宫”是否是正确的术语。基本上,用户从一个Room具有4个门(N,S,E和W)的单个门开始。它们可以向任何方向移动,每个后续房间都包含另一个房间,该房间的其他任何地方都具有1至4个门口。 “迷宫”的大小应该是无限的,并且随着房间的移动而增长。Rooms可用数量有限,但是可用数量是动态的并且可以更改。 我的问题是,我不确定这种模式的最佳数据结构 我最初想到的只是使用[X] [X] Room对象数组,但我真的宁愿避免这样做,因为该对象应该沿任何方向生长,并且只应构建“已访问”的房间。 另一个想法是让每个Room类包含RoomN,S,E和W的4个链接属性,并且仅链接到前一个Room,但是问题是我不知道如何识别用户是否进入了一个有一个相邻的房间已经“建造” 例如, ------------- | | | | 开始5 4 | | | | ---- ------------- --- --- | | | | | | | 1 2 3 | | | | | | --------------- 如果用户从“开始”>“ 1”>“ 2”>“ 3”>“ 4”>“ 5”移动,则Room#5需要知道W包含起始房间,S是房间#2,在这种情况下不可用,N可以是新的Room或一堵墙(一无所有)。 也许我需要混合使用阵列和链接的房间,或者也许我只是看错了方向。 是否有更好的方法为这种“迷宫”构建数据结构?还是我在目前的思维过程中步入正轨,而只是缺少一些信息? (如果您有兴趣,该项目是一个与Munchkin Quest非常相似的游戏)

2
建议的“达到请求限制”的HTTP REST状态代码
我正在整理一个REST服务的规范,其中的一部分将包含在整个服务范围内以及一组资源或单个资源上限制用户的功能。同样,这些超时可以按资源/组/服务进行配置。 我只是在浏览HTTP 1.1规范,并试图决定如何与客户端通信,因为请求已达到极限,因此无法满足请求。 最初,我认为客户端代码403 - Forbidden就是这样,但从规范中可以看出: 授权将无济于事,不应重复请求 困扰着我 实际上似乎503 - Service Unavailable是一种更好的用法-因为它允许通过使用Retry-After标头来传递重试时间。 将来我可能会希望通过电子商务支持“购买”更多的请求(在这种情况下,如果客户端代码402 - Payment Required已完成,那就太好了!)-但我认为这也同样可以被压缩为503响应。 您认为我应该使用哪个?还是有我没有考虑过的另一个?

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.