软件构造 面向可维护性的构造技术
程序员文章站
2024-02-09 15:50:04
...
一、基于状态的编程
1、状态模式
对象有一个状态属性,并且可以变化。
形式如下,context是某一个对象,它有属性state(状态),状态在一定的条件下会跳转至另一状态;用一个State接口来表示状态、定义状态间的转换:
举个例子,下图是一个有状态的ADT,他可以变换自己的状态(move):
状态类如下,每一个状态继承一个状态接口,有状态转换(move)、是否接收状态(accept)方法:
注意,这里的状态类使用单例模式:1、构造函数要是private的;2、变量是静态的。
2、备忘录模式
记录某对象的历史状态,以便于“回滚”。
形式如下,一个目标ADT(Originator),需要记录它的各个状态;一个Memento了,这个类记录状态;Caretaker负责管理各个历史状态:
举个例子,originator类如下,它可以保存状态(创建一个Memento)、恢复到过去的某个状态(restore):
memento类如下,记录某一时刻的状态:
caretaker类如下,管理一系列的历史状态:
客户端代码如下:
二、基于语法的构造
使用语法判断字符串是否合法。
1、语法的构成
由非终止节点和终止节点构成,非终止节点可以派生出新的字符串,例如下图的hostname就是非终止节点,’mit.edu’等就是终止节点:
2、语法操作符
最基础的仨:
高级一点的:“?”代表0个或1个;“+”代表一个或多个;“[…]”代表这个范围的字符,例如[a-c]代表a、b、c,[ae]代表a、e;“[^…]”代表不在这里的字符,例如[^a-c]代表除了abc之外的字符。
3、语法中的递归、语法解析树
语法可以为递归的形式,如下图的hostname即是递归的:
其语法树形式如下:
以MarkDown语言和HTML语言为例,MarkDown语言中,被两个“_”夹在中间的字符串会被解析成斜体;HTML语言中,被<i>和</i>夹在中间的是斜体,其语法规则、语法树如下:
4、正则语法
如果一个语法规则可以被表示为一个产生式并且不包含任何非终止节点,这就是正则语法。例子如下,下图的url可以被一句不含非终止节点的表达式表示,故是正则的:
正则表达式就是去掉了普通表达式的空格和引号,变得更简洁、难懂,举个例子,如果想要去掉下图中所有被含有<>的字符串:
可以这样构造regex:
正则表达式中有一些特殊意义的字符,例如”.”,可以代表任意一个字符。当想要在正则表达式中匹配“.”这个字符的话,需要在前面加上“\”。
正则表达式中一些简写: