软件工程

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

10
如何修复复制/粘贴模式?
在我工作的地方,人们(顾问)感到迫切需要尽快发布功能。因此,不必花太多时间去思考如何正确地做事,或者因为他们不想破坏任何东西,而是从不同的模块复制并修改代码。 要防止这种情况并不容易,因为代码库对整个公司都是开放的。很多人为此工作。 既然现在已经一团糟,那么在不破坏太多冗余的情况下删除这些冗余的最佳方法是什么?

22
您应该在什么时候开始考虑性能?
在构建应用程序时,我发现自己不断在问这是否是执行或实现某些功能的最佳方法。通常,我会在stackoverflow或其他论坛上发布问题,仅希望收到反馈,以便收到有关如何不“把马放到马前”有关性能的评论。大多数程序员在应用程序完成之前是否真的没有考虑性能,还是性能绝对不能接受?我的意思是,我了解开发环境与生产环境不同,您不应该完全依赖开发笔记本电脑的结果...但是,有些实践和技术可以提供比其他产品更好的性能。 在整个开发过程中考虑性能是不好的做法吗?在性能真正下降之前,我应该推迟考虑这些因素吗? 更新资料 明确地说,我是在谈论您正在考虑或即将使用某些功能的情况。您知道有几种实现方法,但是您不确定每个实现的扩展程度。另外,可能还有几种您不熟悉的技术。在较小的规模上,任何一种方法都可能是适当的,但是在较大的规模上,某些方法会跟上,有些则不会。通常,当我征求意见或指导时,答复是:以后再担心...

4
我在哪里可以找到设计练习?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 我觉得继续练习解决问题的技能很重要。编写自己的微型项目是一种方法,但另一种方法是尝试解决在线发布的问题。在线查找有趣的编程测验很容易,这些测验需要应用聪明的算法来解决- 欧拉计画是一个著名的例子。 但是,在许多现实生活中的项目中,软件的设计(尤其是在初始阶段)具有很大的影响力,在后期阶段,它不能像普通算法那样容易地进行调整。为了提高这些技能,我正在寻找设计问题的任何集合。 当我说“设计”时,我指的是软件解决方案的抽象设计-例如,将存在哪些模块以及它们之间的依赖关系是什么,数据如何在程序中流动,什么样的数据需要保存在程序中?设计问题是那些在任何项目的早期阶段都必须解决的关键问题,但解决方案是没有一行代码的白板图。 当然,这类问题没有一个正确的解决方案,但是我对在任何地方都能显示出可用于解决问题的典型解决方案的利弊的地方感到特别满意。

4
贵公司是否有关于为开源项目做贡献的书面政策?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 贵公司是否有关于为开源项目做贡献的书面政策? 我们一直在奉献“不要问不说”的风格,但现在该写下些东西了。完整的保单文字和零碎内容,我将不胜感激。 更新:自从我问了这个问题以来,我们已经取得了一些进展,现在有了这样的政策-请阅读此内容。

5
像Elm所说的那样,拥有“没有运行时异常”有什么好处?
某些语言声称具有“无运行时异常”,这是与具有它们的其他语言相比的明显优势。 我对此事感到困惑。 据我所知,运行时异常只是一种工具,使用得当: 您可以传达“脏”状态(抛出意外数据) 添加堆栈,您可以指向错误链 您可以区分混乱(例如,在无效输入上返回空值)和需要开发人员注意的不安全用法(例如,在无效输入上引发异常) 您可以通过异常消息为错误添加详细信息,从而提供进一步有用的详细信息,以帮助调试(理论上) 另一方面,我发现很难调试“吞噬”异常的软件。例如 try { myFailingCode(); } catch { // no logs, no crashes, just a dirty state } 因此,问题是:拥有“无运行时异常”的强大的理论优势是什么? 例 https://guide.elm-lang.org/ 实际上没有运行时错误。没有空值。没有未定义不是函数。

2
DDD:一个根聚合保留对另一个根聚合的引用是否正确?
遵循域驱动设计(DDD)时,对于根聚合保留对恰好是单独聚合中根实体的内部实体的引用是否正确? 我认为这是不正确的,主要是因为这本关于蓝皮书的规则: 除了根ENTITY,AGGREGATE边界之外的任何内容都不能保存对内部任何内容的引用。根ENTITY可以将对内部ENTITIES的引用传递给其他对象,但是这些对象只能临时使用它们,并且它们可能不会保留引用。根可以将VALUE OBJECT的副本交给另一个对象,它发生什么都没有关系,因为它只是一个VALUE,不再与AGGREGATE有任何关联。 如果一个根聚合包含对另一个根聚合的引用,则违反了前者的边界,并且聚合的整个概念都已损坏,因此我认为,如果一个根聚合看起来像需要保留对另一个根聚合的引用,那么我需要创建一个不同的实体,该实体可能会与另一个根实体共享一些相同的成员,但不会具有全局标识,因为本书中的另一条规则指出: 根实体具有全球性。边界内的实体具有本地身份,仅在AGGREGATE内部具有唯一性。 我相信这将是正确的方法,但是由于它具有重复性和冗余性(当从纯DOP脱离DDD的上下文时),我要求提供一些反馈。

2
编译器是否利用多线程来加快编译时间?
如果我正确地记住了我的编译器课程,那么典型的编译器将具有以下简化的轮廓: 词法分析器逐字符扫描(或调用某些扫描功能)源代码 根据词素词典检查输入字符的字符串是否有效 如果lexeme有效,则将其分类为与其对应的令牌 解析器验证令牌组合的语法;逐个令牌。 从理论上讲,将源代码分成四分之一(或其他分母)并在扫描和解析过程中使用多线程是否可行?是否存在利用多线程的编译器?

2
数据验证:是否是分隔类?
当我有大量需要验证的数据时,我应该仅出于验证目的创建一个新类,还是应该坚持方法内验证? 我的特定示例设想了一个锦标赛和一个事件/类别类:Tournament和Event,它模拟了一个体育锦标赛,每个锦标赛都有一个或多个类别。 这些类别中有很多事情需要验证:球员应该为空,应该是唯一的,每个球员应该参加的比赛数量,每次比赛都有的球员数量,预定义的对决,以及包括许多其他东西在内的非常重要的事情。复杂的规则。 我还需要整体验证某些部分,例如类如何相互集成。例如,对a Player进行单一验证就可以了,但是如果一个事件两次具有相同的玩家,那就是验证错误。 那怎么办呢::使用模型类的设置器和类似方法添加数据时,我完全忘记了任何预检查,而是让验证类来处理。 因此,我们将有类似EventValidator与Event作为成员,和validate()用来验证整个对象的方法,再加上单一的方法来验证所有成员的规则。 然后,在实例化有效对象之前,我将执行验证以防止出现非法值。 我的设计正确吗?我应该做些不同的事情吗? 另外,我应该使用布尔值返回验证方法吗?或者,如果验证失败,则抛出异常?在我看来,最好的选择是布尔返回方法,并在实例化对象时引发异常,例如: public Event() { EventValidator eventValidator = new EventValidator(this); if (!eventValidator.validate()) { // show error messages with methods defined in the validator throw new Exception(); // what type of exception would be best? should I create custom ones? } }
16 java  design  data  validation 

2
** wargs是反模式吗?
我们内部代码库中有很多代码在内部调用我们的库-这些库通常有很多参数(例如matplotlib),我们的代码通常仅执行特定任务,然后将其传递**kwargs给下一个调用的函数。 例如: def our_method(dataframe, **kwargs): result = do_something_with_data(dataframe) external_module.draw(result, **kwargs) 虽然**kwargs阻止了我们重复方法声明中的所有参数,但是这也使得在调用时哪些参数有效是非常不透明的our_method-我必须知道调用哪个方法,而我通常不希望知道。 你对此有什么看法?
16 python 

2
软件开发的增量方法与迭代方法之间有什么区别?
的增量的方法是软件开发的方法,其中所述模型的设计,实现和测试增量(多一点每次加入),直至产品完成。它涉及开发和维护。满足所有要求的产品定义为成品 该迭代设计是基于原型,测试,分析和提炼产品或过程的循环过程设计方法。根据测试设计的最新迭代的结果,可以进行更改和完善。此过程旨在最终改善设计的质量和功能。在迭代设计中,随着设计的连续版本或迭代,与设计的系统进行交互被用作通知和发展项目的研究形式。 似乎这两种方法都涉及创建系统的一部分,对其进行完善以使其通过所有测试用例,添加系统的另一个组件并再次对其进行完善,这些方法会重复进行直到系统完成为止。 这两种软件设计方式的实际区别是什么 如何将这两种方法结合起来形成迭代和增量设计方法

6
了解static关键字
我有一些使用Java,Javascript和PHP开发的经验。 我正在阅读Microsoft Visual C#2010分步教程,我认为这是一本关于向您介绍C#语言的很好的书。 我在理解static关键字时似乎遇到了问题。据我了解,如果将一个类声明为静态,则所有方法和变量都必须为静态。main方法始终是静态方法,因此在类中,main方法存在所有变量,并且如果必须在main方法中调用它们,则将这些方法声明为静态。我还注意到,为了从另一个类调用静态方法,您不需要创建可以使用类名的对象。 但是static关键字的实际目的是什么?什么时候应该声明静态变量和方法?

3
免费软件许可,但源代码封闭的应用程序
我已经开发了一个简单的应用程序,想要免费发布,但是我不打算发布源代码。我希望该应用程序免费提供,但我不希望任何人出售或对其进行反向工程。MIT许可证看上去简单而漂亮,但它也允许任何人出售。是否有适合我的许可证,还是应该只修改MIT许可证?

2
实施DDD:用户和权限
我正在研究一个小型应用程序,试图掌握域驱动设计的原理。如果成功,这可能是一个更大项目的试验。我正在尝试遵循《实现域驱动的设计》(由Vaughn Vernon撰写)一书,并试图实现一个类似的简单讨论论坛。我还在github上签出了IDDD示例。我在采用身份和案件访问权方面遇到一些困难。让我给出一些背景信息: 我(希望)理解了将用户和权限逻辑分开的原因:这是一个支持域,并且是一个不同的有界上下文。 在核心域中,没有用户,只有作者,主持人等。这些是通过使用服务延伸到“身份和访问”上下文,然后将接收到的User对象转换为and主持人而创建的。 以相关角色作为参数调用域操作:例如: ModeratePost( ..., moderator); 域对象的方法检查给定的主持人实例是否不为空(如果从“身份和访问”上下文中询问的用户不具有主持人角色,则主持人实例将为空)。 在一种情况下,它会在更改帖子之前进行另一项检查: if (forum.IsModeratedby(moderator)) 我的问题是: 在后一种情况下,安全性关注点是否不会再次混入核心域?以前,这些书指出“可以与谁一起发布主题,或者在允许的条件下发布。论坛只需要知道作者正在这样做”。 本书中基于角色的实现非常简单:当主持人是核心域时,它会尝试将当前的userId转换为主持人实例,或在需要时将其转换为作者。服务将以适当的实例进行响应;如果用户没有所需的角色,则该服务将为null。但是,我看不到如何适应更复杂的安全模型。我正在尝试的当前项目具有一个包含组,ACL等的相当复杂的模型。 即使规则不是很复杂,例如:“帖子只能由其所有者或编辑者编辑”,但这种方法似乎无法使用,或者至少我看不到实现该方法的正确方法。 通过向Identity and Access上下文询问OwnerOrEditor实例并不适合,我最终会在核心域中得到越来越多与安全性相关的类。另外,我不仅需要将userId传递给安全上下文,还需要将受保护资源的标识符(帖子,论坛等的ID)传递给安全性上下文,该上下文可能不关心这些事情(对吗? ) 通过将权限拉到核心域并在域对象的方法或服务中检查它们,我将得出结论:将安全问题与域混合在一起。 我在某个地方读过(并且我倾向于同意),这些与权限相关的事物不应成为核心域的一部分,除非安全性和权限是核心域本身。像上面给出的那样简单的规则是否足以使安全性成为核心域的一部分?

2
数据库迁移和Azure部署插槽
我打算将新的Web应用程序推送到Azure Web App Service(以前的Azure网站)。我想利用部署插槽来测试我的部署,然后再将其投入生产。只要不需要更改数据库架构就可以了。但是,如果发生模式更改,则不能在同一数据库版本上运行两个软件版本。由于我使用的是EF迁移,因此将其推入暂存插槽将立即导致数据库更新到最新版本。 所以我的问题是,当需要进行数据库迁移时,是否会使用部署槽? 对于大型SaaS提供商,该如何做。他们是否正在使用新版本立即执行数据库迁移?这肯定会导致一些停机时间。 我只能想到解决这个问题的相当复杂的方法,有没有简单的方法?

1
使用gitflow时应该标记发行分支或主分支吗?
此问题表明: 根据我的理解,在合并之前将标签放置在release分支上(而不是在master分支上)实际上是正确的做法,也可以通过develop describe分支的git describe --tags找到它。参见#374 而另一篇文章: 我今天不小心通过自制软件安装了0.4.2-pre版本,并且对标记在该版本中的工作方式感到困惑。先前(版本0.4.1),在将发布分支合并到主分支之后,该标签已在master分支上创建。现在看来,标记是在release分支的最后一次提交上创建的,这对我来说不是一个好主意。特别是如果您有一个依赖git标记的构建系统,并且如果HEAD是带标记的提交则创建发行版本,而如果其以下提交之一则创建开发版本。有人可以向我解释此更改背后的逻辑吗?对于语义版本控制,我不认为这是补丁程序级别的颠簸! 在我们的团队中,我们对此进行了多次讨论。有些表示需要从master分支创建标签,而另一些则倾向于使用release分支。根据gitflow的图片: 好像标签已放置在母版上。
16 gitflow 

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.