单一责任原则 - 一个很难看的例子?

时间:2010-09-30 09:22:24

标签: oop single-responsibility-principle

我刚刚读到了单一责任原则,有一点罗伯特·C·马丁说,有时很难看出一个班级有多个责任。

任何人都可以提供这样一个类的例子吗?

2 个答案:

答案 0 :(得分:4)

考虑一个具有方法

的HTTP类
  • 获取(网址网址)
  • SendRequest(字符串请求)

这两种方法都与HTTP有关。但是,Get和SendRequest具有不同的抽象级别。 Get实际上可以使用SendRequest发送GET请求。因此,SendRequest应该在低级HTTP类中,而Get应该在使用低级别的高级HTTP类中。

答案 1 :(得分:2)

这很有趣,因为另一个StackOverflow user在几个小时前在his question中显示了这样的例子。

考虑这个课程:

[Serializable]
class MyClass
{
  //Serializable fields
  public void Save()
  {
     //Saving data into file
  }

  public void Load()
  {
    //Loading data from file
  }
}

这个类(MyClass)几乎没有单独的角色:

  1. 此课程可序列化

  2. 此课程可以将其状态保存在某个存储空间

  3. 在许多情况下,这不是一个好主意,因为当我们希望将持久存储从简单的二进制文件更改为Xml文件或远程存储(例如通过WCF)时,我们无法轻松地重用此可序列化实体。 / p>

    你可以创建类似MyClassWCFSaver的子类,但即使在这种情况下,使用可序列化的类MyClass和MyClassSavers的独立层次结构(对于xml,二进制或WCF存储有几个不同的子库)也更容易

    BTW,这就是为什么在许多ORM中我们经常将实体与存储库区分开来(参见Repository Pattern)。