问题标签 [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.

0 投票
5 回答
889 浏览

solid-principles - 编写只做一件事并做好的程序

我可以通过封装、依赖注入最少知识原则你不需要它来掌握“做一件事”的部分;但是我如何理解第二部分“做好”?

给出的一个例子是完整性的概念,在同一篇 YAGNI 文章中给出:

例如,在允许添加项目、删除项目或修改项目的功能中,完整性也可用于推荐“重命名项目”。

但是,我发现这样的推理很容易被滥用到功能蠕变中,从而违反了“做一件事”部分。

那么,什么是查看某个功能属于“做得好”类别(因此,将其包含到函数/类/程序中)或其他“做一件事”类别(因此,排除它)的试金石?

第一部分“做一件事”最好通过 UNIX 的ls命令来理解,作为一个反例,因为它包含过多的标志来格式化其输出,这些标志应该完全委托给另一个外部程序。但是我没有一个很好的例子来看到第二部分“做得好”。

什么是一个很好的例子,删除任何进一步的功能会使其“做得不好”?

0 投票
3 回答
2157 浏览

c# - 使用设计模式 (IOC) 替换 Enum 开关

我有一个事件处理程序,它接收一个 eventargs 对象,该对象是一个枚举值,可以进一步细化里面的信息。它看起来像

Statusdata 是一个基础抽象类,它根据给定的 CalllbackType 进行更改。

现在处理事件的代码看起来类似于

问题是,如果我们更改 StatusNotifications 或想要更改它们的处理方式,我们必须调整可能变得非常大的开关,我正在考虑使用允许我为任何给定状态注入处理程序的东西。

另一方面,我现在真的不需要它。交换机解决方案有效,但它开始变大,所以我在我认为它不可维护和 YAGNI 之间进行斗争。

是否有任何模式可以将这种开关转换为 IOC 模式?你认为我真的应该费心重构那个开关吗?

0 投票
2 回答
145 浏览

zend-framework - Zend_Validate 避免代码重复的好策略

我目前正在构建两个扩展的自定义验证器,Zend_Validate_Abstract它们分别命名Lib_Validate_TimeAfterLib_Validate_TimeBetween. 名称非常简单,第一个用于测试日期/日期时间/时间是否在另一个之后,第二个用于测试日期/日期时间/时间是否位于其他两个日期/日期时间/时间之间。

这两个验证器都将依赖于名为的相同方法,该方法_buildDate($value)采用 a datestamp、 a hourstamphh:mmhh:mm:ss)、 atimestamp或 an形式的值ISO_8601 timestamp并将其转换为可用的日期格式。

由于我不想重复自己并在我的两个验证器中复制/粘贴该方法,我一直在寻找最好的方法来做到这一点。

我现在正在研究的途径是开发某种我的验证器可以使用的类助手(一种混乱的做事方式,因为它添加了不必要的依赖项),或者我可以通过构建一个添加另一个抽象层验证日期/日期时间/时间的其他验证器,然后扩展我的两个验证器,因为我可以共享该方法_buildDate($value),但是我认为我真的不需要验证器。

那么,什么是构建这种代码以避免重复(DRY)的好方法(我并不是真的在寻找“众神之道”做事)?

0 投票
2 回答
573 浏览

spring - KISS & 设计模式

我需要重写旧的遗留桌面应用程序。它是一个小型的非 Java 桌面程序,仍然支持多个内部用户社区的日常任务。

应用程序已过时且不再受支持的语言。我是初级开发人员,我需要重写它。为了避免应用程序重写陷坑,我计划开始使用现有的数据库和数据结构(有一些重大限制,但与重构一样痛苦,这种方法将更快地完成初始工作,并且避免迁移,这两者都是成功的关键)。

我的挑战是我对保持简单的概念非常矛盾。我知道这是在谈论功能,而不是设计。但是当我打算编写这个应用程序时,似乎在坚持良好(但非“四人组”)的情况下,可能会花费大量时间来追踪设计模式(特别是我真的在依赖注入方面苦苦挣扎)设计可以更快、更简单地完成工作。

这个应用程序会成长并存在很长时间,但它永远不会成为一个拥有 400 万行的企业庞然大物,并且它的对象不会被另一个应用程序使用(是的,我知道,但是如果......YAGNI !)。

问题

KISS 是否适用于建筑和设计?“稍后重构”规则是否可以扩展到说,例如,“我们稍后会回来进行依赖注入”,或者如果项目没有融入所有所谓的关键,那么项目是否注定要失败立即支持框架?

我想“正确”地做到这一点......但它也必须完成。如果我让它太复杂而无法完成,无论设计如何,它都会失败。

0 投票
2 回答
3941 浏览

design-principles - YAGNI 和 KISS 原则有什么区别?

显然 YAGNI 和 KISS 之间存在语法差异,但我看不出它们之间有任何语义差异。它们在本质上真的是一样的吗?

0 投票
1 回答
272 浏览

design-patterns - 调和 YAGNI 与远见的悖论

我参加了一些课程并阅读了有关 YAGNI 的目的。但是,这个原则作为一个整体从来没有让我满意。它引入了一个逻辑悖论。

作为一个假设,您正在设计一个打算向前扩展的框架。YAGNI(可能还有 TDD)会鼓励你专注于现在。让它适用于您可预见的硬件。毕竟,对未来的要求是模糊的,而且是在未来。

但是,这从本质上限制了您的框架的可行性。在这个假设中,你有先见之明,知道未来会怎样。做一些原型设计和提前工作可能值得你花时间,因为知道它可以很好地帮助你。毕竟,框架的本质是促进跨环境的某些功能——那么你如何设计一个框架严格遵守 YAGNI 原则?

我不确定我是否要求提供关于“如何使用 YAGNI”的具体内容——我知道它可能比这更具哲学意义。我可能只是在询问业内经验丰富的开发人员,YAGNI、对立原则和最佳实践之间的界限在哪里。YAGNI 是否被强制执行?它甚至被视为?或者这只是我们学校教给我们的东西,因为它在我们的书中?

谢谢。

0 投票
0 回答
57 浏览

solid-principles - OCP 和 DIP 会破坏 YAGNI 吗?

据我了解YAGNI,只有在需要时我们才需要提取接口。因此,如果我们不需要多态性并且现在只有一个实现,我们就不需要使用接口。但是DIP说:

A. 高级模块不应该依赖于低级模块。两者都应该依赖于抽象。

B. 抽象不应该依赖于细节。细节应该取决于抽象。

看起来YAGNI和选项 B之间存在一些差异DIP。此外,如果我们想要应用OCP,我们需要反转依赖关系的控制并提取抽象,以便能够在不修改该类型的情况下扩展一个类型。

此外,一些技术需要提取抽象才能对类型客户端进行单元测试。但是例如在java中我们不需要它。所以我想知道如果我现在只有一个实现,是否需要提取抽象?

0 投票
2 回答
402 浏览

design-patterns - YAGNI 原则应用于设计模式的意义何在?

我最近阅读了“Head First Design Patterns”。这本书写得很好,值得一读。它通常通过首先介绍一个问题和一个非常“幼稚”的问题解决方案来开始每一章。在接下来的页面中,提出了更多要求和约束,例如添加更多功能或更新行为。这本书再次提供了更新的“幼稚”方法。在某种程度上,当“幼稚”的方法弄乱了解决方案(事情开始出错)时,这本书会驱使读者采用一种全新的方法——目标设计模式。

在其他地方,我学到了一个缩写为“YAGNI”的原则,你不需要它,它指出“总是在你真正需要的时候实施,永远不要在你预见到你需要它们的时候实施。”

我现在想知道,关于“YAGNI”原则,“Head First Design Patterns”是否以无意义的方式解释事物?因为,在某种程度上,给定一组要求,我们应该为问题寻找最简单和最干净的解决方案,对吧?

0 投票
1 回答
243 浏览

java - 在java中实现简单计算器的设计原则

我在 java 中有简单的计算器代码,需要在这个 Calcualtor 程序上实现 solid、kiss、dry 和 yagin 原则。