學了這麼多OO設計模式,不外乎都是 delegation + subtying,萬變不離其宗。html
除了OO,還有什麼其餘可以提高軟件可維護性的構造技術?——本節從委派+子類型跳出來,學習如下三個方面:
(1) 基於狀態的構造技術 (2) 表驅動的構造技術 (3) 基於語法的構造技術java
【運用場景】markdown
對於這些類型的序列,語法的概念是設計的一個好選擇:網絡
【語法成分】數據結構
terminals 終止節點、葉節點學習
nonterminal 非終止節點(遵循特定規則,利用操做符、終止節點和其餘非終止節點,構造新的字符串)google
x ::= y z //x等價於y後跟一個z
x ::= y* // x等價於0個或更多個y
x ::= y | z //x等價於一個y或者一個z
x ::= y? //x等價於一個y或者一個空串
x ::= y+ //x等價於一個或者更多個y, 等價於 x ::= y y*
x ::= [abc] //等價於 x ::= 'a' | 'b' | 'c'
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
url ::= 'http://' [a-z]+ '.' [a-z]+ '/'
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>' )*
附:正則語法