SRP (单一职责原则)

192 阅读2分钟

这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战

概念

全名:Single responsibility principle 缩写:SRP

解决什么样的问题

  • 实现高内聚,低耦合
  • 提高代码可读性,复用性,可维护性。
  • 降低变更引起的风险

将不同功能职责进行分离

A class should have only one reason to change

就一个类而言,应该仅有一个引起它变化的原因。应该只有一个职责

解析

  • 思考1:需求会随着时间的增加而增加,假设有需求需要修改一个类,但是修改会影响到类的其他功能。

比如:

// 修改其他代码的时候,会不会影响登录功能
class User {
   function register() {
       // 其他代码
       // 登录逻辑代码
       // 其他代码
   }
}

或者修改成

// type传错,那么会影响用户其他功能
class User {
   function operate() {
       if (type == login) {
         // 登录操作
       } else if (type == register) {
         // 其他代码
       }
   }
}

这样会不会好一些 修改1:

// 修改其他代码的时候,会不会影响登录功能
class User {
   function register() {
       // 其他代码
   }
   function login(){
       // 登录操作
   }
}

那是不是可以这样 修改2:

// 修改其他代码的时候,会不会影响登录功能
class User {
}

class Register extends User {
  function register() {
       // 其他代码
   }
}

class Login extends User {
  function login() {
       // 其他代码
   }
}

等等还有很多很多类似的方法。

  • 思考2:过度简化代码,创建具有一个功能的类,将单一职责原则发挥到了极致。这样我们必须注册过多的依赖项。拥有多个只包含一个函数的类到底有没有意义?

将不同行为者的职责进行分离。

比如:

// 修改其他代码的时候,会不会影响登录功能
class User {
 constructor() {
   name = '';
   address = '';
   id = '';
 }
 getName() {
 }
 getAddress() {
 }
 // 获取权限
 getAccess() {
 }
}

getAccess方法不属于用户(行为者)的职责。 比如access可以通过

class Access {
 // 获取用户权限
 getAccess(user) {
 }
}

总结

理解的比较简单,但是实际用起来比较难,难点在于如何多维度(不同的关注点去拆分类的职责)的去建立单一职责的类。