本章讲解面向可维护性的编程概念,通过合理的设计来让软件能够以较小的代价完成更新来适应新的需求。
(一)常用的评判可维护性的指标
指标则可以包括继承的层次数、类之间的耦合度、单元测试的覆盖度等。
以及可维护性指数MI,通过数个参数的计算得出。
(二)模块化设计和模块化原则
高内聚,低耦合,分离关键点和信息隐藏
设计特性如下
二模块化设计的五条规则为:
直接映射:模块设计与现实问题保持一致(可持续性,可分解性)
少接口:模块尽可能减少与其他模块的通讯
小接口:模块间通讯交换的信息尽可能少
显式接口:A与B的通讯应明显地发生在其接口之间。
信息隐藏:总是变化的部分要隐藏在抽象接口后面。
(三)耦合(Coupling)和内聚(Cohesion)
耦合是模块之间的依赖程度,内聚则是一个模块内部的方法和表示的联系程度。
好的设计应该高内聚低耦合。
(四)SOLID原则:五个设计类的原则
SRP
ADT中不应有一个以上的原因让其发生变化,否则就应当拆分开。责任指变化的原因。
反例:
OCP
对扩展性的开放——模块的行为可扩展,以新行为满足需求变化;对修改的封闭——模块自身代码不应修改,例子:
LSP
子类能够替换基类的设计,不再赘述
ISP
只为客户端提供必须的接口,不强迫其依赖不需要的接口。将胖接口分割为不同的接口,每个客户端调用对应的接口,其中没有不需要的方法。
DIP
高层模块和底层模块都应依赖于抽象,抽象不应依赖于具体实现,具体实现应依赖于抽象。也就是在进行委派时要依靠接口而非具体类。
例子:
OO设计可总结为两种手段:抽象与分离,分别对应着SOLID的几个原则
(五)语法驱动构造
语法分析树包括产生式节点和终止节点(用引号‘’引起)。
语法中的操作:等于::=,链接加空格,重复*(0或多个),选择|(二选一)
其他操作:?——前一个字符可能出现也可能没有。
+——y+等价于yy*
[ ]——[a-e]即a到e中的某一个字符,等价于[abcde]但后者可以更方便的裁剪范围
[^...]——[^a-c]指d到z中的某一个字符(取反的意思)
语法允许递归存在,比如x::=('a'x'c')|'b'
语法分析树
如最后都已终结符号作为叶节点。
正则语法和正则表达式
正则语法去除了非字符的空格和引号,更加紧凑。特殊符号当作为字符串的一部分时需要加转义符\,如\+、\*等。添加了一些特殊表达如下
实例:
在java中应用正则表达式:
实际使用:
java中的一些符号举例:
量词方面:
例如
边界符号