用Unix的設計思想來應對多變的需求

摘要:無論是Unix設計,還是面向對象設計,還是別的什么如SOA,ECB,消息,事件,MVC,網絡七層模型,數據庫設計,等等,他們都在干三件事——解耦,解耦,還是解耦!

無論是Unix設計,還是面向對象設計,還是別的什么如SOA,ECB,消息,事件,MVC,網絡七層模型,數據庫設計,等等,他們都在干三件事——解耦,解耦,還是解耦!所謂解耦,就是讓軟件的模塊和模塊間盡量少地依賴起來。

現實當中的例子

讓我先舉幾個現實生活中的例子:

1.現實社會中,制造燈具的工廠完全不關心制造燈泡的工廠,制造燈泡的工廠完全不關心制造燈具的工廠,但是,燈泡和燈飾可以很完美地組合成用記所喜歡的樣子(這和@weidagang?在“需求變更和IoC”說到的那個PC的例子相仿)。他們是怎么做到的?

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到今天都學不會。

應對需求變化

看到這里,你可能明白我想說的是什么了,你可能開始覺得怎么樣的系統設計會更有效了。如果你還記得《Steve Y 對平臺的長篇大論》,你就會知道我想說什么了。是的,我想說的就是,當你真正了解了Unix的設計思想后,你會覺得今天的這些東西都是對Unix設計思想的一種傳承或是變種。這種東西就是:

1)解耦,解耦,解耦。盡量地讓你的模塊不要在實現上耦合,而是耦合某個規范,某個標準。

2)KISS,KISS,KISS。要做到高度解耦,你的模塊就一定要很簡單,當然不是說簡單到只有幾行代碼,而是簡單到只干一件事,并把這件事干到極致。然后通過某個標準拼裝起來。

3)拼裝,拼裝,拼裝。我想不起來是誰說的了,這句話是這樣的,當我想用一個模塊的時候,我直接調用就好了,沒有必要像C或Java一樣,還要編譯。是的,拼裝需要一個框架,需要一種標準協議,然后讓所有的系統都耦合在這種規范上,各自獨立運行,就像一個機器上的各個部件一樣,當我覺得這個部件不爽,換了就是了。(例如,當我們在嘗試不同的算法的時候)

想想建材和家俱市場,無論用戶過來想裝修什么,我都可以滿足用戶的不同需求,只要你是和家裝相關,我基本上都能滿足你,不是嗎?無論你怎么變,只要不變態,我基本上都可以滿足你。這就是解耦,拼裝帶來的好處。

你可能會說我說得太簡單了,另一方面,你可能覺得有一些系統這樣做沒必要,我承認,不過,你可以有選擇的或多或少地試試。(其實,我相信你已經在不自覺得或多或少地使用這種方式開發軟件了)

文章轉載自:酷殼網

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447323.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447323.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447323.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學習較底層編程:動手寫一個C語言編譯器

動手編寫一個編譯器,學習一下較為底層的編程方式,是一種學習計算機到底是如何工作的非常有效方法。 編譯器通常被看作是十分復雜的工程。事實上,編寫一個產品級的編譯器也確實是一個龐大的任務。但是寫一個小巧可用的編譯器卻不是這么困難。…

Arrays.deepToString() 方法同時適用于基元數組和對象數組

Arrays.deepToString() 方法同時適用于基元數組和對象數組: import java.util.*;public class MultiDimWrapperArray {public static void main(String[] args) {Integer[][] a1 { // Autoboxing{ 1, 2, 3, },{ 4, 5, 6, },};Double[][][] a2 { // Autoboxing{ {…

高效程序員的7個共同特征

要想成為高效的程序員,你需要具備一定的綜合素質才能夠讓你用你所掌握的技能、經驗和知識編寫出有效的代碼。有一些開發人員在技術方面具備一定的技巧,但他們永遠無法成為高效的程序員,就是因為他們缺乏所需的其它幾項特質。本文將給出成為一…

java.util.Array中的方法

概述 asList(): 獲取任何序列或數組,并將其轉換為一個 列表集合 (集合章節介紹了此方法)。 copyOf():以新的長度創建現有數組的新副本。 copyOfRange():創建現有數組的一部分的新副本。 equals():比較兩…

有關編程的12個猜想

摘要:編程世界的將來如何目前仍難預料,但可以肯定的一點是技術一直在加速發展。本文搜羅出12個獨特的編程視角猜想,一起來看看有哪些猜想在不久的將來就能變為現實。 編程世界的將來如何目前仍難預料,但可以肯定的一點是技術一直…

面試中如何剔除“魚目混珠”程序員?

公司招聘面試事宜是一個耗時耗錢的項目,從挑選簡歷開始,還要花更多的時間面試候選人。有的時候這些人才機構會向你保證這些人都是Java天才、SQL專家、堆棧開發者等等,但實際上真實情況遠不及你想想的。對于一個公司來說,執行招聘面…

InputStream 類型

輸入流類型 I/O-1 類功能構造器參數如何使用ByteArrayInputStream允許將內存的緩沖區當做 InputStream 使用緩沖區,字節將從中取出作為一種數據源:將其與 FilterInputStream 對象相連以提供有用接口StringBufferInputStream將 String 轉換成 InputStr…

java容器相關問題

同步類容器 1,這些復合操作在多線程并發地修改容器時,可能會表現出意外的行為,最經典的便是ConcurrentModificationException,原因是當容器迭代的過程中,被并發的修改了內容,這是由于早期迭代器設計的時候…

趣文:如果編程語言是車

C語言是全能手,小巧,強大,所向披靡,可靠,任何事情都能對付。 C是新的C,雙倍的能力,雙倍的尺寸,適應險惡的環境,但是你如果沒練好就去駕駛,很可能會撞車。 C#是…

Java 線程安全

線程安全 線程安全概念:當多個線程訪問某一個類(對象或方法)時,這個類始終都能表現出正確的行為,那么這個類(對象或方法)就是線程安全的。synchronized:可以在任意對象及方法上加鎖…

開發者應該了解的API技術清單!

摘要:有人說,有API的地方就有App,借助這些API開發者輕松構建出一款應用,極大地提高開發效率和開發質量。文中整理了一份API服務清單,內容涵蓋:監控/調試、 CDN 、數據庫、儀表盤、支付、通信等方面&#xf…

提高程序員職場價值的10大技巧

如果你已經是個很牛叉的程序員,但是依然覺得覺得還不夠的話,歡迎閱讀此文。本文旨在幫助各位更上一層樓。 你是不是覺得自己已經掌握了所有的編程技巧?別太自以為是了! 會寫代碼的確很重要,但是要拿到更好薪水&#…

google python的風格規范

點擊鏈接,查看內容

IT人應當知道的10個行業小內幕

如果你打算從事IT行業或剛進入這個行業,也許本文下面的小內幕會嚇到你,因為這些事平常都不會公開討論的。如果你是IT資深人士,或許你已經遇到其中的大部分了。如果你愿意,請一起來參與討論吧。 這些內幕大多數是針對網絡管理員、…

Volatile原子性一致性JVM指令重排

概念 Volatile概念:Volatile關鍵字的主要作用是使變量在多個線程間可見。作用: 在多線程間可以進行變量的變更,使得線程間進行數據的共享可見 阻止指令重排序,happens-before package com.example.core.cas;import com.example.c…

python修改文件內容,不需要read,write多個動作。

python 要修改文件內容,常用 是先read,后write , 再 rename,很不爽。 比如:需要 把 yuv_dir "../HD/" # "H:/HD_Master/1080i25/" 改為 yuv_dir "C:/HD/" # "H:…

Atomic系列類

Atomic系列類別 Atomic系列類封裝了一系列的基礎類型和對象操作,其主要目的就是為了實現原子性,主要核心類如下 AtomicIntegerAtomicLongAtomicBooleanAtomicIntegerArrayAtomicLongArrayAtomicReference 原子性的引用對象在對Atomic類操作的時候&…

python 系統學習筆記(十二)---os os.path os.walk

得到當前工作目錄,即當前 Python腳本工作的目錄路徑: os.getcwd() 返回指定目錄下的所有文件和目錄名:os.listdir()函數用來刪除一個文件:os.remove()刪除多個目錄:os.removedirs(r“c:\python”)檢驗給出的路徑是否是…

Java JUC工具類--CountDownLatch

CountDownLatch:用于監聽某些初始化操作,并且線程進行阻塞,等初始化執行完畢后,通知主線程繼續工作執行 package com.example.core.juc;import java.util.concurrent.CountDownLatch;public class UseCountDownLatch {public stat…