面向可维护性的构造技术
1 可维护性的常见度量指标
- 可维护性:“修改软件系统或组件以纠正故障、提高性能或其他属性,或适应变化的环境的容易程度”。
- 可扩展性:软件设计/实施考虑到未来的增长,并被视为对系统扩展能力和实现扩展所需努力水平的系统性度量。
- 灵活性:软件能够根据用户需求、外部技术和社会环境等进行轻松更改
- 可适应性:交互式系统(自适应系统)的一种能力,它可以根据所获取的有关其用户及其环境的信息,使其行为适应单个用户。
- 可管理性:如何高效、轻松地监控和维护软件系统,以保持系统的性能、安全性和平稳运行。
- 支持性:基于包括质量文档、诊断信息和知识渊博且可用的技术人员在内的资源,软件在部署后保持运行的有效性。
2 聚合度与耦合度
-
耦合是模块之间依赖性的度量。如果一个模块的更改可能需要另一个模块的更改,则两个模块之间存在依赖关系。
-
模块之间的耦合程度取决于:模块之间的接口数量(数量)和每个接口的复杂性
-
当耦合度较高时,内聚度往往较低,反之亦然。最好的设计在模块内具有高内聚性(也称强内聚性),模块之间具有低耦合性(也称弱耦合性)。
3 SOLID
- (SRP) The Single Responsibility Principle 单一责任原则
- 一个类只专注于一件事,责任是产生变化的原因。
- 按责任将大类拆分为多个小类,每个类完成单一职责
- (OCP) The Open-Closed Principle 开放-封闭原则
-
模块的行为应是可扩展的,从而该模块可表现出新的行为以满足需求的变化。
-
但模块自身代码不应该被修改,扩展模块行为的一般途径是修改模块的内部实现,如果一个模块不能被修改,那它常备认为具有固定的行为。
-
解决方案:抽象技术,类的行为用继承和委托机制
-
当需要变化时,通过扩展隐藏在接口之后的子类加以完成,而不要修改接口本身。
-
- (LSP) The Liskov Substitution Principle Liskov 替换原则
- 前置条件不能强化
- 后置条件不能弱化
- 保持不变量
- 子类型方法参数:逆变
- 子类型方法的返回值:协变
- 异常类型:协变
- 实现子类时遵守的规则
- (ISP) The Interface Segregation Principle 接口隔离原则
- 只提供客户必须的接口,避免接口污染、胖接口。
- 将胖接口分解为多个小接口,不同用户使用不同的接口,只能访问所需要的端口。
- 将接口拆分为多个小接口,规避不必要的耦合
- (DIP) The Dependency Inversion Principle 依赖转置原则
- 高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
- 抽象不应该依赖于实现细节,实现细节应该依赖于抽象。
- 委托的时候要通过interface建立联系。
- 核心是使用接口来缓冲,即将接口作为参数传入类中,作为临时变量或者成员变量。将接口的实现类和调用者隔离。
- 对接口编程,而不是对实现编程,通过抽象接口隔离变化
4 语法、正则表达式
-
基本符号
特殊字符 说明 “ ^
”匹配一行的开头。要匹配 ^ 字符本身,请使用 \^
$
匹配一行的结尾。要匹配 $ 字符本身,请使用 \$
()
标记子表达式的开始和结束位置。要匹配这些字符,请使用 \(
和\)
[]
用于确定中括号表达式的开始和结束位置。要匹配这些字符,请使用 \[
和\]
{}
用于标记前面子表达式的出现频度。要匹配这些字符,请使用 \{
和\}
*
指定前面子表达式可以出现零次或多次。要匹配 * 字符本身,请使用 \*
+
指定前面子表达式可以出现一次或多次。要匹配 + 字符本身,请使用 \+
?
指定前面子表达式可以出现零次或一次。要匹配 ?字符本身,请使用 \?
.
匹配除换行符\n之外的任何单字符。要匹配.字符本身,请使用 \.
\
用于转义下一个字符,或指定八进制、十六进制字符。如果需匹配\字符,请用 \\
` ` 预定义字符 说明 .
可以匹配任何字符 \d
匹配 0~9 的所有数字 \D
匹配非数字 \s
匹配所有的空白字符,包括空格、制表符、回车符、换页符、换行符等 \S
匹配所有的非空白字符 \w
匹配所有的单词字符,包括 0~9 所有数字、26 个英文字母和下画线_ \W
匹配所有的非单词字符 使用时都是
\\
,如\\d
-
简单组合
正则表达式 匹配 x 指定字符x . 任意单个字符,换行符除外 (ab cd) [abc] a或b或c(中括号表示或) [^abc] 除了a、b和c以外的任意字符 [a-z] a到z [^a-z] 除了a到z以外的任意字符 [a-e[m-p]] a到e、或m到p [a-e&&[c-p]] a到e与c到p的交集 p* p出现0次或者多次 p+ p出现1次或者多次 p? p出现0次或者1次 p{n} 正好出现n次模式p p{n,} 至少出现n次模式p p{n,m} n到m(不包含)次出现模式p (ab){3} 匹配ababab ab{3} 匹配abbb(大括号优先向左结合) -
支持正则表达式的String对象的方法
- match()
- 判断能否在str中找到regex
boolean flag = str.matches(regex); boolean flag = str.matches("1[38]\\d{9}"); //13或者18开头
- split( )
- 用regex把字符串分隔开来,返回String数组
String[] ss = s.split(regex); String[] ss = s.split("-");//用"-"分割
- replace替换
- replaceFirst(String replacement)将字符串里,第一个与模式相匹配的子串替换成replacement。
- replaceAll(String replacement),将输入字符串里所有与模式相匹配的子串全部替换成replacement
String result = s.replaceAll(regex,ss); String result = s.replaceAll("\\d","*");//所有数字替换成* String result = s.replaceFirst(regex,ss); String result = s.replaceFirst("\\d","*");//第一个数字替换成*