java 高内聚是面向对象设计里面非常重要的设计思想,经常和低耦合搭配出现,高内聚的含义就是一个类或者一个模块内部,所有方法和成员变量都围绕同一个单一职责,模块内部功能紧密相关,不要把多种不相关业务塞进同一个类里面。很多新手写 Java 代码的时候,习惯把用户订单支付日志全部写在一个大类里面,这就是典型低内聚,后期修改业务的时候改动范围大,代码很难维护。高内聚的目标就是让每个类只干一件事,类内部代码联系紧密,职责单一,配合低耦合,就能写出易扩展易维护的 Java 项目,这个思想在 SSM SpringBoot 项目开发还有面试当中都是高频考点。想要实现 java 高内聚,可以先理解单一职责原则,再拆分臃肿大类,把不同业务独立成类,检查类里面方法是否属于同一个业务目标,持续重构优化代码。
基础信息表
| 项目 | 内容 |
|---|---|
| 概念名称 | 高内聚 |
| 所属领域 | Java 面向对象 软件设计原则 |
| 配套概念 | 低耦合 |
| 核心依据 | 单一职责原则 SRP |
| 应用场景 | 类设计 模块划分 分层架构 DAO Service Controller |
高内聚核心定义深度讲解
内聚描述的是类或者模块内部各个元素之间的关联紧密程度,内聚越高,代表这个类里面所有方法属性,都是为了完成同一个业务目标,功能集中,职责纯粹。
举个例子,UserService 这个类,只处理用户相关业务,用户注册 用户查询 用户更新 用户删除,这些方法全部围绕用户业务,这就是高内聚。
反面例子,UserService 里面同时写用户业务,订单计算,短信发送,日志打印,多个无关业务混在一起,内聚就很低。
内聚等级 从低到高
| 内聚等级 | 说明 |
|---|---|
| 偶然内聚 | 类里面方法没有关联,随便堆在一起,最差 |
| 逻辑内聚 | 同类操作但是业务目标不一样 |
| 时间内聚 | 同一时间执行的功能放在一起 |
| 过程内聚 | 按照执行流程串联的功能 |
| 通信内聚 | 操作同一份数据的功能 |
| 顺序内聚 | 前一个方法输出是下一个方法输入 |
| 功能内聚 | 最高等级,所有方法共同完成单一功能,也就是我们追求的高内聚 |
java 项目里面高内聚的落地方式
1 分层架构实现高内聚
Controller 层 只负责接收请求 参数校验 调用 Service
Service 层 专门写业务逻辑
DAO Mapper 层 专门数据库增删改查
每一层职责固定,层内部代码围绕本职工作,就是高内聚典型应用
2 类拆分重构
原本巨大的 God 类上帝类,按照业务拆分成多个独立类,比如订单计算单独 OrderCalcService,通知单独 NotifyService
3 遵守单一职责原则
一个类只有一个引起修改的原因,如果一个类因为两个不同业务需求都要修改,就说明这个类需要拆分
高内聚和低耦合的区别
高内聚关注的是模块内部,内部功能要集中单一
低耦合关注的是模块外部,模块之间相互依赖程度要尽量小
两个原则经常一起使用,高内聚一般也更容易做到低耦合
常见误区
1 误区 高内聚就是类里面方法数量越少越好
纠正 不是方法数量少,是方法业务目标统一,就算类里面方法很多,全部都是同一业务,依然属于高内聚
2 误区 高内聚等于不能修改类
纠正 高内聚是职责单一,业务本身迭代的时候仍然可以修改这个类,只是不会因为无关业务被迫改动
3 误区 只要高内聚代码就一定优秀
纠正 高内聚是设计原则,还要同时兼顾低耦合,过度拆分也会造成类数量爆炸,增加系统复杂度
【常见问题】
问题 1 java 高内聚和单一职责原则是什么关系
回答 1 java 高内聚是设计效果,单一职责原则是实现高内聚的核心手段,按照单一职责拆分类,最终就能达到高内聚的设计目标。
问题 2 java 高内聚是不是必须和低耦合一起理解
回答 1 java 高内聚经常和低耦合成对出现,高内聚管模块内部,低耦合管模块之间依赖,做 Java 设计的时候一般两个原则同时考虑。
问题 3 java 高内聚在 SpringBoot 项目里面怎么体现
回答 1 java 高内聚在 SpringBoot 项目主要体现在分层设计,Controller Service Mapper 各自职责独立,每个 Service 只负责对应的业务模块,不会混杂其他无关业务逻辑。
【免责申明】
本内容仅针对 java 高内聚设计原则教学科普,不同教材对内聚等级划分表述略有差别,面试答题可以结合教材版本调整描述,不代表唯一标准答案。


