2009年1月28日星期三

解耦合手段之二:Single Responsibility Principle

在面向对象的方法中,Robert C. Martin引入了Single Responsibility Principle(SRP),即单一职责原则。就是说:所有的对象都应该有单一的职责,它提供的所有的服务也都仅围绕着这个职责。用Uncle Bob自己的话来说就是:“永远不要让一个类存在多个改变的理由”(There should never be more than one reason for a class to change.

多个职责挤在一个类当中就是耦合。例如一个矩形类即要负责几何计算,又要负责在图形界面中画出这个矩形,这就违反了SRP。为什么这样耦合性就高了呢?因为类内部的“内聚性”差了。如果一个类里面所有的方法都用到了这个类所有的成员变量,我们说这个类的内聚性是最高的。如果是一些方法用到了一半的成员变量,而另一些方法用到了另一半,那么这显然是两个不相干的职责被挤到了一个类里,这个类的内聚性是最差的。遵守SRP原则就能够使我们提高类的内聚性,从而降低系统的耦合性。

那么怎么来定义职责呢?Uncle Bob的定义就是“改变的理由”。如果你能想到一个类存在多个使其改变的原因,那么这个类就存在多个职责。例如上面提到的矩形类,要改变图形界面中矩形的外观要改动它,要改变矩形的几何运算也要改到它。因此这个矩形类要被拆成两个。

这样就会使得每个类都很小,是的,就是要类很小。可能有人会担心这么多很小的类会不会用起来很麻烦。用个Uncle Bob的例子吧:你是希望工具箱里只有几个大抽屉,所有的工具都放在一起,还是希望有很多小抽屉,上面都标好了里面工具的名称?

即使不是面向对象的语言,我们还是可以使用面向对象的思想,把数据和它所对应的操作关联起来。函数,类,模块以至于整个系统,这些不同层面代表了对业务逻辑不同层面的抽象。SRP从职责,或者是“改变的理由”的角度为类的抽象粒度提供的判断的标准。






最后提前说一下,所谓SRP只不过是伟大的Separation of Concerns原则的一个引伸原则,SoC才是一切解耦合的不二法门。等我把SoC的引伸原则一个一个的列举完了,再来谈它自己吧。






没有评论:

发表评论