【问题标题】:What are the relationships between the five SOLID principles?SOLID 的五项原则之间的关系是什么?
【发布时间】:2021-10-20 15:43:14
【问题描述】:

这一直困扰着我多年。 SOLID 是一组可维护和可扩展开发的五项原则,通常适用于 C# 等大型项目。

但是真的有五个原则吗?换句话说,是否可以编写满足 4 但不满足 5 或原则的代码?这对于任何 4 项原则的选择都是正确的吗?

我问的原因是我很难完全分离它们的逻辑,而且它们似乎有点重叠,这让我怀疑是否需要所有五个规则,或者是否可以更简洁地描述 SOLID,比如说,三个原则。

【问题讨论】:

  • SOLID 只是一个有魅力的人的营销视角。我喜欢在其他原则的背景下查看 SOLID,例如 principles-wiki.net/collections:solid -- 当您深入研究时,您会发现 SRP 是高内聚等的专业化。设计是一个非常困难的问题,因为游戏和他们的互动(他们真的可以反对)。我发现讨论关系不如查看实际问题(看到光明)有用(它会产生热量)。
  • @Fuhrmanator 我不想在我的回答中深入探讨意见,但我相信助记符在 SOLID 的普及中发挥了不小的作用。
  • @Fuhrmanator,公平地说,这五项原则并不是 Bob Martin 自己发明的。 OCP 来自 Bertrand Meyer。 LSP 来自 Barbara Liskov。 SRP 是 Martin 至少归功于前五位作者的旧原则的组合。他描述的 DIP 是同时应用 OCP 和 LSP 的结果。所以马丁真正发明的唯一原则是 ISP,他称其为五项中最不重要的一项。 “只是一个人的观点”卖 SOLID 有点短。将其称为几个(聪明的)人的“收集的智慧”会更公平。
  • @jaco0646 我引用的 wiki 支持您的评论 110%。您会发现对所有这些人的作品的引用等等。我称这些为“市场化”观点,因为这意味着人们已经出版了书籍并就他们的collections 进行了热情洋溢的讨论:GRASP (Larman)、GoF、OOSC (Meyer)、Pragmatic Programmer (Hunt, Thomas)、Unix Philosophy (Raymond) .
  • it seems like they overlap a bit: 是的,我完全同意。

标签: oop design-patterns solid-principles


【解决方案1】:

您当然可以设想不同的原则,人们有:例如,GRASP 和 CUPID。

从 Robert Martin 的角度来看,SOLID 是不同的,任何四个都可以在没有另一个的情况下应用。有点切线,最密切相关的两个可能是OCP and DIP。特别是,DIP 是其他原则的延伸(用 Martin 自己的话来说),但显然是他觉得值得一提的延伸;甚至我们可以从 OCP 中挑选出 DIP。其他的比较容易隔离。

这并不是说没有重叠。事实上,如果基础编程原则彼此之间没有关系,那就太奇怪了。但很明显,这个想法是每个人都贡献了一些独特的东西。

当然,如果你尝试的话,你可以将这五个压缩成更少的东西,但我认为 SRP 在这里是一个警示故事。它已经是几个旧原则的组合,包括耦合、内聚和关注点分离。在我看来,将这些原则浓缩为一个(可能是更普遍的原则)已经导致了 SOLID 最令人困惑的方面。

想象一下,如果只有一个原则。那么编程不是很容易吗?唉,该原则过于模糊和笼统,以至于不适用。考虑相反的情况:SOLID 可以扩展为十几个原则,或者一百个。它不再适合贴在保险杠贴纸上,因此不适合营销和销售书籍,但它可以更真实地捕捉软件设计的复杂性。

我认为这些原则合集的任何作者都不会坚持认为他们的合集是详尽无遗的。但我确实认为您可以从每个原则中学到一些东西。

【讨论】:

    【解决方案2】:

    将 SOLID 原则视为一个互补的工具包,而不是一个单一的概念单元。 Martin has even ranked the principles in order of importance (podcast link)。它们是具有不同目的的不同原则,但应用程序越大,您就越有机会利用所有这五个原则。

    还请记住,还有大量其他设计模式、实践和原则可以帮助您编写更好的代码和设计更好的系统 - SOLID 只是冰山一角。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 2012-08-12
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      • 2021-01-04
      相关资源
      最近更新 更多