设计是权衡的管理和平衡。 YAGNI 和 SOLID 并不冲突:前者说明何时添加功能,后者说明如何添加功能,但它们都指导设计过程。我在下面对您的每个具体报价的回复都使用了 YAGNI 和 SOLID 的原则。
- 构建可重用组件的难度是一次性组件的三倍。
- 一个可重用的组件应该在三个不同的应用程序中试用,然后它才能足够通用以接受到重用库中。
——罗伯特·格拉斯的三法则,软件工程的事实和谬误
重构为可重用组件的关键要素是首先在多个地方找到相同的目的,然后再移动它。在这种情况下,YAGNI 通过在需要的地方内联该目的来应用,而不用担心可能的重复,而不是添加通用或可重用的特性(类和函数)。
在初始设计中,显示 YAGNI 何时不适用的最佳方式是确定具体需求。换句话说,在编写代码之前进行一些重构,以表明重复不仅是可能的,而且已经存在:这证明了额外的努力是合理的。
是的,我可以将所有业务逻辑直接放入 GUI 代码中,这样更容易、更快捷。这将始终是唯一的 GUI,并且极不可能出现重要的新需求。
它真的是唯一的用户界面吗?是否计划了后台批处理模式?会有网页界面吗?
你的测试计划是什么,你会在没有 GUI 的情况下测试后端功能吗?什么会使 GUI 易于测试,因为您通常不想测试外部代码(例如平台通用 GUI 控件),而是专注于您的项目。
我可以将特征 X 和特征 Y 放在同一个类中。为什么要添加一个新类(即复杂性)是如此简单。
你能指出一个需要避免的常见错误吗?有些事情很简单,例如将数字平方(x * x
vs squared(x)
)作为一个过于简单的例子,但如果你能指出某人犯的具体错误——尤其是在你的项目中或你的团队中的人——你可以展示一个常见的错误类或函数将来会避免这种情况。
如果在不太可能出现新需求的情况下,我的代码变得过于混乱,我仍然可以针对新需求进行重构。所以你的“如果你以后需要……怎么办”论点不算数。
这里的问题是“不太可能”的假设。你同意这不太可能吗?如果是这样,你就同意这个人了。如果不是,您的设计理念与此人的理念不一致——解决这种差异将解决问题,或者至少告诉您下一步该往哪里走。:)