第六章--第三节:面向可维护性的构造技术

第六章:面向软件构造的可复用性的构建方法

第三节:面向可维护性的构造技术


问题一:面向可维护性构造的分类

  1. 基于状态的构造(State-based construction)
  2. 表驱动的构造(Table-driven construction)
  3. 基于语法的构造(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.语法中的操作符

    基础语法:

  1. – Concatenation, represented not by a symbol, but just a space
  2. – Repetition, represented by *
  3. – Union, also called alternation, represented by |
  • 第六章--第三节:面向可维护性的构造技术 x 等价于 y后跟一个z
  • 第六章--第三节:面向可维护性的构造技术 x 等价于 0个或更多个y
  • 第六章--第三节:面向可维护性的构造技术 x 等价于一个y或者一个z

    组合语法:

  1. – Optional (0 or 1 occurrence), represented by ?
  2. – 1 or more occurrences: represented by +
  3. – A character class [...], representing the length-1 strings containing any ofthe characters listed in the square brackets
  4. – 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标签的一部分

第六章--第三节:面向可维护性的构造技术

附:

第六章--第三节:面向可维护性的构造技术

第六章--第三节:面向可维护性的构造技术

第六章--第三节:面向可维护性的构造技术

第六章--第三节:面向可维护性的构造技术

更详细的叙述:

点击打开链接