面向对象有一个重要的原则:单一职责原则。即一个类应该尽量只承担一种职责。
前几天做了个小程序,把多个类定义在了一个文件中。类和类之间有依赖的关系,还共用几个变量。同时,三个类都有被外界调用的可能。昨晚想来想去觉得不妥。最终得一结论:类文件应该符合单一接口(类)。
对此做如下说明:
一.所谓单一接口是指类的文件对外只有一个发言人。即只有一个类是被外界调用的,在外界看来这个文件中似乎只有这么一个类。
二.该对外接口同样得符合单一职责原则。不能是个万能的上帝类。
三.文件内部其他类或结构只能被封装在内部,供内部使用。如果确实想和其他文件共有类和结构,请把它们解耦出来,形成单个文件。
这样才能真正的把文件与文件之间解耦,更清晰地看出对象的依赖关系。
举个例子,一个文件F中含有A和B两个对外接口。我们不知道A和B之间有没有关系,因为一个文件对我们来说就是一个封装好的组件。此时如果我要用到A,那我们不得不把庞大的F加载进来,B很可能就是一个冗余的接口。要修改B,那我们还必须对整个F文件进行修改。A和B”耦合“了(不管他们是否真的耦合,至少外界看来是这样)。
2010.4.26补充:
以上所说如果A和B放在同一文件里说明他们之间”耦合“了。这里所说的耦合是从F文件使用者的角度来说。因为使用者并不关心内部结构,对他来说这个封装好的文件就是一个整体。他们内部可能是松耦合的A和B一点关系也没有。可使用者不知道啊,这样F文件的原创者修改了F文件中的B,那他就不得不对没一个使用F文件的人发布新的文件,让他们重新编译F文件。
再举一例说明:
本来甲建了一文件F,包含A和B。乙拿过来用了(甲也不知道乙到底是用了A还是B,只知道用了F文件)。后来甲修改了B,B又引用到了其他文件,把F发给了乙。那么乙不得不也把这些引用到的文件全部加载进来以保证编译通过,这都是不必要编译麻烦。