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),作者對系統模組化後具有階層結構提出了幾個優點,一個好處是可以簡化部分的系統實作,因為這些部份的功能可以由較低層次的模組提供,類似物件導向中『繼承』的概念,另一個則是可以簡化較高層次的設計,但是仍然保有可用性與有效性,事實上,第一種模組化方式也可以具有階層結構,階層結構乾淨分割是系統結構中兩個需要但獨立的性質。
       總結作者的觀點,他建議在進行一連串困難的或是變動性大的設計決策時,模組化需要考量到的重點是對其他模組的資訊隱藏,因為在多數的情況下,模組化過程並不會與系統運作流程密切吻合,而設計決策的時間也會超過執行的時間,所以若要有效率的實作出模組化系統,我們不應該去思考一個模組中要有幾個功能或副程式,而是去思考如何讓個副程式與主程式在不同模組間能夠良好的組合。