2009年4月21日 星期二

為什麼要針對介面寫程式?

當你是個初學物件導向程式設計(OOP)的人,你通常會專注在使用正確類別語法、成員變數、成員函式等層面來實作你所負責的系統功能,當然這是大部分OOP的歷程之一。

在你成長的時候,漸漸的你會走到物件導向設計OOD,此時你可能會過渡的為了使用設計而濫用設計,而忽略了把實作OOP當作是OOD的一種手段或方法來加以利用,而筆者這篇就是要說明當你會了介面的程式設計後,你如何走出程式設計而走向架構設計。

我們先來簡單的介紹並協助讀者瞭解一些介面(Interface)設計的由來?介面它是一組行為和使用契約(usage contract)或規範,舉個例子來說,生活中你最常接觸到的是電腦,而電腦有主機板,主機板上有很多插槽,拿PCI(Peripheral Component Interconnect)插槽來說他就是個介面,插在此介面上的通稱介面卡,不管你是購買PCI的網路卡、音效卡、顯示卡,基本上你可以看出所謂的『金手指』都長的一樣,因為他們必須符合PCI的標準規格來製造不同功能的介面卡才能與主機板溝通,PCI的標準規格就是定義此介面的共同規範,才不至於介面卡的製造商各說各話到時做出來的東西不能插到主機板上而傷腦筋,而且主機板英文是Mother Board或Main Board,在意義上他們是『整合』很多功能的物件,所以介面卡的製造商不可能要求主機板商去改變原來的設計,如此會造成不堪的後果發生,因此必須協議出共同的溝通方法及管道,這就是介面存在的意義了。

由這個例子,我們也不難想像在物件導向世界裡的介面是有多麼的重要了吧。

一個有經驗的程式設計師或系統分析師應該都會希望設計出來的架構具有彈性,可以因應需求隨時抽換或新增功能。在『Head First Design Pattern』介紹設計模式時,也特別強調為什麼要針對介面寫程式,他引用了鴨子的例子就好像上述的主機板一樣,若一開始主機版廠商制訂了一個不一定是PCI介面的插卡,其上有已經安裝有64MB記憶體的插卡,然後要求各種功能的插卡製造商依照這張來設計顯示卡、音效卡、網路卡,想想在這種情況下製造商該如何是好呢?假設原本只有顯示卡需要記憶體的,但是現在連音效卡、網路卡都要以這張插卡為模版才能製造出可供主機板讀取的插卡,那麼萬一這張插卡要拿到另一個主機板上安裝時,可能就不相容了。此外,原本音效卡製造商不需要負擔記憶體成本費用的,現在他也必須承擔,這樣反倒是失去制訂此插卡模版的意義了。

因此,聰明的插卡製造商集體要求主機板商必須改進此問題,此時主機板商應該退一步,只制訂插卡的介面即可,讓原本是音效卡、顯示卡等製造商,只要依照主機板商制訂的介面及插卡商各自定義什麼是音效卡、顯示卡上該有的元件即可,這樣顯示卡商也只要依照顯示卡工會定義的顯示卡元件,而且顯示卡上的各元件也可隨時抽換或再加上各種附加的功能即可製造出相容性極高的顯示介面卡,這樣不是皆大歡喜嗎?

我們在設計資訊系統也猶如設計主機板上的功能一樣,必須設法找出可以抽象且獨立出來的元件,並將他們盡量以介面的方式來設計你的系統,這樣就算客戶再怎麼要求你修改原有的功能都是輕而易舉,而不會因為要牽一髮而需動全身而難以應付不斷改變的需求,所以要針對介面來寫程式,如此,在功能元件介面不互相干擾的情況下,你只要針對你要修改的功能來新增修改刪除內容,也不需考慮會不會影響其他既有的功能了。

接下來有機會我們將介紹如何將上述的觀念應用在實做上。

沒有留言:

張貼留言