作者:autumn_thermal
在一個物件導向的系統中,系統的各種功能是由許許多多的不同對象協作完成的。在這種情況下,各個對象內部是如何?自己的對系統設計人員來講就不那麼重要了;而各個對象之間的協作關係則成為系統設計的關鍵。小到不同類之間的通訊,大到各模組之間的互動,在系統設計之初都是要著重考慮的,這也是系統設計的主要工作內容。面向介面編程我想就是指按照這種思想來編程吧!實際上,在日常工作中,你已經按照介面編程了,只不過如果你沒有這方面的意識,那麼你只是在被動的實現這一思想;表現在頻繁的抱怨別人改的代碼影響了你(介面沒有設計到),表現在某個模組的改動引起其他模組的大規模調整(模組介面沒有很好的設計)等等。
Booch先生那天談到Interaction Designer,它就是指做這類設計的人,只不過層次更高一些。我想目前我們的軟體設計隊伍中,這類人是最缺乏的人才之一。
非介面編程?是不是就是面向過程的編程思想?
1.關於介面的理解。
介面從更深層次的理解,應是定義(規範,約束)與實現(名實分離的原則)的分離。
我們在一般實現一個系統的時候,通常是將定義與實現合為一體,不加分離的,我認為最為理解的系統設計規範應是所有的定義與實現分離,儘管這可能對系統中的某些情況有點繁煩。
介面的本身反映了系統設計人員對系統的抽象理解。
介面應有兩類:第一類是對一個體的抽象,它可對應為一個抽象體(abstract class);
第二類是對一個體某一方面的抽象,即形成一個抽象面(interface);
一個體有可能有多個抽象面。
抽象體與抽象面是有區別的。
2.設計介面的另一個不可忽視的因素是介面所處的環境(context,environment),系統論的觀點:環境是系統要素所處的空間與外部影響因素的總和。任何介面都是在一定的環境中產生的。因此環境的定義及環境的變化對介面的影響是不容忽視的,脫離原先的環境,所有的介面將失去原有的意義。
3.按照組件的開發模型(3C),它們三者相輔相成,各司一面,渾然一體,缺一不可。
物件導向是指,我們考慮問題時,以對象為單位,考慮它的屬性及方法
面向過程是指,我們考慮問題時,以一個具體的流程(事務過程)為單位,考慮它的實現
介面設計與非介面設計是針對複用技術而言的,與物件導向(過程)不是一個問題
我認為:UML裡面所說的interface是協議的另一種說法。並不是指com的interface,CORBA的interface,Java的interface,Delphi的interface,人機介面的interface或NIC的interface。
在具體實現中,是可以把UML的interface實現為語言的interface,分布式對象環境的interface或其它什麼interface,但就理解UML的interface而言,指的是系統每部分的實現和實現之間,通過interface所確定的協議來共同工作。
所以我認為,面向interface編程,原意是指面向抽象協議編程,實現者在實現時要嚴格按協議來辦。也就是Bill Joy同志說的,一邊翻rfc,一邊寫代碼的意思。物件導向編程是指面向抽象和具象。抽象和具象是矛盾的統一體,不可能只有抽象沒有具象。一般懂得抽象的人都明白這個道理。 但有的人只知具象卻不知抽象為何物。
所以只有interface沒有實現,或只有實現而沒有interface者是沒有用的,反OO的。
所以還是老老實實物件導向編程,面向協議編程,或者什麼都不面向,老老實實編程。
但是我很討厭討論這樣的術語,不如我們談談什麼叫面向領導的編程?面向使用者的編程?領導和使用者有時都很BT,我們就面向BT編程?
==========================================================
幾點補充:
雖然介面可以用來類比多重繼承,但從絕對意義上,那不是真正的多重繼承。
多重繼承帶來的好處與它帶來的隱患和麻煩一樣多。
一個成功的軟體根本在於擴充性,重用性,和易於維護,(在過去,一個系統的開發費用遠比維護升級費用低,可以想象)。
而不在於你用什麼語言,和什麼樣的編碼技巧。記住,程式設計語言只是表達和
描述思想的一種方式,關鍵在於設計人的思想。正如外語學院畢業的學生大都
很難翻譯出成功的外國文學作品,不在於其語言不夠純熟,而是其文學功底不
夠,也就是思想性的東西不夠。所以說,軟體界,只有真正的軟體設計師,沒
有真正的程式設計語言師。
一個優雅的設計,能做到把任務描述的清晰,明朗,做到適應儘可能多的
異質環境和異常情況,以不重寫或少寫代碼為目標,而且要絕對能並行開發
而且各部分互不受影響,也就是要鬆散耦合。