【軟件構造】第六章第三節 面向可維護的構造技術

第六章第三節 面向可維護的構造技術

學了這麼多OO設計模式,不外乎都是 delegation + subtying,萬變不離其宗。html

除了OO,還有什麼其餘可以提高軟件可維護性的構造技術?——本節從委派+子類型跳出來,學習如下三個方面: 
(1) 基於狀態的構造技術 (2) 表驅動的構造技術 (3) 基於語法的構造技術java

Outline

  • 基於狀態的構造技術
    • 狀態模式(State Pattern)
    • 備忘錄模式(Memento Pattern)
  • 基於語法的構造技術
  • 正則語法與正則表達式

Notes

## 基於狀態的構造技術

【狀態模式(State Pattern)】正則表達式

【備忘錄模式(Memento Pattern)】設計模式

 

## 基於語法的構造技術

【運用場景】markdown

  • 有一類應用,從外部讀取文本數據, 在應用中作進一步處理。 具體來講,讀取的一個字節或字符序列多是:
  • 輸入文件有特定格式,程序需讀取文件並從中抽取正確的內容。
  • 從網絡上傳輸過來的消息,遵循特定的協議。
  • 用戶在命令行輸入的指令,遵頊特定的格式。
  • 內存中存儲的字符串,也有格式須要。

對於這些類型的序列,語法的概念是設計的一個好選擇:網絡

  • 使用grammar判斷字符串是否合法,並解析成程序裏使用的數據結構 。
  • 正則表達式
  • 一般是遞歸的數據結構 。

【語法成分】數據結構

terminals 終止節點、葉節點學習

nonterminal 非終止節點(遵循特定規則,利用操做符、終止節點和其餘非終止節點,構造新的字符串)google

【語法中的操做符】

  • 三個基本語法的操做符:
    • 鏈接,不是經過一個符號,而是一個空間:
      • x ::= y z //x等價於y後跟一個z
    • 重複,以*表示:                                   
      •  x ::= y* // x等價於0個或更多個y
    • 聯合,也稱爲交替,如圖所示 | :         
      • x ::= y | z //x等價於一個y或者一個z
  • 三個基本操做符的組合:
    • 可選(0或1次出現),由?表示:
      • x ::= y? //x等價於一個y或者一個空串
    • 出現1次或屢次:以+表示:          
      • x ::= y+ //x等價於一個或者更多個y, 等價於 x ::= y y*
    • 字符類[…],表示長度的字符類,包含方括號中列出的任何字符的1個字符串:
      • x ::= [abc] //等價於 x ::= 'a' | 'b' | 'c'
    • 否認的字符類[^…],表示長度,包含未在括號中列出的任何字符的1個字符串:
      • x ::= [^abc] //等價於 x ::= 'd' | 'e' | 'f' | ... (all other characters in Unicode)
  • 例子:
    • x ::= (y z | a b)* //an x is zero or more y z or a b pairs
    • m ::= a (b|c) d //an m is a, followed by either b or c, followed by d

【實例:使用語法構造URL】url

hostname能夠有兩個以上的部分,而且能夠有一個可選的端口號:http://didit.csail.mit.edu:4949/ 
爲了處理這樣的字符串,語法能夠這樣寫: 

 

 

【Markdown 和 HTML的語法】

 

 

 ## 正則語法與正則表達式

  • 正則語法:簡化以後能夠表達爲一個產生式而不包含任何非終止節點。 
  • 正則語法示例:
//Rugular!
url ::= 'http://' ([a-z]+ '.')+ [a-z]+ (':' [0-9]+)? '/'

//Regular!
markdown ::= ([^_]* | '_' [^_]* '_' )* 

//Not Regular!
html ::= ( [^<>]* | '<i>' html '<i>' )*

 

  •  正則表達式(regex):去除引號和空格,從而表達更簡潔(更難懂)
  • 在Java中使用正則表達式
    • 適用場合:咱們用正則表達式匹配字符串(例如 String.split , String.matches , java.util.regex.Pattern
    • 用一個空格代替全部的多個空格   
    • 匹配一個URL:
    • 提取HTML標籤的一部分

       

附:正則語法

 

 【解釋器模式( Interpreter Pattern)】

相關文章
相關標籤/搜索