从刚刚这个例子来看,单一职责原则看似不难应用。那是因为我举的这个例子比较极端,一
眼就能看出订单和用户毫不相干。但大部分情况下,类里的方法是归为同一类功能,还是归
为不相关的两类功能,并不是那么容易判定的。在真实的软件开发中,对于一个类是否职责
单一的判定,是很难拿捏的。我举一个更加贴近实际的例子来给你解释一下。
在一个社交产品中,我们用下面的 UserInfo 类来记录用户的信息。你觉得,UserInfo 类的
设计是否满足单一职责原则呢?
对于这个问题,有两种不同的观点。一种观点是,UserInfo 类包含的都是跟用户相关的信
息,所有的属性和方法都隶属于用户这样一个业务模型,满足单一职责原则;另一种观点
是,地址信息在 UserInfo 类中,所占的比重比较高,可以继续拆分成独立的 UserAddress
类,UserInfo 只保留除 Address 之外的其他信息,拆分之后的两个类的职责更加单一。
哪种观点更对呢?实际上,要从中做出选择,我们不能脱离具体的应用场景。如果在这个社
交产品中,用户的地址信息跟其他信息一样,只是单纯地用来展示,那 UserInfo 现在的设
计就是合理的。但是,如果这个社交产品发展得比较好,之后又在产品中添加了电商的模
块,用户的地址信息还会用在电商物流中,那我们最好将地址信息从 UserInfo 中拆分出
来,独立成用户物流信息(或者叫地址信息、收货信息等)。
我们再进一步延伸一下。如果做这个社交产品的公司发展得越来越好,公司内部又开发出了
跟多其他产品(可以理解为其他 App)。公司希望支持统一账号系统,也就是用户一个账
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class UserInfo {
private long userId;
private String username;
private String email;
private String telephone;
private long createTime;
private long lastLoginTime;
private String avatarUrl;
private String provinceOfAddress; // 省
private String cityOfAddress; // 市
private String regionOfAddress; // 区
private String detailedAddress; // 详细地址
// ... 省略其他属性和方法...
}