解耦与YAGNI

时间:2009-03-02 09:15:38

标签: coupling decoupling yagni

他们是否矛盾?

脱钩是很棒的,很难实现。然而,在大多数应用程序中,我们并不真正需要它,因此我可以设计高度耦合的应用程序,除了明显的副作用之外,它几乎不会改变任何东西,例如“你不能分离组件”,“单元测试是痛苦的屁股“等等。

你怎么看?你总是试图解耦和处理开销吗?

9 个答案:

答案 0 :(得分:7)

在我看来,脱钩和YAGNI是非常互补的美德。 (我刚刚注意到Rob的回答,似乎我们在这里的同一页。)问题是你应该做多少脱钩,而YAGNI是一个很好的原则来帮助确定答案。 (对于那些谈论单元测试的人 - 如果你需要解耦进行单元测试,那么YAGNI显然不适用。)

我真诚地怀疑那些说他们“永远”脱离的人。也许他们每次想起都会这么做。但我从来没有见过一个程序,其中无法在某处添加额外的抽象层,我真诚地怀疑这样的程序有一个非平凡的例子。每个人都在某处画线。

根据我的经验,我已经解耦了代码,然后从未利用额外的灵活性,因为我已经离开了代码耦合,然后不得不返回并稍后更改它。我不确定这是否意味着我在两个方向都很平衡或同样被打破。

答案 1 :(得分:4)

YAGNI是一个经验法则(不是宗教)。解耦或多或少是一种技术(也不是宗教)。所以他们并没有真正相关,也没有相互矛盾。

YAGNI是关于实用主义的。假设你不需要什么东西,直到你这样做。

通常假设YAGNI导致解耦。如果你根本不使用那把刀,你最终会假设你需要在你证明这一点之前知道关于彼此行为的所有类别。

“Decouple”(或“松散情侣”)是一个动词,因此需要工作。 YAGNI是一种推定,当你发现它不再适用时,你可以调整它。

答案 2 :(得分:2)

我(几乎)总是脱钩。每次我这样做,我发现它很有用,而且(差不多)每次我没有,我不得不在以后做。我也发现它是减少错误数量的好方法。

答案 3 :(得分:2)

为了解耦而去耦可能很糟糕。 构建可测试组件非常重要。

故事的难点在于知道何时以及需要多少脱钩。

答案 4 :(得分:2)

我会说他们没有。解耦是为了减少代码中不必要的依赖关系,并通过干净,定义良好的接口加强访问。 “你不需要它”是一个有用的原则,它通常建议不要过度扩展和过于宽泛的解决方案架构,其中没有明显和当前的用例。

这些实际的结果是你有一个系统,它可以更容易地重构和维护单个组件,而不会在整个应用程序中无意间造成连锁反应,并且设计中没有不必要的复杂方面 - 它就是这么简单符合当前要求所需。

答案 5 :(得分:1)

如果“单元测试是一个痛苦的屁股”,那么我会说你需要它。大多数情况下,解耦可以实现零成本,所以为什么你不想这样做?

此外,在处理新代码库时,我最大的一个问题是,在我开始编写单元测试之前,当在某处引入接口或使用依赖注入可以节省大量时间时,必须解耦代码

答案 6 :(得分:0)

嗯,YAGNI只不过是人们抛出的虚假术语。然而,解耦是一个相当容易理解的概念。 YAGNI似乎暗示一个人是某种心灵。这只是陈词滥调的编程,这绝不是一个好主意。说实话,有一种情况可以说YAGNI可能与脱钩有关。耦合通常“更快”,“谁知道你是否需要一个解耦的解决方案;无论如何你都不会改变X组件!”

答案 7 :(得分:0)

正如你的标签所说,这是非常主观的。它完全取决于你自己的工程智慧来决定你“不需要”的东西。你可能需要在一个案例中联合,但你不会在另一个案例中。谁告诉谁? ,当然。

如果决定如此主观,那么就没有规定的指导方针。

答案 8 :(得分:0)

YAGNI一团糟......真的,我们不需要将所有代码混合起来“更快”。

单元测试确实有助于感受何时耦合(假设一个单元测试与其他类型的测试相比)。如果你用“你不能分离组件”的思维方式来做,你可以轻松地添加你不需要的东西:)

我想说当你开始扭曲和改变逻辑时,YAGNI会进入当前实现所要求的实际使用场景之外。假设您有一些代码使用了几个外部支付提供商,这些提供商都可以使用重定向到外部网站。设计可以保持一切清洁是可以的,但我不认为可以开始考虑我们不知道是否会得到支持的提供商有很多不同的处理集成和相关的方法工作流程。