10.面向可维护性的构造技术

面向可维护性的构造技术

1 可维护性的常见度量指标

  • 可维护性:“修改软件系统或组件以纠正故障、提高性能或其他属性,或适应变化的环境的容易程度”。
  • 可扩展性:软件设计/实施考虑到未来的增长,并被视为对系统扩展能力和实现扩展所需努力水平的系统性度量。
  • 灵活性:软件能够根据用户需求、外部技术和社会环境等进行轻松更改
  • 可适应性:交互式系统(自适应系统)的一种能力,它可以根据所获取的有关其用户及其环境的信息,使其行为适应单个用户。
  • 可管理性:如何高效、轻松地监控和维护软件系统,以保持系统的性能、安全性和平稳运行。
  • 支持性:基于包括质量文档、诊断信息和知识渊博且可用的技术人员在内的资源,软件在部署后保持运行的有效性。

2 聚合度与耦合度

  • 耦合是模块之间依赖性的度量。如果一个模块的更改可能需要另一个模块的更改,则两个模块之间存在依赖关系。

  • 模块之间的耦合程度取决于:模块之间的接口数量(数量)和每个接口的复杂性

  • 当耦合度较高时,内聚度往往较低,反之亦然。最好的设计在模块内具有高内聚性(也称强内聚性),模块之间具有低耦合性(也称弱耦合性)。

3 SOLID

  1. (SRP) The Single Responsibility Principle 单一责任原则
    • 一个类只专注于一件事,责任是产生变化的原因。
    • 按责任将大类拆分为多个小类,每个类完成单一职责
  2. (OCP) The Open-Closed Principle 开放-封闭原则
    • 模块的行为应是可扩展的,从而该模块可表现出新的行为以满足需求的变化。

    • 但模块自身代码不应该被修改,扩展模块行为的一般途径是修改模块的内部实现,如果一个模块不能被修改,那它常备认为具有固定的行为。

    • 解决方案:抽象技术,类的行为用继承和委托机制

    • 当需要变化时,通过扩展隐藏在接口之后的子类加以完成,而不要修改接口本身。

  3. (LSP) The Liskov Substitution Principle Liskov 替换原则
    • 前置条件不能强化
    • 后置条件不能弱化
    • 保持不变量
    • 子类型方法参数:逆变
    • 子类型方法的返回值:协变
    • 异常类型:协变
    • 实现子类时遵守的规则
  4. (ISP) The Interface Segregation Principle 接口隔离原则
    • 只提供客户必须的接口,避免接口污染、胖接口。
    • 将胖接口分解为多个小接口,不同用户使用不同的接口,只能访问所需要的端口。
    • 将接口拆分为多个小接口,规避不必要的耦合
  5. (DIP) The Dependency Inversion Principle 依赖转置原则
    • 高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
    • 抽象不应该依赖于实现细节,实现细节应该依赖于抽象。
    • 委托的时候要通过interface建立联系。
    • 核心是使用接口来缓冲,即将接口作为参数传入类中,作为临时变量或者成员变量。将接口的实现类和调用者隔离。
    • 对接口编程,而不是对实现编程,通过抽象接口隔离变化

4 语法、正则表达式

  1. 基本符号

    特殊字符说明
    ^匹配一行的开头。要匹配 ^ 字符本身,请使用\^
    $匹配一行的结尾。要匹配 $ 字符本身,请使用\$
    ()标记子表达式的开始和结束位置。要匹配这些字符,请使用\(\)
    []用于确定中括号表达式的开始和结束位置。要匹配这些字符,请使用\[\]
    {}用于标记前面子表达式的出现频度。要匹配这些字符,请使用\{\}
    *指定前面子表达式可以出现零次或多次。要匹配 * 字符本身,请使用\*
    +指定前面子表达式可以出现一次或多次。要匹配 + 字符本身,请使用\+
    ?指定前面子表达式可以出现零次或一次。要匹配 ?字符本身,请使用\?
    .匹配除换行符\n之外的任何单字符。要匹配.字符本身,请使用\.
    \用于转义下一个字符,或指定八进制、十六进制字符。如果需匹配\字符,请用\\
    ``
    预定义字符说明
    .可以匹配任何字符
    \d匹配 0~9 的所有数字
    \D匹配非数字
    \s匹配所有的空白字符,包括空格、制表符、回车符、换页符、换行符等
    \S匹配所有的非空白字符
    \w匹配所有的单词字符,包括 0~9 所有数字、26 个英文字母和下画线_
    \W匹配所有的非单词字符

    使用时都是\\,如\\d

  2. 简单组合

    正则表达式匹配
    x指定字符x
    .任意单个字符,换行符除外
    (abcd)
    [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(大括号优先向左结合)
  3. 支持正则表达式的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","*");//第一个数字替换成*
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SolemnJudgment

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值