我見過一些言必談架構、模式的人,聊天的時候總能高談闊論。聽到他們“架構”、“模式”、“反射”的說個不停,讓我感覺自愧不如。后來有機會看到他們寫的程序源代碼才明白,原來不管講的多么厲害的人,厲害只是存在于嘴上功夫,至于其真實水平如何,還真的不能從嘴上反映出來。古人就有“紙上談兵”的典故,從這個典故中,我們也許可以得到一些反思。
戰國時期,趙國大將趙奢曾以少勝多,大敗入侵的秦軍,被趙惠文王提拔為上卿。他有一個兒子叫趙括,從小熟讀兵書,張口愛談軍事,別人往往說不過他。因此很驕做,自以為天下無敵。然而趙奢卻很替他擔憂,認為他不過是紙上談兵,并且說:“將來趙國不用他為將罷、如果用他為將,他一定會使趙軍遭受失敗!惫,公元前259年,秦軍又來犯,趙軍在長平(今山西高平縣附近)堅持抗敵。那時趙奢已經去世。廉頗負責指揮全軍,他年紀雖高,打仗仍然很有辦法,使得秦軍無法取勝。秦國知道拖下去于己不利,就施行了反間計,派人到趙國散布“秦軍最害怕趙奢的兒子趙括將軍”的話。趙王上當受騙,派趙括替代了廉頗。趙括自認為很會打仗,死搬兵書上的條文,到長平后完全改變了廉頗的作戰方案,結果四十多萬趙軍盡被殲滅,他自己也被秦軍箭射身亡。
軟件設計模式和兵法一樣,是前人總結下來的經驗。兵法是作戰策略的“模式”,是人們根據歷史上的大量戰爭策略而提煉出來的,它代表了一般的作戰思路,但絕對不是指揮作戰的全部。如果我們錯誤的認為軟件設計只需要用GoF的23種模式的話,那么最后我們設計出來的將不是軟件,而是模式片斷的拼湊,是沒有生命的、無法工作的模塊。
模式不是代碼,不能通過“復制”、“粘貼”來使用,模式的使用需要軟件的設計者根據實際情況進行采納使用,在不同的情況下,需要對模式的使用進行差異化處理。作為一個優秀的設計師還要清楚自己在什么時候需要使用什么模式,只能創建一個對象的類應該使用單件模式進行設計,外觀模式則可以將復雜的內部邏輯和用戶界面分開,給客戶程序提供一個統一編程的界面。模式能夠幫助我們輕松的解決一些技術問題,當然這些問題要符合該模式的應用情境。如果待解決的問題不符合該設計模式的使用情境,而勉為其難的套用設計模式的話,就可能出現一個士兵拿著竹刀去打仗或者一個農民穿著盔甲來耕田的笑話了。
模式并不復雜也不并不難學,但是我接觸過的很多人有說容易的,也有說很難的。為什么眾口不一呢?他們的技術水平相差并不大,但是對設計模式認識卻如此不同,甚至完全相反?那些認為設計模式很難的人大部分是因為覺得自己無法讀懂并理解GoF的23種模式,而認為自己的水平很低。那些平時熟用過兩三種模式的人認為設計模式就是自己用的這兩種,已經滾瓜爛熟了,當然覺得容易。術有專攻,業有所長,在軟件開發的實踐中,不可能將所有的實際模式都用到,所以對于自己沒有使用過、不需要使用的模式可以不掌握,等到需要用到它的時候,自然可以理解它了。
模式這東西既然是經驗的總結,當然也就需要用經驗去驗證它。經驗是不能紙上談兵的,經驗也不會憑空產生,同時經驗也有它的適用環境。環境變了,以前的經驗方法,可能會完全失效。GoF總結的設計模式有23種,但是設計模式并不是只有23種,也許在你看文章的時候,又有人總結出了一種適用于嵌入式軟件設計的模式。設計模式只能被發現,而不能像某項技術專利一樣而被發明,也許你在設計模式概念提出之前就已經使用了其中的某些模式,但是你可能到現在也沒有意識到,如果你早于GoF之前提出設計模式的概念,現在的“四人幫”可能就變成了“五人幫”。
兵來將擋,水來土掩,世上之物,相生相克。設計模式就如同18般兵器,作為一個武林高手,并不需要18般兵器樣樣精通,但是一定要擅長其中的部分兵器,能夠根據敵人的招數,選擇合適的兵器進行出擊。只有在需要使用某種模式的時候才使用,俗話說“殺雞焉用牛刀”。過度的使用設計模式將使軟件設計復雜化,降低可讀性和可理解性,并不能代表一個人的水平有多高,真正的高手絕對不會使用復雜的設計來做簡單的事情。
但凡是武功不高者,總喜歡舞弄新奇的兵器,以掩飾他武功的低下。沒有過實戰經驗的人,總喜歡紙上談兵,以顯示自己的軍事才能。殊不知,武功最高境界是“學習技法,而又拋棄技法,練習功法,而活用功法,練一技,修百藝,而成于自然”。要成為一個上乘的軟件設計師絕對不是對設計模式的空談闊論,而是理解設計模式、活用設計模式、思考設計模式,既而發現屬于自己的設計模式。
文章來源于領測軟件測試網 http://www.kjueaiud.com/