- Published on
每日小知识点(十) - 高内聚和低耦合
- Authors
- Name
- DP Piggy
- @xiaozhudxiaozhu
内聚和耦合
内聚
内聚性(英语: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>
UserController
类负责处理与用户相关的请求,包括获取用户和创建用户。它依赖于UserService
来处理具体的业务逻辑。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);
}
}
}
- 依赖注入的方式:通过使用
@Autowired
注解,容器会自动将合适的UserService
实现类注入到userService
属性中。这种依赖注入的方式将依赖的创建和管理从类内部移动到外部,降低了类之间的直接耦合。 - 面向接口编程:
UserController
类仅依赖于UserService
接口,而不依赖于具体的实现类。这种面向接口编程的方式使得代码更加灵活,可以轻松地切换或替换不同的UserService
实现类。
而我们如果使用以下代码, 由于直接依赖于具体实现类,当需要更换或升级实现类时,需要修改UserController
类的源代码。这使得代码具有较低的灵活性,增加了维护成本和风险:
public UserController() {
userService = new UserServiceImpl(); // 直接实例化具体的实现类
}
总结
高内聚的优点:
- 模块内部功能相关性强,代码组织结构清晰。
- 提高代码的可读性和可维护性。
- 方便模块的重用和扩展。
- 减少代码的重复和冗余。
低耦合的优点:
- 模块之间的依赖关系简单明确。
- 提高代码的灵活性和可扩展性。
- 降低了代码的维护成本。
- 方便进行单元测试和模块替换。
- 降低了代码的风险和错误传播。