Published on

每日小知识点(十) - 高内聚和低耦合

Authors

内聚和耦合

内聚

内聚性(英语:Cohesion)也称为内聚力,是指机能相关的程序组成一模块的程度。或者说是指一个组件内部各个元素之间相互关联和相互依赖的程度。

高内聚

高内聚表示组件内的元素彼此紧密相关,共同完成某一功能,且组件内部的逻辑关系清晰。低内聚表示组件内的元素关联性较弱,每个元素的功能单一,组件的功能较为分散。

下面举一个 SpringBoot 开发中的高内聚的一个简单案例:

Controller 层

UserController.java

/**
 * @description: UserController
 * @date: 2023/6/23 22:58
 * @author: zdp
 * @version: 1.0
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/all")
	public ResponseEntity<List<User>> getAllUsers() {
    try {
        List<User> users = userService.getAllUsers();

        // 对获取到的用户列表进行一些处理或操作
        // ...

        // 返回成功响应,包含用户列表数据
        return ResponseEntity.ok(users);
    } catch (Exception e) {
        // 处理异常情况

        // 返回错误响应
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
    }
  }
}

Service 层

UserService.java

public interface UserService extends IService<User> {
    List<User> getAllUsers();
}

UserServiceImpl.java

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Autowired
    private UserMapper userMapper;
    @Override
    public List<User> getAllUsers() {
        return userMapper.getAllUsers();
    }
}

Mapper 层

UserMapper.java

@Mapper
public interface UserMapper extends BaseMapper<User> {
    void getAllUsers();
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">

    <!-- 定义getAllUsers方法的具体实现 -->
    <select id="getAllUsers" resultType="com.example.model.User">
        SELECT * FROM users
    </select>

</mapper>
  1. UserController 类负责处理与用户相关的请求,包括获取用户和创建用户。它依赖于 UserService 来处理具体的业务逻辑。

  2. UserService 类负责封装用户相关的业务逻辑,如获取用户和创建用户。它依赖于 UserMapper 来处理数据访问。

    这种设计使得每个类都有单一的指责,相互之间的依赖关系简单明了。每个类都关注特定的功能,实现了高内聚设计,使得代码更加模块化、易于维护和扩展。

耦合

耦合性(英语:Coupling)或称耦合力耦合度,是指一程序中,模块及模块之间信息或参数依赖的程度。

低耦合

下面举一个 SpringBoot 开发中的低耦合(相对低)的一个简单案例:

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/all")
	public ResponseEntity<List<User>> getAllUsers() {
    try {
        List<User> users = userService.getAllUsers();

        // 对获取到的用户列表进行一些处理或操作
        // ...

        // 返回成功响应,包含用户列表数据
        return ResponseEntity.ok(users);
    } catch (Exception e) {
        // 处理异常情况

        // 返回错误响应
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
    }
  }
}
  1. 依赖注入的方式:通过使用@Autowired注解,容器会自动将合适的UserService实现类注入到userService属性中。这种依赖注入的方式将依赖的创建和管理从类内部移动到外部,降低了类之间的直接耦合。
  2. 面向接口编程:UserController类仅依赖于UserService接口,而不依赖于具体的实现类。这种面向接口编程的方式使得代码更加灵活,可以轻松地切换或替换不同的UserService实现类。

而我们如果使用以下代码, 由于直接依赖于具体实现类,当需要更换或升级实现类时,需要修改UserController类的源代码。这使得代码具有较低的灵活性,增加了维护成本和风险:

public UserController() {
    userService = new UserServiceImpl(); // 直接实例化具体的实现类
}

总结

高内聚的优点:

  • 模块内部功能相关性强,代码组织结构清晰。
  • 提高代码的可读性和可维护性。
  • 方便模块的重用和扩展。
  • 减少代码的重复和冗余。

低耦合的优点:

  • 模块之间的依赖关系简单明确。
  • 提高代码的灵活性和可扩展性。
  • 降低了代码的维护成本。
  • 方便进行单元测试和模块替换。
  • 降低了代码的风险和错误传播。