SOLID原则与YAGNI


43

SOLID原则何时会成为YAGNI?

作为程序员,我们始终在复杂性,可维护性,构建时间等之间进行权衡。在我看来,其中两项最明智的选择准则是SOLID原则和YAGNI。如果您不需要它;不要建造它,并保持干净。

现在,例如,当我观看SOLID上dimecast系列节目时,我看到它开始时是一个非常简单的程序,然后结束时是一个非常复杂的程序(当然,在旁观者看来,复杂性也是如此),但是它仍然使我想知道:SOLID原则何时会变成您不需要的东西?所有坚实的原则都是可以使用户在以后进行更改的工作方式。但是,如果要解决的问题是一个非常简单的问题,并且是一个一次性应用程序,该怎么办?还是SOLID原则始终适用?

如评论中所述:


标题也不应该SOLID principle vs YAGNI吗?
狼”

2
@Wolf:它是复数形式,“ SOLID(单一职责,开放式封闭,Liskov替代,接口隔离和依赖倒置)是由迈克尔·费瑟斯(Michael Feathers)为罗伯特·C·马丁(Robert C. Martin)早期命名的“前五个原则”引入的助记词首字母缩写。在2000年代代表了面向对象编程和设计的五项基本原则。”
logc 2015年

Answers:


55

始终很难根据截屏视频来判断方法,因为为演示选择的问题通常很小,以至于很快应用SOLID之类的原理会使解决方案看起来完全过分设计。

我想说SOLID原则几乎总是有用的。一旦您精通它们,似乎就不必刻意考虑使用它们了。它变得自然。我已经看到许多一次性的一次性应用程序变得不仅仅如此,所以我现在害怕说我会扔掉一些东西,因为您永远都不知道。

我通常采用的方法是,如果我为某个特定的任务编写一个简单的应用程序,有时我会放弃大名鼎鼎的原则,而转而使用几行有效的代码。如果我发现我要回到该应用程序进行进一步的更改,我将花一些时间使它变为SOLID(至少要稍作调整,因为100%应用该原理很少可行)。

在较大的应用程序中,我从小处着手,随着程序的发展,我尽可能使用SOLID原理。这样,我不会尝试从头到尾设计整个对象。对我来说,这是YAGNI和SOLID共存的最佳地点。


这几乎也是我的想法。值得一提的是,我不会通过截屏视频来判断,我只是认为这是一个很好的示例,说明了在应用SOLID时软件如何增长。
KeesDijk 2010年

好点子。任何演示都将歪曲以演示或加剧眼前的问题。本质上,将一个想法发挥到最大结论来证明它是虚假的,这是整个想法。本身可以被滥用的前提。
Berin Loritsch 2010年

YAGNI and SOLID coexist好的结论。尽管这可能是一个很好的起点
Wolf 2015年

似乎有时需要预感。您必须知道可能在哪里开始看到很多更改,才能知道抽象水平与管道停止和开始的位置。
约翰尼

19

首先要考虑当前的问题。如果您盲目地应用YAGNI或SOLID的原理,以后可能会伤害自己。我希望我们大家都能理解的是,没有适合所有问题的“一种”设计方法。您可以看到有证据表明,一家商店出售标有“一种尺寸适合所有人”的帽子,但不适合您的头部。它太大或太小。

相反,最好了解SOLID试图解决的原理和问题。以及YAGNI试图解决的原理和问题。您会发现一个与应用程序的体系结构有关,另一个与整个开发过程有关。尽管在某些情况下可能存在重叠,但是它们是截然不同的问题。

YAGNI(您不会需要它[古朴的美国首字母缩写词])与节省开发人员的时间有关,目的是在桥梁上增加钢筋混凝土基础,该基础仅打算跨越3英尺宽的小溪,而更简单的木桥只会精细。如果我们横跨一英里宽的河流,并且需要支撑多辆拖车,那么我们当然需要进行额外的基础工作。本质上,YAGNI告诉您要从更大的角度出发,并针对当前需求进行设计。它正在解决使某些事情变得过于复杂的问题,因为我们预计客户还没有发现许多潜在的需求。

SOLID与我们如何确保桥的各个部分正确装配在一起以及如何随时间进行维护有关。您可以将SOLID原理应用于木桥以及钢筋混凝土桥。

简而言之,这两个概念不一定相互冲突。当您遇到自己认为是的情况时,就该看看全局了。根据您的结论,您可能决定取消部分SOLID原则,或者可能确实确定确实需要它。


是的,同意..没有适合所有情况的“子弹式”方法。
EL Yusubov

make sure the pieces of the bridge fit together到目前为止,您不如can be maintained over time
狼”

基本上,使用SOLID可以使您将木桥转换为全长1英里长的钢桥,该桥能够支撑装甲排,而无需进行完全重写或仅在黑客入侵后进行修改。
2016年

@kai,这是错误的前提。如果需要跨度为1英里的桥梁,则可以设计跨度为1英里的桥梁。如果需要跨度为5英尺的桥,则可以构建跨度为5英尺的桥。不要误会我的意思,SOLID原理非常有帮助,但是需要对它们有更多的了解,才能知道哪些问题对于当前的问题不是必需的。十分之九,再也不需要。
Berin Loritsch '16

@BerinLoritsch,这就是为什么我同意如果您需要5英尺,那么您可以建造5英尺,但您不要通过将2x4的地面弹到地面来建立5英尺。您做自己需要的事,就做得很好。(尽管比喻有点崩溃)
sara

9

当是一次性应用程序时,不需要SOLID原理。否则,总是需要它们。

SOLID和YAGNI并不矛盾:良好的类设计使应用程序更易于维护。YAGNI只是声明您不应该为应用程序添加功能,使其成为可以在阳光下做所有事情的可配置怪兽,除非它确实需要它。

这是具有明确定义的边界(SOLID)的汽车类与具有自愈能力(YAGNI)的汽车类(在客户提出要求之前)之间的区别。


1
这不是混在一起吗?这是怎么回事:正确地应用SOLID原理来处理自愈汽车的复杂性,或者只要您的汽车仍然如此简单以至于它们永远不会破损(或者-便宜-让他们可以被扔掉),就应用YAGNI。 。
狼”

2
@Wolf SOLID原则不会说您应该做什么,而只是说如何。如果您已经确定要使用自愈汽车,则可以将SOLID原理应用于该代码。SOLID并没有说自愈汽车是否是个好主意。这就是YAGNI的用武之地
萨拉

通常,一次性应用程序并非如此。
图兰斯·科尔多瓦

“自愈”是好的。“在客户要求之前”也是很好的,因为我认为,如果您听鲍勃叔叔的话,整个想法是针对那些能够获利并能够预测客户需求并拥有可以应对需求的可行业务的地方因为他们改变了。很多人对Bob叔叔感到恼火,因为他不擅长编程,但是他在大多数时候告诉您使用SOLID的重要性,而不仅仅是如何使用。
约翰尼

“当它是一次性应用程序时,不需要SOLID原理”。我认为SOLID原则是一个好习惯,因此即使是一次性应用程序,当您需要编写大型应用程序时也会在训练自己,因此遵循SOLID原则可能会有好处。
icc97

4

没有什么总是适用的!不要让建筑宇航员吓到您!重要的是要尝试了解这些原则要解决的问题,以便您可以就应用这些原则做出明智的决定。

最近,我试图了解何时应该使用“单一责任原则”(是我想出的。)

希望这可以帮助!


2

爱因斯坦(Einstein)引述了一个报价(可能是对实际报价的一种变体):

“一切都应该尽可能简单,但不要简单。”

而这几乎是我在SOLID与YAGNI权衡中所采用的方法:交替应用它们,因为您永远不知道程序是否是“扔掉”的代码。因此,只需添加一层可以使用的污垢,然后将其抛光到更清洁的界面...,然后重复进行,直到收敛到正确的熵水平为止。希望。


好点:you never know if a program is 'throw-away' code-好吧,我认为替代方案不是那么好。
狼”

@Wolf:是的,我按照我认为最好的步骤进行了扩展(在“首先使其成为可能,然后使其变得美丽,然后使其快速”的口号中进行了概括),但随后我想到了……YAGNI :)
logc 2015年

1

针对给定问题设计程序的方法有很多。SOLID是一种尝试识别良好设计的属性的尝试。正确使用SOLID应该可以使程序更易于推理和修改。

YAGNI和KISS关注功能范围。解决更多类型问题的程序更加复杂和抽象。如果您不需要这种通用性,那么您就花了很多时间和精力来创建难以理解和维护的代码,但没有附加值。

设计良好的程序不一定只关注其所需的功能。仅专注于所需功能的程序不一定设计得很好。没有权衡取舍,决策空间中只有两个正交轴。理想的程序既是模块化的,也只有基本功能。


0

我认为您应该启动YAGNI,并在需要时进行SOLIDify。

我的意思是说SOLID在那里,所以当您添加一个新类时,您无需进行重构,只需切换一个实现(例如),我认为,可以简单地编写代码,并且当您看到要更改时东西-用SOLID进行更改(即,担心重构SOLID应该可以使您免于遭受损失-当您刚入门时,它并没有那么糟糕)。

您并没有在浪费时间,因为无论如何(一开始)您都必须要做工作,并且无论何时何地,您的代码都非常整洁。

我猜您可以称其为SOLID的惰性评估。


嗯,我认为您的观点是多余的,我会删除它,但似乎我没有特权(或我没有看到该按钮)。无论哪种方式,我都会对其进行编辑以使其更加清晰。
Binyamin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.