软件构造学习笔记第五章#1
运维是软件开发中最困难的环节,处理来自用户报告的故障/问题
纠错性:对BUG进行维护
适应性:例如吧APP从电脑移植到手机
完善性:软件的功能不足,对功能进行扩充
预防性:预见软件后期需要升级,为了适应后期的升级,对软件结构来进行很好的设计。
软件演化:对软件进行持续的更新
如现在大部分的成本都在维护阶段
可维护性指标度量方式:
1)圈复杂度CC=E-N+2, CC=P+1, CC = number of areas
E = 边数,N = 节点数,P = 判定的个数 number of areas:边组成的区域的个数
2)代码行数:行数越多越复杂
继承的层数,类之间的耦合度,单元测试覆盖度
模块化编程
1)高内聚:每个模块完成一个功能
2)低耦合:每个模块关联少
3)分离关注点:每个模块功能少
4)信息隐藏:模块的信息被隐藏
模块设计五种指标
可分解性:软件可以分成不同模块(每个模块有自己的功能,功能不能太多)。
可组合性:多个模块,把他们组合可以完成软件要求
可理解性:每个模块的类的职责清晰,每个操作有单独的类来完成
可持续性:发生变化时受到影响小
出现异常之后的保护:出现异常后影响范围小,波及的模块越少,异常保护的性能越好
帮助模块化设计的五个指标
直接映射
尽可能少的接口
尽可能小的接口
显示接口
信息隐藏
耦合和内聚
耦合:模块与模块之间的联系程度。耦合的极致就是把所有功能放到一个模块 里
策略模式主要用了2和5
单一责任原则SRP 开放封闭原则OCP open close
里氏替换原则LSP 接口分离规则 ISP 依赖注入或倒置原则DIP
高层和底层模块都应该依赖抽象
Creation Patterns
GRAPG(通用职责分配原则):程序有多个职责,应该怎么把职责分到各个类中。
工厂模式(创建模式) 用户不知道要创建哪个类的具体实例
定义一个用来创建具体对象的接口让它的子类来决定实例化哪个类
缺点:会引入额外的复杂性