本文姍姍來遲,,見諒,!
5. 基于標記的模式標注 美國德克薩斯大學達拉斯分校的Jing Dong等人提出了一種基于標記的模式標注方法(Tagged Pattern Notation)。該方法通過向原有結構圖中附加標記值(Tagged Value)的方式來對模式信息進行標注,,每一個類可使用“{pattern[instance]:role}”的方式來描述,,例如“{Adapter[1]:Target}”表示該類在第一個適配器模式實例中充當抽象目標類角色。如果不存在模棱兩可的情況,,可以對描述方式進行簡化,,例如某個類只出現(xiàn)在某個模式的唯一實例中,則可簡化為“{pattern:role}”,,如果某個類只與一個模式的一個實例相關,,則可進一步簡化為“{role}”。在這種標注方法中,,可以加入多個標記值來對同時充當多種模式的某一角色的類進行標注,;在標注時沒有增加一些額外的符號和線段,因此沒有給結構圖的復雜度帶來太多影響,;此外,,該方法還可以標注屬性、方法等細節(jié)信息,,這是目前最好的模式標注方法之一,,如圖6所示。但是該方法也存在一些問題,,很多已有的CASE工具不能夠方便地增加標記值,,需要通過編程來擴展它們的功能,加大使用的難度,;此外,,它沒有提供一種在源代碼中標注模式信息的方式,如果開發(fā)人員希望在實現(xiàn)過程中記錄模式信息,,該方法尚未提供相應的標注方案,。
(偶不知道Jing Dong同志用啥工具畫的此圖,我用Visio畫的,,畫得好辛苦,,,找了好幾個工具,發(fā)現(xiàn)都沒有辦法增加Tagged Value,,郁悶?。?img doc360img-src='http://image105.360doc.com/DownloadImg/2017/03/3114/95369200_4.gif' alt="大哭" src="http://image105.360doc.com/DownloadImg/2017/03/3114/95369200_4.gif" style="border: none; max-width: 100%;">) 個人觀點:該方法不太復雜,,但是貌似很多CASE工具增加標記值都不是特別方便,!
6. 基于UML Profile的模式標注 基于UML Profile的模式標注方法(A UML Profile for Design Patterns Notation)也是由Jing Dong(真是牛人啊,,弄出這么多方法,據(jù)此還發(fā)了幾篇不錯的文章,,有TSE哦,,)等人提出來的,該方法結合了UML的兩種擴展機制:衍型(Stereotype)和標記值(Tagged Value),,在該方法中,,使用衍型<<PatternClass>>來標注某個類是設計模式的一部分,使用衍型<<PatternAttribute>>來標注某個屬性是設計模式的一部分,,使用衍型<<PatternOperation>>來標注某個方法是設計模式的一部分,;然后再使用標記值對上述三種衍型進行詳細的描述,對于類而言,,標記值的格式為{role@pattern[instance]}[1..*],,role表示模式角色名,pattern表示設計模式名,,instance表示實例編號,[1..*]表示這種標注格式對于一個類來說可以重復1次或多次(一個類可以在多個模式實例中充當相應的角色),,對于方法和屬性而言,,標注方法與類的標注方法相似。使用基于UMLProfile的模式標注方法的標注實例如圖7所示,。
(偶一直未能找到一個UML Profile的最恰當?shù)姆g) 個人觀點:該方法還是略為有點復雜,,包含了一些重復信息,圖會變得有點大,!
7. 基于衍型的設計模式標注方法 Stefan Berner等最早將衍型用于標注模式信息,,他們將衍型分為四類,分別是裝飾衍型(Decorative Stereotype),、描述衍型(Descriptive Stereotype),、限制衍型(Restrictive Stereotype)和重定義衍型(Redefining Stereotype)。通過衍型可以給UML模型元素增加一些屬性或者描述信息,,但是Berner的衍型標注并不完備,,沒有提供一套完整的衍型標注方式,缺乏對屬性和方法等的描述,,也未提供源代碼中模式信息的標注方案,。之后,Jing Dong等人提出了一些通過擴展UML來對設計模式進行可視化的方法,,其中就包括使用衍型來描述類圖中的模式信息,,但是其標注形式較為復雜,需要同時通過衍型和標記值來表示與模式相關的信息,,由于標注語句太長,,該方法的使用受到一定的局限,;與其他方法類似,Jing Dong等人提出的模式信息標注方法也未提供源代碼標注方案,。 基于Berner和Jing Dong等人的工作,,我們提出了一套完整、簡單,、且容易通過現(xiàn)有CASE工具實現(xiàn)的設計模式標注方法——基于衍型的模式標注(Stereotype Based Pattern Notation, SBPN),,該方法結合了現(xiàn)有模式標注方法的優(yōu)點,既可以對結構圖中的模式信息進行標注,,還可以用于對源代碼中的模式信息進行標注,。SBPN沒有給原有圖形增加任何額外的圖形元素,標注方式簡單易學,,可以容易在學術界和工業(yè)界推廣,。SBPN既可以用于標注類圖,還可以用于標注交互圖和源代碼,。 在SBPN方法中,,可以通過在結構圖(類圖)中直接增加衍型來標注模式信息,標注規(guī)則如下: 【規(guī)則一】如果某個類只與某個設計模式的一個實例相關,,則通過<<PatternName:RoleName>>的形式標注,,其中PatternName表示模式名,RoleName表示對應的模式角色名,,如<<Composite:Leaf>>,。 【規(guī)則二】如果某個類涉及某個設計模式的多個實例,為了不引起歧義,,更好地理解該類在各個實例中扮演的角色,,通過<<PatternName[InstanceNo.]:RoleName>>的形式標注,其中PatternName和RoleName含義與【規(guī)則一】相同,,InstanceNo.表示實例編號,,對于同一種模式,從1開始進行編號,,如<<Composite[1]:Composite>>,。 【規(guī)則三】如果某個類涉及多個設計模式的一個或多個實例,則可以多次重復PatternName[InstanceNo.]:RoleName,,兩兩之間通過分號(“;”)隔開,,如<<Composite:Composite;Command:ConcreteCommand>>或<<Composite[1]:Composite;Command[1]:ConcreteCommand>>。 【規(guī)則四】如果需要標注某個方法/屬性,,如果所在的類使用【規(guī)則一】進行標注,,則直接對方法/屬性所扮演的角色進行標注即可,即標注該方法/屬性對應于相應模式角色類中的哪個方法/屬性,如<<execute>>,;如果所在類使用【規(guī)則二】進行標注,,為了不引起歧義,在進行方法/屬性標注時也需要加上模式名稱和編號,,如<<Command[1]:execute>>,;如果所在類使用【規(guī)則三】進行標注,為了不引起歧義,,在進行方法/屬性標注時也需要同時出現(xiàn)多個模式相關信息,,如<<Command:execute;Composite:operation>>或<< Command[1]:execute;Composite[1]:operation >>。 對于前面所述的圖表顯示系統(tǒng),,采用SBPN方法對其結構圖進行標注后如圖8所示: 除了對UML圖形的標注外,,SBPN方法還支持對源代碼的標注,通過正向工程可以將結構圖中的模式標注信息記錄在源代碼中,,也可以通過逆向工程從源代碼中獲取模式相關信息,,一方面便于對代碼的閱讀和理解,另一方面還有利于系統(tǒng)的擴展和維護,。如圖9所示某策略模式實例的結構圖: 圖9對應的Java代碼片段如下所示,,在源代碼中,通過增加“@Stereoptype PatternName:RoleName”形式的注釋來對類進行標注,,源代碼的標注方式和結構圖的標注方式類似,,區(qū)別在于在源代碼中使用“@Stereoptype”來取代UML圖形中的雙尖括號(“<<”和“>>”),同時還可以對源代碼中的方法和屬性進行標注,。 (SBPN方法已發(fā)表在2012年第11期的《計算機應用》中) 參考文獻 |
|
來自: 蘇霈兒咪咪 > 《DesignPattern》