模块
模块就是从逻辑上将系统分解为更细微的部分, 分而治之, 复杂问题拆解为若干简单问题, 逐个解决.
耦合主要描述模块之间的关系, 内聚主要描述模块内部. 模块的粒度可大可小, 可以是函数, 类, 功能块等等.
耦合
模块之间存在依赖, 导致改动可能会互相影响, 关系越紧密, 耦合越强, 模块独立性越差.
比如模块a直接操作了模块b中数据, 则视为强耦合, 若a只是通过数据与模块b交互, 则视为弱耦合.
独立的模块便于扩展, 维护, 写单元测试, 如果模块之间重重依赖, 会极大降低开发效率.
内聚
模块内部的元素, 关联性越强, 则内聚越高, 模块单一性更强. 一个模块应当尽可能独立完成某个功能,
如果有各种场景需要被引入到当前模块, 代码质量将变得非常脆弱, 这种情况建议拆分为多个模块.
低内聚的模块代码, 不管是维护, 扩展还是重构都相当麻烦, 难以下手.
接口设计原则
好的接口应当满足设计模式六大原则, 很多设计模式, 框架都是基于高内聚低耦合这个出发点的.
单一职责原则: 一个类只负责一个功能领域中的相应职责.
开闭原则: 一个软件实体应当对扩展开放,对修改关闭.
里氏代换原则: 所有引用基类(父类)的地方必须能透明地使用其子类的对象.
依赖倒转原则: 抽象不应该依赖于细节, 细节应当依赖于抽象. 换言之, 要针对接口编程, 而不是针对实现编程.
接口隔离原则: 使用多个专门的接口, 而不使用单一的总接口, 即客户端不应该依赖那些它不需要的接口.
迪米特法则: 一个软件实体应当尽可能少地与其他实体发生相互作用, 例如外观模式, 对外暴露统一接口.
举几个栗子
外观模式
为系统中多个子系统提供一致的对外调用, 对客户端隐藏子系统细节, 降低其与子系统的耦合.
桥接模式
jdbc中的把面向厂商的接口(driver)和面向使用者的api(drivermanager)做了拆分隔离.
// 开发者只需要关注jdbc api, 无需关注不同数据库driver接口实现class.forname(com.mysql.jdbc.driver);connection conn = drivermanager.getconnection(url, username, password);
适配器模式
引入第三方库(hibernate, log4j), 不应该直接在代码中继承或者使用其实体类.
需要抽出上层统一接口, 然后增加实现类, 对外暴露接口.
// 代码与log4j强耦合, 不推荐org.apache.log4j.logger.getrootlogger().info(info);// 底层可以随意更换log框架frloggerfactory.getlogger().info(info);
PIC单片机开发环境_PIC单片机引脚的三种状态
全球最具价值天价古董苹果电脑:翻1000倍!
三星存储器芯片和手机市场艰难主要有以下原因
LED照明测量标准及检测细节详解
WTK6900语音识别芯片概述及功能特点
图解高内聚与低耦合
真无线蓝牙耳机索尼WF-SP700N夏日健身好伙伴
刷脸支付火爆起来 人脸识别的变革与争议格外激烈
谷歌发布Pixel 4系列手机,配备人脸解锁功能
盘点蔚来汽车NIO DAY 2020发布会的亮点
使用负偏压萃取电极的方法
ML无线音响性能指标
鼠标的工作方式
视频会议系统概述
加密货币爱好者认为征税就是一种盗窃行为
电磁辐射源
未来机器人与人工智能系统发展趋势
芯片公司排名2019第三名
射频前端芯片GC1101替代RFX2401C用于2.4G无线壁挂音响
【回顾往年CES】大巨龙裸眼3D平板惊艳亮相