YAGNI原则应用于设计模式有什么意义?

What is the point of YAGNI principle applied to design patterns?

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

我在其他地方学到了一个缩写为 "YAGNI" You Aren't Gonna Need It 的原则,指出 "Always implement things when you actually need them, never when you just foresee that you need them."

我现在在想,"Head First Design Patterns"是不是按照"YAGNI"的原理在胡说八道?因为,在某种程度上,给定一组要求,我们应该寻求最简单和最干净的问题解决方案,对吗?

YAGNI 原则并没有说明简单的解决方案或干净的解决方案。 KISS 原则描述了那些因素。 YAGNI 原则的要点是避免开发未使用的功能。使用此原则的主要目标是节省开发时间。

例如,假设您应该将您的应用程序与外部 API 集成。你开发了一个API的客户端组件来实现这个目标。当然,您可以使客户端组件能够使用外部 API 的所有功能。这种方式使我们能够制作出可用于未来许多不同应用程序的通用组件。但可能您的应用程序目前并未使用每个 API 功能。这意味着这种方式有几个缺点:

  • 您将创建可能永远不会被使用的功能
  • 您会将开发时间花在目前无法提供业务价值的功能上。
  • 您无法在实际使用中测试未使用的功能。

在这种情况下,仅使用功能的开发比完整功能的开发更合理。 YAGNI原理告诉我们。

YAGNI + Design Patterns == Refactoring

有一种设计模式观点提倡重构模式而不是设计模式。 Refactoring to Patterns 一书就是这种观点的例证 。马丁·福勒 (Martin Fowler) 在赞同这本书时说,

...most of the popular Gang of Four patterns... need not be designed in up front, but evolved to as a system grows.

这也是 Head First Design Patterns 采用的方法,并且与 YAGNI 完全一致。不要做大前期设计来决定你可能需要模式的地方。相反,随着系统的发展重构模式。让模式随时间浮现。

相关:What should come first -- the design pattern or the code?