第六章--第三节:面向可维护性的构造技术
第六章:面向软件构造的可复用性的构建方法
第三节:面向可维护性的构造技术
问题一:面向可维护性构造的分类
- 基于状态的构造(State-based construction)
- 表驱动的构造(Table-driven construction)
- 基于语法的构造(Grammar-based construction)
问题二:基于状态的构造(State-based construction)
基于状态的编程:使用有限状态机来定义程序的行为、控制程序的执行(根据当前状态,决定下一步要执行什么操作、执行操作之后要转移到什么新的状态)
1.基于自动化的编程(Automata-based programming)
核心思想:将程序看作是一个有限状态自动机,侧重于对“状态”及“状态转换”的抽象和编程
方法:程序的执行被分解为一组自动执行的步骤。各步骤之间的通讯通过“状态变量”进行。程序执行就可看作是各自动步骤的不断循环。使用枚举类型enum定义状态。使用二维数组定义状态转换表。(See Wikipedia: https://en.wikipedia.org/wiki/State_transition_table)
2.状态模式(State Pattern)
模式图:
*例:
3.备忘录模式(Memento Pattern)
用途:记住对象的历史状态,以便于“回滚”
设计原则:
- 需要“备忘”的类
- 添加originator的备忘记录和恢复
- 备忘录,记录originator对象的历史状态
*例:
问题三:基于表驱动的构造
核心思想:将代码中复杂的if-else和switch-case语句从代码中分离出来,通过“查表”的方式完成,从而提高可维护性
问题四:语法驱动的构造(Grammar-based construction)
场景:
- 有一类应用,从外部读取文本数据,在应用中做进一步处理。
- 输入文件有特定格式,程序需读取文件并从中抽取正确的内容
- 从网络上传输过来的消息,遵循特定的协议
- 用户在命令行输入的指令,遵顼特定的格式
- 内存中存储的字符串,也有格式需要
方法:
- 使用grammar判断字符串是否合法,并解析成程序里使用的数据结构(通常是递归的数据结构)
- 正则表达式
- 根据语法生成它的解析器,用于后续的解析
1.语法的成分:terminals 终止节点、叶节点、nonterminal 非终止节点(遵循特定规则,利用操作符、终止节点和其他非终止节点,构造新的字符串)
2.语法中的操作符
基础语法:
- – Concatenation, represented not by a symbol, but just a space
- – Repetition, represented by *
- – Union, also called alternation, represented by |
-
x 等价于 y后跟一个z
-
x 等价于 0个或更多个y
-
x 等价于一个y或者一个z
组合语法:
- – Optional (0 or 1 occurrence), represented by ?
- – 1 or more occurrences: represented by +
- – A character class [...], representing the length-1 strings containing any ofthe characters listed in the square brackets
- – An inverted character class [^...], representing the length-1 stringscontaining any character not listed in the brackets
-
x 等价于一个y或者一个空串
-
x 等价于一个或者更多个y
-
-
(*, ?, and +有最高的优先级;|优先级最低)
*例:
**练习:
问题五:语法驱动构造示例---URL
问题六:语法驱动构造示例---Markdown and HTML
问题七:正则语法和正则表达式
1.正则语法(Regular grammar):简化之后可以表达为一个产生式而不包含任何非终止节点
2.正则表达式(regex):去除引号和空格,从而表达更简洁(更难懂)
问题八:在java中使用正则表达式
使用场合:
1.用一个空格取代所有的多个空格
2.匹配一个URL
3.提取HTML标签的一部分
附:
更详细的叙述: