维护是软件开发中最困难的工作之一,它包括处理来自用户报告的故障或问题、满足新增的软件需求等。软件工程的主要目的就是提高软件的可维护性、减少软件维护所需要的工作量、降低软件系统的总成本。本文将介绍一些关于面向可维护性软件构造的准则和方法。
一。模块化的标准与规则
模块化编程可以使整个项目分工明确,条理清晰,易于阅读,便于移植,最重要的是能极大提升项目的可维护性。模块化编程具有高内聚低耦合,分离关注点、隐藏信息等特点,对于模块化的评估具有以下五个标准:
可分解性:项目中的大型组件是否能划分为几个小组件
可组合性:项目中的大型组件是否能由几个小组件组合而成
可理解性:项目中每个单独的组件功能是否都是可以理解的
可持续性:对项目规约进行更改时是否只会影响少量的组件
出现异常之后的保护:出现异常时是否只会影响相关的部分组件
此外模块化设计还有五大规则,分别是:直接映射,尽可能少的接口,尽可能小的接口,显示接口,信息隐藏。
二。面向对象的SOLID设计原则
1.单一责任原则(SRP)
单一责任原则是指一个类改变的原因不应该超过一个。一个类应该专注于单一功能。该 原则有助于保持代码的可维护性、灵活性和易于理解。因为具有多重职责的类往往紧密耦 合,因此很难在不影响其他职责的情况下更改一项职责。这使得代码库脆弱且难以维护。
2.开放封闭原则(OCP)
开放封闭原则要求编写的内容对拓展性保持开放,对修改保持封闭。这意味着模块的行 为应是可扩展的,从而该模块可表现出新的行为以满足需求的变化。但模块自身的代码是 不应被修改的,扩展模块行为的一般途径是修改模块的内部实现。
3.Liskov替换原则(LSP)
Liskov替换原则要求一个对象在其出现的任何地方,都可以用子类实例做替换,并且不 会导致程序的错误。即派生类必须能够通过其基类的接口使用,客户端无需了解二者之间 的差异。
4.接口隔离原则(ISP)
接口隔离原则表明客户端不应该被强迫实现一些他们不会使用的接口,应该把"胖"接口 中的方法分组,然后用多个接口替代它,每个接口服务于一个子模块。简单地说,就是使 用多个专门的接口比使用单个接口要好很多。
5.依赖转置原则(DIP)
依赖转置原则是指抽象的模块不应该依赖于具体的模块,具体模块应当依赖于抽象模 块。换言之,要针对接口编程,而不是针对实现细节编程。
三.语法驱动的构造
语法驱动编程,是指以语言的语法为基础去描述程序的执行,由程序将这些语法转换为代码。在这个过程中,只有编写正确的正则表达式,就可以高效的提取文本中的信息并略过无用的干扰项,具有很高的效率。但同时这也意味着可读性的受限,必须使用特定的语法和规则会使代码难以理解。
语法构造的基本过程:
对于利用语法的构造编程,首先应该明确以下几个概念:
终止符:终止符应该为不能再继续变化为其他字符的符号,如果将语法表达式的演化推导过 程转化为一棵语法分析树,那么树的所有叶子节点都必须是终结符,在定义语法时应该明确 终止符的集合,显然操作符应该算作终止符。
非终止符:这类字符可以依据设计的派生式产生匹配到不同形式的或终结符或非终结符所构 成的新串,相对应的就是语法分析树中的非叶节点,根节点一定是非终止符。
操作:这里所说的操作不是为字符串间加上加减乘除号使之能够运算。最基本的操作分为三 种,连接,重复,选择。以串x、y、z为例,
x ::= yz(x匹配y和z连接后的串);
x ::= y*(x匹配任意次y的重复所构成的串);
x ::= y|z(x匹配y或匹配z)。
除此之外,经常用到的符号有?、+、[ ]、[^…] :
x ::= y?表示x ::= y|e(e为什么都没有);
x ::= y+表示x ::= yy*;
x ::= [a-z]表示x为一个小写字母,即x可以匹配中括号中填的所有字符;
x ::=[^a] 与之相对的则表示在这些元素所在的全集中刨除这些元素后的字符可以被x匹配。
上述即为我对面向可维护的构造技术的一点理解,希望能在巩固自身掌握的同时为其他阅读者带来一点收获。💪