Abstract – On the Criteria To Be Used in Decomposing Systems into Modules

        這篇文章主要在敘述如何透過模組化一個系統,使得其在開發上更有彈性與快速,且在開發階段可以更加容易地理解系統各部分,這篇文章中所謂的『模組化』是在作者所提出的幾項原則下對一個系統做分解,搭配作者提出的例子-KWIC index (Key Word In Context index)的兩種分解方式,來理解非傳統的分化相較於傳統的方式有什麼樣的優點。
        近期(根據文章著作年代,應該是1972)的模組化程式設計發展,主要著重在程式碼撰寫的技巧和組譯技術的改進,然而對於多數的系統開發而言,最常使用的則是高度模組化程式。
        對於模組化程式設計,我們期望可以達到三個效果:
(1)   分工及縮短開發時程
(2)   彈性的功能調整
(3)   更容易地了解整個系統
        模組』的概念,並不是指『子程序、函式、方法』,而是指一個工作分配單元,而『模組化』則是指各個模組運作之前所需要考量的設計決策(Design Decision),主要是以系統階層的設計為決策方向,也就是思考有哪些決策會影響超過一個模組。
        文中以KWIC index為例,提出了兩種模組化的方法,第一種模組化方式將系統切割成五個模組:InputCircular ShiftAlphabetizingOutputMaster Control,其中前四個模組是有使用順序的,第五個模組主要用來控制其他四個模組與處理錯誤訊息、空間配置等等;第二種模組化方式將系統切割成六個模組:Line StorageInputCircular ShiftAlphabetizerOutputMaster Control,其中前五個模組是針對各自獨立的設計決策做切割,而沒有前後的使用順序,第六個模組同樣是運來控制其他模組。
        首先比較這兩個模組化方式,兩者的差異最主要是在切割工作的方法,雖然兩種模組化方式都相對的減低了程式的撰寫與管理,但是作者認為第一種模組化方式太過於保守,而第二種模組化方式則在許多Class Project中被成功的應用。
        作者提出了一些可能在不同情況下影響設計決策的變動因素:輸入格式是否將每一行都存在核心中(stored in core)是否將四個位元包裝成一個字組(word)是否要為circular shift建立索引是否要照字母順序建立表格,這些變動都可能會受限於某個模組。
        在某一些版本的系統中還會額外加入符號表(symbol table)模組,這個模組會在Line Storage中被使用到,但是對系統來說是不會察覺到的。
        個別開發(Independent Development)的角度來看,第一種模組化方式的介面(即各個模組)太過於複雜,第二種模組化方式的介面相對上較抽象,這使得後者在決策與開發上會比較容易進行,這也就是模組化設計中強調的『抽象化』。
        對於模組的理解(comprehensibility),我們有必要去了解alphabetizercircular shifterinput 三個模組,作者認為『要了解一個系統,必須從系統整體來看』這個觀點,在第二種模組化方式上並不成立。
        經過以上的例子與比較,作者提出了一項準則,第一種模組化事實上是按照系統的運作流程去進行切割,因此他認為這樣的模組化方式並不完善,而第二種模組化方式並非照著運作流程切割,而是採用了『資訊隱藏(Information hiding)為準則,針對各個設計決策去分割系統為多個模組單元(介面),有點類似物件導向程式設計方法中的『封裝』,對模組而言,彼此之間不會知道或影響其他模組的內部運作方法與設計考量。
        對於Circular Shift模組,我們還可以為List指定一個順序,使得程式在三種情況下可以更有效率:最新定義的circular shift所代表的行號都存在表格中、沒有任何的list被引用兩次、存在一個額外的函式讓我可以得知從原始行號shift多少次,在規定了順序以後,我們不必去更動定義,就可以提供更多的資訊。
        其他各模組可能隱藏的資訊例如:系統內部的資料結構、模組或副程式的呼叫順序、作業系統佇列中的控制區塊格式、字元編碼、字母順序、相似資料、特定項目會處理的資料序列…等等。
        考量程式的效率與實作時,因為第二種模組化方式的各介面可能在系統運作中不同的階段內被呼叫,如果呼叫的序列太複雜,會產生重複切換模組的負擔(repeat switching overhead),相形之下第一種模組化方式的各個模組只在特定階段被呼叫使用,因此較無這個問題,如果要改進這個負擔,在多數的例子中,組譯器會在副程式中插入一些程式碼,其他也有在程式中使用高效率切換方法或是高度專門化的例子。
        模組化的技巧在編譯器或直譯器中也有所應用,因為在許多的編譯器或直譯器中,有許多功能模組的實作也採用了資訊隱藏的方式,例如暫存器操作、搜尋演算法、直譯規則等等的決策(或理解為實作方式),這些決策會以模組化方式實作,並隱藏這些決策的實作方法。
        從第二種模組化方式的例子中,我們還可以看到介面之間具有『階層結構』(Hierarchical Structure),作者對系統模組化後具有階層結構提出了幾個優點,一個好處是可以簡化部分的系統實作,因為這些部份的功能可以由較低層次的模組提供,類似物件導向中『繼承』的概念,另一個則是可以簡化較高層次的設計,但是仍然保有可用性與有效性,事實上,第一種模組化方式也可以具有階層結構,階層結構乾淨分割是系統結構中兩個需要但獨立的性質。
       總結作者的觀點,他建議在進行一連串困難的或是變動性大的設計決策時,模組化需要考量到的重點是對其他模組的資訊隱藏,因為在多數的情況下,模組化過程並不會與系統運作流程密切吻合,而設計決策的時間也會超過執行的時間,所以若要有效率的實作出模組化系統,我們不應該去思考一個模組中要有幾個功能或副程式,而是去思考如何讓個副程式與主程式在不同模組間能夠良好的組合。

Astyle (Artistic Style) – C/C++/C# 和 Java 程式碼排版工具

有個學弟請我幫他 Debug,昨天看他的程式碼時,沒有排版真的讓我感到有點麻煩,所幸 Notepad++ 上下括號反紅的功能減輕了我的負擔,但是今天他又來敲我,我開了檔案以後,又是一陣眼花撩亂,沒有裝外掛,也沒有用其他IDE,我找到了一個程式-Artistic Style (astyle),它是一個可以獨立運作的排版程式,用C++撰寫,程式碼開源,可以對 C, C++, C# and Java 進行排版以後產生新的檔案,雖然在 Linux 底下,vim 或 vi 的 “gg=G" 已經可以完成這項工作,在 Mac 和 Windows 中應該也都有 IDE 或是 Plugin 可以達成,但是鮮少見到這樣輕量的小程式,而且還是用幾個簡單的 C++ 撰寫成的,所以就來介紹一下囉!

下載回來以後會是一個壓縮檔案,解開以後的資料夾包含四個子資料夾


其中在 bin 資料夾中,有一個執行檔,是編譯過後的執行檔,src 中存放著該程式的原始碼,將 bin 中的執行檔複製到要進行處理的檔案目錄下
然後開啟 命令提示字元,切換到該目錄下以後,輸入:程式名稱   [要排版的程式碼檔案]
C:\> Astyle.exe test.java
cmd 的畫面上會顯示進度,接著就會產生一個 *.orig 檔案,這個檔案就是原本的程式碼,但是檔案類型已經不是 *.java,而原本的檔案已經被複寫為排版過後的程式碼
                  ↑ Before Formatted ↑                                                         ↑ After Formatted ↑

Android 的 Putty

對於有在用工作站的人應該對 Putty 這款軟體很熟悉,他可以提供我們 Telnet 和 SSH 的遠端連線,這個軟體目前在Android上面似乎(?)還沒有支援,不過卻有這 App – ConnectBot 可以達到相同的功能。

↑ ConnectBot 與相輔相成的輔助軟體 Hacker’s Keyboard ↑
目前 ConnectBot 提供三種連線模式:SSH、Telnet、local

SSH的連線方式,是輸入 user@server_url
Telnet 的連線方式,直接輸入 server_url
  ↑ SSH的連線方式 ↓
↓ Telnet連線 ↓
不過如果是用 ASUS Eee Pad Transformer 的鍵盤打字,好像在無法順利輸入一些符號與指令,例如我在工作站上面的 vim 寫 C 程式,一開頭要打 #include 就出現問題了,因為我怎麼按 shitft + 3 就是出現 “",好吧我想說離開 vim 去 google 一下好了,結果我按了鍵盤最左上角的返回鍵…
YA! 成功的跳出來了!!!
但是……
vim 按下那個鍵應該是 ESC 的功能,讓我可以輸入指令操作 vim 的檔案,怎麼會跳出來了呢???
不知道是因為全世界有鍵盤的 Android 平板只有ASUS(?)所以還沒有支援還是我的軟體更新時間到了? 總之我無法順利輸入符號,後來發現可以按 shift + ; 切換成 command mode,但是,我沒辦法輸入 “!" ,這樣變成我一定要輸入 “wq " 存檔後再離開了。
這時候也有人為 ConnectBot 開發了專用的虛擬鍵盤,也就是第一張圖片左邊的 Hacker’s Keyboard,不過有趣的是,如果接上了變形金剛的實體鍵盤,這個 Keyboard 就會消失不能用,這也是我為什麼懷疑只有不支援 ASUS變形金剛的原因了。
↑vim 和 Haker’s Keyboard 的介面↑ 

有關 Hacker’s Keyboard 的使用方法很直觀,比Android 內建的鍵盤還要來的像一般PC或NB鍵盤,設定說明在安裝好以後點選桌面的圖示就會有說明了,不過全部是英文的,大致翻譯一下就是:
1. 點選 Configure input method 進入 Android 的 “鍵盤與輸入法" 設定單元,並將 Hacker’s Keyboard 的選像勾起來
2. 接著回到程式主畫面,改選 Set current input method,將目前要使用的輸入法改成 Hacker’s Keyboard,不過這一項其實應該等到你需要用到鍵盤輸入時再改就可以了,只是現在設定了,之後預設的鍵盤就會是這個了 (XD)
↓模糊了,這四個按鈕分別是↓
↓  Configure input method、Input language ↓
↓Set current input method、Get dictionaried↓
PS:我的變形金剛是 Eee Pad Transformer TF101、Android 版本 – 4.0.3

MonoDevelop

MonoDevelop 是一款基於 Mono 的 IDE,功能上比較沒有 Visual Studio 豐富和完整,但是喜歡簡約或輕巧的人應該會喜歡這樣的介面。

Mono download:http://www.go-mono.com/mono-downloads/download.html
MonoDevelop (IDE) download: http://monodevelop.com/Download

安裝 MonoDevelop 以前必須安裝兩個 Packages :
  .NET Framework   GTK# for .NET (會有版本要求)

Visual Studio 自從 2010 版開始需要註冊金鑰,每安裝一次就要一線上註冊取得一組帳號,Mono則不需要註冊金鑰即可直接使用。

另外之前再開發 ASP.NET 專案時,總覺得 Visual Studio 開啟速度很慢,後來有網友測試後發現,2010比2007更吃資源,連我建置專案並運行也需要等個三秒鐘以上(或許我電腦比較爛 XD),Mono 相形之下就比較輕量級。

↑Mono啟動後的畫面↑

↑建立新檔案↑
↑編輯好檔案以後存檔↑

↑編譯(建置) 也可以按 F7↑
↑建置成功↑
編譯好檔案以後會在專案中產生執行檔,此時只要再按下執行(運行)就可以執行程式

↑執行(運行) 也可按 F5↑
↑執行成功~ Hello World!!!! ↑
↑Autocomplete↓

編譯時如果出現錯誤,Mono會直接再出錯的那一行最右邊顯示出錯誤的原因
↑錯誤訊息↑

當然也可以減是錯誤訊息的視窗,取得更詳細的錯誤訊息

XPS vs PDF

PDF – Portable Document Format 根據維基百科的說明,它是由Adobe Systems1993年用於文件交換所發展出的文件格式。它的優點在於跨平台、能保留文件原有格式(Layout)、開放標準,能自由授權(Royalty-free)自由開發PDF相容軟體。
         PDF 於  2007年12月成為ISO 32000國際標準。
XPS – XML Paper Specification 根據維基百科的說明,它是微軟公司開發的一種文件保存與檢視的規範。從 Windows Vista開始提供這項格式及閱讀器。以前的開發代號為「Metro」。這個規範本身描述了這種格式以及分發、歸檔、顯示以及處理XPS文件所遵循的規則。最為顯著的特點是,XPS所用的置標語言是WPF所用XAML的一個子集,因此顯示Windows應用程序所用的方法可以用於XPS文件。


          人們認為XPS是Adobe公司的PDF的潛在競爭對手。但是,XPS是一個靜態文件格式,其本身不包括類似於PDF所具有的動態特性。
會說 XPS 與 PDF 將會是對手的原因從產生文件檔案的方式也可以看出原因,傳統上產生 .pdf的方式是安裝 pdf Factory 或是 doPDF 之類的軟體,將pdf引擎以印表機的型式存在系統中,當使用者編輯好檔案,便利用列印的方式輸出文件,就可以產生 .pdf 檔案,2010版(?)的Office開始支援不必使用列印輸出,只要選擇另存新檔,就可以直接輸出 .pdf 檔案。

而 PDF 的動態特性和 XPS 的靜態特性,我認為應該是指 PDF 格式的檔案可以在跨平台的系統上瀏覽,也就是今天你在 Windows 所產生的 .pdf 檔案,你可以在 Linux 或是  Mac OS 上開啟他並檢視,也可以直接在瀏覽器上面檢視,而 XPS 因為是 Windows 獨家的文件規範,因此只能在 Windows 平台上檢視。
利用Windows XPS Document Printer 產生的 .xps 格式檔案
以 doPDF 產生的 .pdf 檔案 

XPS 檢視器