SOLID原则真的很扎实吗?

时间:2010-06-08 14:01:09

标签: c# .net design-patterns solid-principles

此首字母缩略词中第一个字母的设计模式是单一责任原则。这是一个引用:

  

单一责任原则   说每个对象应该有一个   单一责任,那   责任应该完全   由班级封装。

在我们开始编码之前,这很简单明了。假设我们有一个具有明确定义的单一责任的类。要序列化类实例,我们需要为该类添加特殊的属性。所以现在班上有另一个责任。这不违反SRP吗?

让我们看另一个例子 - 接口实现。当我们实现接口时,我们只需添加其他职责,比如处置其资源或比较其实例或其他任何内容。

所以我的问题。是否有可能严格遵守SRP?怎么做到呢?

11 个答案:

答案 0 :(得分:70)

正如您将来发现的那样,软件开发中最着名的原则都不能100%遵循。

编程通常是关于妥协 - 抽象纯粹与代码大小与速度与效率的对比。

你只需要学会找到合适的平衡点:不要让你的应用程序陷入混乱的深渊,而不是将自己的手与多个抽象层绑在一起。

答案 1 :(得分:13)

我不认为可序列化或一次性可以承担多重责任。

答案 2 :(得分:10)

我想首先要注意的是,这些只是良好的软件工程原则 - 您还必须应用判断。所以从这个意义上说 - 不,它们不是坚实的(!)

我认为你提出的问题提出了关键点 - 你如何定义班级应该具有的单一责任?

重要的是,在定义责任时不要过于沉迷于细节 - 仅仅因为一个类在代码中做了很多事情并不意味着它有很多响应。

但是,请坚持下去。尽管在所有情况下都可能无法应用 - 但它仍然比在代码中使用单个“God Object”(反模式)更好。

如果您遇到这些问题,我建议您阅读以下内容:

  • 重构 - Martin Fowler:虽然这显然是关于重构,但本书在展示如何将问题分解为逻辑部分或可靠性方面也非常有用 - 这对SRP至关重要。这本书也涉及其他原则 - 但它的学术方式比你以前看到的要少得多。

  • 清洁代码 - 罗伯特马丁:谁比SOLID原则的最大指数更好阅读。说真的,我发现这对软件工艺的所有领域都是一本非常有用的书 - 而不仅仅是SOLID原则。就像福勒的书一样,这本书适用于各种经验水平,所以我会推荐给任何人。

答案 3 :(得分:7)

为了更好地理解SOLID原则,您必须了解他们解决的问题:

面向对象编程源于结构化/程序化编程 - 它增加了一个新的组织系统(类,等)以及行为(多态,继承,组合)。这意味着OO不是从结构化/程序化中分离出来的,而是一个进步,开发人员可以根据需要做非常程序OO。

所以... SOLID出现了一些石蕊试验来回答“我真的在做OO,还是我只是使用程序对象?”的问题。如果遵循5条原则,则意味着您在光谱的OO方面相当远。不符合这些规则并不意味着你没有做OO,但这意味着它更具结构性/程序性OO。

答案 4 :(得分:5)

这里有一个合理的问题,因为这些横切关注点(序列化,日志记录,数据绑定通知等)最终将实现添加到多个类中,这些类只支持其他子系统。这个实现必须经过测试,所以班级肯定承担了额外的责任。

面向方面编程是一种尝试解决此问题的方法。 C#中的一个很好的例子是序列化,对于不同类型的序列化,存在各种不同的属性。这里的想法是类不应该实现执行序列化的代码,而是声明它是如何序列化的。元数据是一个非常自然的地方,包含对其他子系统很重要的细节,但与类的可测试实现无关。

答案 5 :(得分:2)

关于设计原则要记住的事情是总是存在异常,并且您不会总是发现您的场景/实现与给定原则100%匹配。

话虽如此,假设您的序列化/反序列化代码在其他类中,向属性添加属性并不是真正向类中添加任何功能或行为。您只是添加有关类的结构的信息,因此它似乎不违反原则。

答案 6 :(得分:2)

我认为一个类可以做很多次要的常见任务,如果没有它们模糊了类的主要责任:序列化,日志记录,异常处理,事务处理等。

根据您的判断,您的班级中的哪些任务构成了您的业务/应用程序逻辑以及管道代码的实际责任。

答案 7 :(得分:1)

那么,如果不是用“Bark”,“Sleep”和“Eat”方法设计一个“Dog”类,我必须设计“AnimalWhoBarks”,“AnimalWhoSleeps”,“AnimalWhoEat​​s”等等?为什么?这怎么能让我的代码变得更好?我怎么能简单地实现这样一个事实,即我的狗不会睡觉,如果他不吃东西就会整晚吠叫?

“拆分较小的大班级”,是一个很好的实用建议,但“每个对象应该只有一个责任”是一个绝对的OOP教条废话。

想象一下.NET框架是用SRP编写的。而不是40000个课程,你将拥有数百万个课程。

广义SRP(“广义”是这里的重要词)只是犯罪恕我直言。你无法将软件开发减少到5种书本原则。

答案 8 :(得分:0)

通过改变你对“单一责任”的定义 - SOLID原则非常流畅(和其他口音缩略语的缩略词一样)并不意味着他们的意思。

它们可以用作清单或备忘单,但不是完整的指导原则,当然也不是学习材料。

答案 9 :(得分:0)

在我看来,SRP是个模糊的术语。没有人可以清楚地定义应该承担的责任。 我的实现方式是严格将方法大小保持在40以下,将目标保持在15以下。

尝试遵循常识,不要过于迷恋它。尝试将类保持在500行以下,方法保持在30行以下。这将使其适合单个页面。 一旦这成为您的习惯,您将注意到扩展代码库的难度。

参考:干净代码中的鲍勃·马丁叔叔

答案 10 :(得分:-1)

S.O.L.I.D 代表:

  • 单一责任原则
  • 开放原则
  • Liskov的替代原则
  • 界面隔离原则
  • 依赖性倒置原则

当我们谈论OOP时,这些是我们提到的标准。但是,这些原则都不能在软件开发中完美实现。

您可以在此处http://www.slideshare.net/jonkruger/advanced-objectorientedsolid-principles

查看有关此主题的非常好的解释