作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/
KWIC作為一個早年間在ACM的Paper提出的一個問題,被全世界各個大學的軟體設計課程奉為課堂講義或者作業的經典。(From Wiki,FYI,D. L. Parnas uses a KWIC Index as an example on how to perform modular design in his paper "On the Criteria To Be Used in Decomposing Systems into Modules" - Available as ACM Classic Paper)
1.問題描述
設計並實現一個軟體系統。要求如下:
主要功能如所示:
該軟體系統由命令列指定要進行處理的英文文字檔(.txt)的目錄和檔案名稱以及輸出結果檔案的目錄和檔案名稱。
2.解決方案:
a.面向過程方案:
見我以前的一篇:http://blog.csdn.net/gnuhpc/archive/2009/10/03/4629466.aspx
評價:這種是最簡陋的實現,可擴充性不強,不過程式倒也簡單明了。
b.基本物件導向方案:
該方案是個基本的物件導向方案,有四個準系統類:input, shift, alphabetize 和 output,將這些功能在主程式中串聯起來,通過共用資料的方式組成整個系統。
流程很簡單,首先通過input類設定檔案輸入輸出路徑並且讀入要處理的檔案,接著使用shift進行移位操作,得到一行行的結果,此時再採用alphabetizer對這些行進行首字母排序,最後採用output類輸出。
設計了一個Kwic類對上述類進行整合。提供代碼:
http://cid-a0a0b50959052db4.skydrive.live.com/self.aspx/.Public/KWIC^_Routine.zip
評價:將各個功能模組分開設計,並且利用許可權控制保證了封裝的特性,系統的擴充性和封裝性增強。
c.基於事件通知的方案:
基於事件通知的系統中的各個功能並不是直接被調用的,而是通過組建通知或廣播事件資訊而觸發的。其他組件可以通過註冊一個與某個事件通知相關聯的過程而與其發生聯絡。例如,我們的IDE就是一個典型的這樣的系統,編輯器和變數監視器與調試器的斷點功能相聯絡,當調試器停留在某一個斷點的時候,它就會自動去通知與其註冊的組件,去定位代碼或者觀察變數的取值。
一般這樣的方案有兩種設計,一個是系統有一個分立出來的事件中心,專門負責接收所有傳來的資訊,並且將它們分發給系統的其他組件,它可以是廣播,可以是針對某些特定事件而設定特定的反應。
這常被稱為:Publish/Subscribe,如
一種方案不設定一個集權的事件中心,每個模組允許其他模組在他們發送的訊息中聲明他們需要幹什麼,這樣每次模組發送的訊息都只發送給對這個事件感興趣的模組去,而無需發送到事件中心。
這常被稱為:Observable/Observer,如
在KWIC這個系統中,我們如此實現這個基於事件的系統:
- 兩個行儲存模組,第一個行儲存模組負責儲存所有原先的行,第二個行儲存模組負責儲存所以迴圈移位後的模組。 輸入模組負責設定路徑並且從輸入檔案中讀入並且儲存到第一個行儲存模組中。 迴圈移位模組負責迴圈移位並且儲存在第二個行儲存模組。輸出模組負責輸出到檔案,主控模組負責主控流程。添加一行到第一個行儲存模組就觸發了一個事件向迴圈移位模組發送,迴圈移位模組會根據這個事件對這一行就行處理,儲存到第二個行儲存模組,這就會另一個事件發送到排序模組,模組會把新加進來的行與舊行進行混合然後排序。
- 實現的是Observable/Observers模式,其中的事件互動有兩部分:
移位迴圈模組和第一個行儲存模組註冊。移位模組是第一個行儲存模組的觀察者。
排序模組註冊和第二個行儲存模組註冊。排序模組是第二個行儲存模組的觀察者。
Java對這樣的模式提供Observable 類和Observer介面,
在java.util中的Observer介面為觀察者提供了方便,只有一個方法需要實現:update。這個方法在當接到事件時被觸發。
在java.util中的Observable類為發送事件的類提供了方便,我們可以通過繼承而是用其提供了其他類向觀察者註冊的方法。
d.基於管道的方案
在基於管道的方案中,每個組件都會有一組輸入資料流和一組輸出資料流,一個組件讀入,然後處理後送出到下一個組件上。這個組件一般稱為filter。連接器則稱為pipes。filter之間不能有資料共用,並且彼此相互獨立。最有名的類似的程式就是Unix的Shell了。
http://cid-a0a0b50959052db4.skydrive.live.com/self.aspx/.Public/kwic^_pipe.zip
作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/