定义
单一职责原则,英文名称是Single responsibility principle,简称SRP。单一职责原则要求一个类或接口只有一个原因引起变化,也就是一个类或接口只有一个职责。
优点
- 复杂性降低,实现的职责有清晰明确的定义;
- 可读性提高;
- 可维护性提高;
- 变更引起的风险性降低
代码实践
一般我们经常接触到系统都会有设置密码、修改昵称等,用户信息和行为的维护,我们把这些都写在用户管理类中,代码清单如下所示
class UserInfo {
private password;
private nickname;
/**
* 设置用户昵称
* @param {string} nickname 昵称
*/
public setNickname(nickname: string) {
this.nickname = nickname;
}
/**
* 获取用户昵称
* @returns {string} nickname 昵称
*/
public getNickname() {
return this.nickname;
}
/**
* 设置用户密码
* @param {string} password 密码
*/
public setPassword(password: string){
this.password = password;
}
/**
* 获取用户密码
* @returns {string} password 密码
*/
public getPassword() {
return this.password;
}
/**
* 修改用户密码
* @param {string} password 新密码
* @param {string} oldPassword 旧密码
*/
public changePassword(password: string, oldPassword: string) {
if (this.password === oldPassword) {
this.password = password;
console.log('修改密码成功');
}
}
/**
* 修改用户昵称
* @param {string} password 新昵称
* @param {string} oldPassword 旧昵称
*/
public changeNickname(nickname: string, oldNickname: string) {
if (this.nickname === oldNickname) {
this.nickname = nickname;
console.log('修改昵称成功');
}
}
}
由上面的代码我们可以看出,这个用户管理类负责了用户属性和用户行为,这并不符合单一职责原则,应该把用户信息抽取为业务对象,用户行为抽取为业务逻辑,按照这个思路对上面的用户管理类UserInfo进行拆分,重新拆封为两个类用户属性UserAttribute和用户行为UserBehavior,UserAttribute负责收集和反馈用户的属性信息,UserBehavior负责用户的行为,完成用户信息的维护和变更。具体代码实现如下所示
class UserInfo {
protected password;
protected nickname;
}
class UserAttribute extends UserInfo{
/**
* 设置用户昵称
* @param {string} nickname 昵称
*/
public setNickname(nickname: string) {
this.nickname = nickname;
}
/**
* 获取用户昵称
* @returns {string} nickname 昵称
*/
public getNickname() {
return this.nickname;
}
/**
* 设置用户密码
* @param {string} password 密码
*/
public setPassword(password: string){
this.password = password;
}
/**
* 获取用户密码
* @returns {string} password 密码
*/
public getPassword() {
return this.password;
}
}
class UserBehavior extends UserInfo {
/**
* 修改用户密码
* @param {string} password 新密码
* @param {string} oldPassword 旧密码
*/
public changePassword(password: string, oldPassword: string) {
if (this.password === oldPassword) {
this.password = password;
console.log('修改密码成功');
}
}
/**
* 修改用户昵称
* @param {string} password 新昵称
* @param {string} oldPassword 旧昵称
*/
public changeNickname(nickname: string, oldNickname: string) {
if (this.nickname === oldNickname) {
this.nickname = nickname;
console.log('修改昵称成功');
}
}
}
以上我们把一个类根据职责不同拆分为两个类的行为就是依赖了单一职责原则。我们把用户的属性和行为通过拆分进行了解耦,实现了类的低耦合高内聚。在后续如果增加用户头像变更的需求,我们只需要修改UserBehavior类就可以,将代码修改带来影响的范围限定得越小越好,方便后续代码的维护,降低变更带来的风险。