一.简介
单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因。
二.关于职责
两个关于职责的重要结论
●职责是站在他人的角度来定义的;
●职责不是一件事,而是很多事情,但是这些事情都是和职责紧密相关的。
对应到面向对象设计领域,我们可以说一个类的职责应该有如下定义
●类的职责是站在其他类的角度来定义的。
●类的职责包含多个相关功能。
因此,SRP可以翻译成“一个类只负责一组相关的事情”,对应到代码中就是:一个类有多个方法,这些方法都是相关的。
三.关于SRP原则范围
由于现实世界要比理想还要复杂,一个最典型的例子就是“办公一体机”
根据SRP原则,打印机可以设计成一个类,复印机可以设计成一个类,扫描机也可以设计成一个类,传真机还是可以设计成一个类,但偏偏就出了个“办公一体机”,这个机器集成了“打印”、“复印”、“扫描”、“传真”四个职责!
如果我们要设计一个“办公一体机”的类,怎么也不可能设计出一个符合SRP原则的“办公一体机”的类来!
怎么办?是SRP不正确,还是我们永远不要设计“办公一体机”这样的类?
其实SRP没有错,“办公一体机”也应该设计,但是不要用SRP来约束“办公一体机”这样的类。
在“办公一体机”的样例中,“打印机”、“复印机”、“扫描机”、“传真机”都是基础类,每个类都承担一个职责,而办公一体机是“聚合类”,同时集成了4种功能!
SRP不能应用于聚合类,那么如何保证聚合类的设计质量呢?
答案是:优先使用对象组合,而不是类继承。
网友评论