無論是Unix設計,還是面向對象設計,還是別的什麼如SOA,ECB,消息,事件,MVC,網絡七層模型,數據庫設計,等等,他們都在干三件事——解耦,解耦,還是解耦!所謂解耦,就是讓軟件的模塊和模塊間盡量少地依賴起來。
現實當中的例子
讓我先舉幾個現實生活中的例子:
2、互聯網上,做網站的人完全不用關心用戶在用什麼樣的操作系統,什麼樣的客戶端浏覽器 (當然事實上,浏覽器的不標准讓網站那邊很頭痛,這裡只是舉個例),反過來,上網的人也不關心做網站的人在用什麼的技術開發網站。但是大家在完全不關心對 方的情況下,可以很正常地協同工作在一起。為什麼?
這樣的例子太多了。為什麼可以做成這樣呢?因為大家依賴的是一個接口,燈具和燈飾並不互相依賴,他們依賴的是一個接口,做網站的人和浏覽網站的人依賴的還是接口——HTTP協議。這就是面向對象的核心思想——依賴於接口而不是實現,這就是解耦。當你看過這兩個例子以後,我希望你以後設計的軟件至少不能比我們現實社會中的這些方法要差。不然,你就是在讓社會倒退了,呵呵。
你會說,這和Unix,和應對需求變化有什麼關系?好讓我們再來看一下Unix的設計。
Unix設計的例子
下面是幾個Unix下的例子:
1、Unix下,所有的硬件都可以通過文件的方式存取。其統統在/dev下。於是,軟件 和硬件的耦合被解開了,操作系統只需要把硬件統統變成文件,而程序只需要使用三個東西,一個是fd,一個是read(),一個是write(),就可以來 操作任意的硬件了,這就是抽象,簡單到不行。
2、Unix下,所有的命令都可以用管道串起來(管道絕對是個偉大的發明),這樣,所有 的命令間的交互全部解耦到只依賴於STD_IN, STD_OUT設備上。最酷的是,用戶可以使用管道任意地拼裝那些命令,以完成各式各樣的功能。管道這個設計思想可以映射為今天的Web Service,你可以任意地拼裝各種Web Service。
看到這裡,你會發現,這還是解耦,本質上來說,也是一種依賴倒置——OOD的精髓。但是,Unix還不僅僅是這些。我們再來看幾個例子:
1、Unix下,軟件都是綠色地安裝。在iOS上更明顯——各個程序間基本上互不干擾,這個程序產生的垃圾文件不會影響到另一個程序。你刪到一個程序不會讓另一個程序不舉,各是各的空間。你可以刪除這些程序,只要把內核心留著,系統照樣可以啟動。
2、Unix下,你可以通過設置一些環境變量,讓多種環境同時存在,比如:某個LAMP 用的是Apache 2.0, Mysql 4.0, PHP 4.0,某個LAMP用的是Apache 2.2, Mysql 5.0,PHP5.3,你不但可以方便地在系統中切換這兩個環境,你甚至還可以同時啟動他們。
3、Unix下,你可以隨意地替換你想要的程序。比如,你不喜歡bash,你可以替換成ksh/csh等,你不喜歡awk,你可以替換成gawk,所有的東西都像零件一樣,你不喜歡什麼,你就可以替換什麼。
這三個例子告訴了我們——當你把你的軟件設計地耦合度非常地低時,你可以隨意地組合,隨意地安排你的系統。想當的靈活,靈活到Windows到今天都學不會。
應對需求變化
1)解耦,解耦,解耦。盡量地讓你的模塊不要在實現上耦合,而是耦合某個規范,某個標准。
2)KISS,KISS,KISS。要做到高度解耦,你的模塊就一定要很簡單,當然不是說簡單到只有幾行代碼,而是簡單到只干一件事,並把這件事干到極致。然後通過某個標准拼裝起來。
3)拼裝,拼裝,拼裝。我想不起來是誰說的了,這句 話是這樣的,當我想用一個模塊的時候,我直接調用就好了,沒有必要像C或Java一樣,還要編譯。是的,拼裝需要一個框架,需要一種標准協議,然後讓所有 的系統都耦合在這種規范上,各自獨立運行,就像一個機器上的各個部件一樣,當我覺得這個部件不爽,換了就是了。(例如,當我們在嘗試不同的算法的時候)
想想建材和家俱市場,無論用戶過來想裝修什麼,我都可以滿足用戶的不同需求,只要你是和家裝相關,我基本上都能滿足你,不是嗎?無論你怎麼變,只要不變態,我基本上都可以滿足你。這就是解耦,拼裝帶來的好處。
你可能會說我說得太簡單了,另一方面,你可能覺得有一些系統這樣做沒必要,我承認,不過,你可以有選擇的或多或少地試試。(其實,我相信你已經在不自覺得或多或少地使用這種方式開發軟件了)