停止使用Dry原则!替代以WET原则


Dry是Don't Repeat Yourself简写,我们经常会听到像“不要重复自己”这样的陈词滥调。我们采取这样的想法并与它们一起运行,有时候有点太过分了。我们来看看DRY编程的另一种意识形态。

Don't Repeat Yourself (DRY) 定义
DRY被定义为(根据维基百科):

每一条知识都必须在系统中具有单一,明确,权威的表示。

让我们分解这句话:

每一条
什么是“每一条”?我们需要永远不重复变量名吗?一个HTML实体?我们什么时候才能确定某些东西已成为“知识”?

知识
这是另一个含糊不清的观点 - 我们将什么定义为知识?考虑使用一些原子类和React的样式化按钮元素。如果是高级程序员只需要10秒就能创建!但对于一个不太了解系统的初级开发人员来说,这些知识可能是一个很好的抽象。否则,他们可能不得不追捕这些类,提醒自己按钮是如何工作的,并找出一个语法onClick。知识是相对的,在定义中使用它会增加歧义。

单一,明确,权威的表示
“单一”表示留下了许多不足之处。从devops工程师的角度来看,单一表示可能是他们需要部署的整个应用程序。对于前端开发者来说,这可能是一个组件。对于后端dev,这可能是类或API端点上的方法。这条线在哪里被画出来?

我们也有“明确”这个词 - 但正如我刚才指出的那样,这句话的其余部分定义了更多的模糊性。“权威”是有道理的 :您的DRY代码应该准确定义它的作用并且对该定义是正确的。但是,这并未明确局限于DRY代码。

系统
最后,我们拥有世界“系统” - 这又回到了我们之前讨论过的“单一”声明。什么是“系统”?在React中,它可能是一个组件或Redux操作/组件/ reducer。在容器化软件中,我们可以谈论整个容器或只是一个实例。

在一天结束时,DRY all经常促进预优化,这是不必要的,有时实际上会损害您编写代码的能力。有时,修改抽象组件以适应特定用例更加困难。你增加了很多复杂性,或者你将这个组件分解成新的东西 - 这不是超级DRY。在第一天,您不可能也无法了解组件的每个用例。

另一种选择 - Write Everything Twice(WET)编程
反,我建议WET编程。WET定义是:

你可以问自己两次:“我以前没有写过这个吗?” ,但第三次询问不应该发生。

通过这个定义,远离过早优化,让您可以重复几次类似的代码。让你根据你正在查看的确切用例做出决策。
如果您正在构建一个Web应用程序,您可能希望将按钮抽象为一个组件,因为您将很多次使用它们。但是,如果有一个页面具有一些特殊的样式(可能是定价页面?),那么您不必过于担心抽出该页面上的组件。事实上,在这个系统下,如果你需要一个类似于那个特殊页面的新页面,你可以复制/粘贴并更改你需要的代码,直到在第三次这种情况发生的那一刻。

我还要添加这个规定(WET和DRY编程):

你必须慎重考虑你的抽象


无论什么时候你开始抽象,你都在重新排序应用程序的架构。如果您没有认真考虑与讨论抽象的原因,那么你的团队(以及你在未来的自己!自己也要维护自己代码)就会受到损害。