问题标签 [yagni]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
solid-principles - 编写只做一件事并做好的程序
我可以通过封装、依赖注入、最少知识原则和你不需要它来掌握“做一件事”的部分;但是我如何理解第二部分“做好”?
给出的一个例子是完整性的概念,在同一篇 YAGNI 文章中给出:
例如,在允许添加项目、删除项目或修改项目的功能中,完整性也可用于推荐“重命名项目”。
但是,我发现这样的推理很容易被滥用到功能蠕变中,从而违反了“做一件事”部分。
那么,什么是查看某个功能属于“做得好”类别(因此,将其包含到函数/类/程序中)或其他“做一件事”类别(因此,排除它)的试金石?
第一部分“做一件事”最好通过 UNIX 的ls
命令来理解,作为一个反例,因为它包含过多的标志来格式化其输出,这些标志应该完全委托给另一个外部程序。但是我没有一个很好的例子来看到第二部分“做得好”。
什么是一个很好的例子,删除任何进一步的功能会使其“做得不好”?
c# - 使用设计模式 (IOC) 替换 Enum 开关
我有一个事件处理程序,它接收一个 eventargs 对象,该对象是一个枚举值,可以进一步细化里面的信息。它看起来像
Statusdata 是一个基础抽象类,它根据给定的 CalllbackType 进行更改。
现在处理事件的代码看起来类似于
问题是,如果我们更改 StatusNotifications 或想要更改它们的处理方式,我们必须调整可能变得非常大的开关,我正在考虑使用允许我为任何给定状态注入处理程序的东西。
另一方面,我现在真的不需要它。交换机解决方案有效,但它开始变大,所以我在我认为它不可维护和 YAGNI 之间进行斗争。
是否有任何模式可以将这种开关转换为 IOC 模式?你认为我真的应该费心重构那个开关吗?
zend-framework - Zend_Validate 避免代码重复的好策略
我目前正在构建两个扩展的自定义验证器,Zend_Validate_Abstract
它们分别命名Lib_Validate_TimeAfter
为Lib_Validate_TimeBetween
. 名称非常简单,第一个用于测试日期/日期时间/时间是否在另一个之后,第二个用于测试日期/日期时间/时间是否位于其他两个日期/日期时间/时间之间。
这两个验证器都将依赖于名为的相同方法,该方法_buildDate($value)
采用 a datestamp
、 a hourstamp
(hh:mm
或 hh:mm:ss
)、 atimestamp
或 an形式的值ISO_8601 timestamp
并将其转换为可用的日期格式。
由于我不想重复自己并在我的两个验证器中复制/粘贴该方法,我一直在寻找最好的方法来做到这一点。
我现在正在研究的途径是开发某种我的验证器可以使用的类助手(一种混乱的做事方式,因为它添加了不必要的依赖项),或者我可以通过构建一个添加另一个抽象层验证日期/日期时间/时间的其他验证器,然后扩展我的两个验证器,因为我可以共享该方法_buildDate($value)
,但是我认为我真的不需要验证器。
那么,什么是构建这种代码以避免重复(DRY)的好方法(我并不是真的在寻找“众神之道”做事)?
spring - KISS & 设计模式
我需要重写旧的遗留桌面应用程序。它是一个小型的非 Java 桌面程序,仍然支持多个内部用户社区的日常任务。
应用程序已过时且不再受支持的语言。我是初级开发人员,我需要重写它。为了避免应用程序重写陷坑,我计划开始使用现有的数据库和数据结构(有一些重大限制,但与重构一样痛苦,这种方法将更快地完成初始工作,并且避免迁移,这两者都是成功的关键)。
我的挑战是我对保持简单的概念非常矛盾。我知道这是在谈论功能,而不是设计。但是当我打算编写这个应用程序时,似乎在坚持良好(但非“四人组”)的情况下,可能会花费大量时间来追踪设计模式(特别是我真的在依赖注入方面苦苦挣扎)设计可以更快、更简单地完成工作。
这个应用程序会成长并存在很长时间,但它永远不会成为一个拥有 400 万行的企业庞然大物,并且它的对象不会被另一个应用程序使用(是的,我知道,但是如果......YAGNI !)。
问题
KISS 是否适用于建筑和设计?“稍后重构”规则是否可以扩展到说,例如,“我们稍后会回来进行依赖注入”,或者如果项目没有融入所有所谓的关键,那么项目是否注定要失败立即支持框架?
我想“正确”地做到这一点......但它也必须完成。如果我让它太复杂而无法完成,无论设计如何,它都会失败。
design-principles - YAGNI 和 KISS 原则有什么区别?
显然 YAGNI 和 KISS 之间存在语法差异,但我看不出它们之间有任何语义差异。它们在本质上真的是一样的吗?
design-patterns - 调和 YAGNI 与远见的悖论
我参加了一些课程并阅读了有关 YAGNI 的目的。但是,这个原则作为一个整体从来没有让我满意。它引入了一个逻辑悖论。
作为一个假设,您正在设计一个打算向前扩展的框架。YAGNI(可能还有 TDD)会鼓励你专注于现在。让它适用于您可预见的硬件。毕竟,对未来的要求是模糊的,而且是在未来。
但是,这从本质上限制了您的框架的可行性。在这个假设中,你有先见之明,知道未来会怎样。做一些原型设计和提前工作可能值得你花时间,因为知道它可以很好地帮助你。毕竟,框架的本质是促进跨环境的某些功能——那么你如何设计一个框架并严格遵守 YAGNI 原则?
我不确定我是否要求提供关于“如何使用 YAGNI”的具体内容——我知道它可能比这更具哲学意义。我可能只是在询问业内经验丰富的开发人员,YAGNI、对立原则和最佳实践之间的界限在哪里。YAGNI 是否被强制执行?它甚至被视为?或者这只是我们学校教给我们的东西,因为它在我们的书中?
谢谢。
solid-principles - OCP 和 DIP 会破坏 YAGNI 吗?
据我了解YAGNI
,只有在需要时我们才需要提取接口。因此,如果我们不需要多态性并且现在只有一个实现,我们就不需要使用接口。但是DIP
说:
A. 高级模块不应该依赖于低级模块。两者都应该依赖于抽象。
B. 抽象不应该依赖于细节。细节应该取决于抽象。
看起来YAGNI
和选项 B之间存在一些差异DIP
。此外,如果我们想要应用OCP
,我们需要反转依赖关系的控制并提取抽象,以便能够在不修改该类型的情况下扩展一个类型。
此外,一些技术需要提取抽象才能对类型客户端进行单元测试。但是例如在java中我们不需要它。所以我想知道如果我现在只有一个实现,是否需要提取抽象?
design-patterns - YAGNI 原则应用于设计模式的意义何在?
我最近阅读了“Head First Design Patterns”。这本书写得很好,值得一读。它通常通过首先介绍一个问题和一个非常“幼稚”的问题解决方案来开始每一章。在接下来的页面中,提出了更多要求和约束,例如添加更多功能或更新行为。这本书再次提供了更新的“幼稚”方法。在某种程度上,当“幼稚”的方法弄乱了解决方案(事情开始出错)时,这本书会驱使读者采用一种全新的方法——目标设计模式。
在其他地方,我学到了一个缩写为“YAGNI”的原则,你不需要它,它指出“总是在你真正需要的时候实施,永远不要在你预见到你需要它们的时候实施。”
我现在想知道,关于“YAGNI”原则,“Head First Design Patterns”是否以无意义的方式解释事物?因为,在某种程度上,给定一组要求,我们应该为问题寻找最简单和最干净的解决方案,对吧?
java - 在java中实现简单计算器的设计原则
我在 java 中有简单的计算器代码,需要在这个 Calcualtor 程序上实现 solid、kiss、dry 和 yagin 原则。