一、程式設計中抽象思維方法的重要性
世界非常複雜善變。程式設計師必須要應對這複雜善變的世界。如何應對?用抽象的方法。人類最重要的思維能力就是抽象的能力,電腦程式無論多智慧型,到目前為止,還是沒有任何抽象能力。
設計系統、編寫**、**演化的過程,必須是乙個抽象的過程。
不能理解這一句話的程式設計師,不能稱為乙個優秀的程式設計師。
解釋一下,何為程式設計師的抽象。程式設計師的抽象方法,一般指的就是封裝。封裝什麼?封裝變化,封裝複雜性。能以不變應萬變,是抽象的最高境界。
二、從乙個簡單的例子談起
怎麼,你還不明白?那我舉個例子。
你需要編寫乙個計算三角形面積的**。
過了幾天,你又需要編寫乙個計算五邊形面積的**。
這時,如果你還不意識到,你需要將兩部分的**合併起來,封裝成乙個計算n邊形面積的巨集、或函式、或物件、或物件群、或模組、或應用程式,那麼你就不是乙個成熟的程式設計師。
因為,如果你不這樣做,隨著時間推移,將會發生如下問題:
一):將來,你,或者你的同事,還需要辛辛苦苦編寫計算四邊形面積、七邊形面積的**;
二):然後,系統中到處都是這幾份**的拷貝,**體積膨脹;
三):你發現你用的公式有點問題,你想修改這個公式時,卻發現不得不在系統內到處搜尋,找到每一處使用這個**的地方,並且一一閱讀、修改、除錯那些**。這份工作不僅單調、令人厭煩,而且非常冒險,因為你不能確保你修改了那些**後,那些檔案是否能像你預期那樣執行,也不知道你是否找到了系統中所有使用這些**的地方。
四):最後,你發現這個系統已經不可維護:類似的**到處都是,而且往往都有一些或大或小的差異。你祈禱你所寫的這份**是絕對正確、沒有問題的,因為一旦出了問題,系統是不能修改的了。可惜得失,上帝也寫不出這樣的**。
回頭看看。如果你時乙個成熟的程式設計師,在遇到變化的時候,就用函式,或者物件,將你這些**封裝起來了。那麼上面所說的惡夢就不會出現,專案也不至於在最後變得無法收拾。
三、如何抽象?
呃,我有抽象的思想,但我不知道n邊形的面積計算公式,不知道怎麼寫這個函式,怎麼辦?
別擔心,程式設計師有自己的**庫。設計模式說到底,就是為了解決這種問題而存在的。
你寫不出來的話,就留給以後需要的時候再寫,或者留給你的同事以後寫。重要的是,你要封裝有這樣的介面。而且要有讓別人不必修改你的**,就能往你介面裡增加內容的能力。
不修改**,就能往你介面裡增添內容?如果你不熟悉設計模式,你可能覺得玄乎。請去重讀幾篇關於設計模式方面的文章吧。幾乎所有設計模式,都是為了讓**有這樣一種能力:增加功能時,只需增加模組,而不必修改原來的模組。
三、用設計模式來抽象:回到剛才的例子
扯遠了,我們回頭看n邊形的計算公式怎麼封裝好吧。老實說,我也不知道這個公式該怎麼寫。我數學很糟糕,我只記得三角形、四邊形的面積公式。但是不知道公式該怎麼寫,就更加要封裝,不然將來會死的更慘。
我們有如下選擇:
一)封裝乙個計算n邊形面積的函式,但如果使用者輸入的不是三角形或者四邊形,那麼丟擲乙個異常,告訴使用者在這裡新增乙份他所需要的**。
怎麼,你覺的這樣非常不友好?呃,我也同意,可是這是最自然的思路了。初級程式設計師寫出這樣的**是可以獎賞的,說明他有些抽象的思想了,雖然還沒有掌握抽象的方法。
二)封裝乙個計算面積的物件,該物件目前只提供計算三角形或四邊形面積的成員函式。如果使用者發現這個物件沒有他所需要的方法,請他修改這個物件,為它增加這個函式。
這種封裝方法也不錯,可惜沒達到上面的目標。因為使用者為了給你增加方法,必須修改你的**。
三)使用簡單工廠模式。每一種多邊形的計算方法,都封裝成乙個物件。使用者要計算面積時,首先根據該多邊形的邊數,呼叫工廠方法,得到對應的多邊形計算物件,然後再進行計算。
這種方法的好處是:使用者發現增加一種多邊形計算方法時,只要編寫這樣乙個物件,然後修改工廠方法,把這個物件返回就行了。
這種封裝不夠徹底,因為還是要修改原來的**。但是,已經足夠有效了。因為工廠方法內,只是一組簡單的case語句,修改它是不會出什麼問的。
四)使用動態工廠模式。前面不是說不夠徹底,工廠類還是要修改麼?那麼我將工廠類也封裝一下。工廠類裡,維護一組計算面積的物件列表。原來的工廠方法中的case語句,改為查詢列表,返回相應的物件。對外提供乙個register方法,讓別人可以往這個工廠裡增加新的計算面積的物件。
這是的**就比較完美了。要增加新的計算面積的方法,完全不需要修改原來的**,只要建立乙個這樣的物件,並把物件註冊到工廠類裡就行了。
比較不好的是,這時的**並不是很適合於閱讀。因為光看工廠類的**,你不能知道這個工廠類究竟能提供哪些物件——事實上,這個工廠類變成了乙個執行框架,沒有任何具體的內容——它的能力和行為,是在執行的時候才能確定的。
按這種考慮,還是前面用簡單工廠的模式比較好一些。
五)使用策略模式的方法。
嗯,不行。還有非常多的模式可以應對這種情況,我不能一一枚舉。我只是想舉個例子,說明如何用設計模式來應對你所不了解的變化。
五、結語
實際上,上面這個計算多邊形面積這個例子,可以套用到很多地方上。
比方說乙個網路伺服器,它要處理很多種型別的資料報。隨著專案的發展,它所要處理的資料報的型別也會越來越多。你不可能知道下乙個需要你處理的資料報型別是什麼。此時,你可以套用前面的解決思路,或者,使用其它可以使用的設計模式
重要的是封裝的思想,然後,要學會一些常用的封裝方法。有了這兩個能力,程式設計師才算成熟。
怎麼才算是乙個優秀的程式設計師
很長時間沒有更新自己的 blog 由於最近一直忙於處理專案上的事情,所以就把更新給耽誤了。通過最近一段時間專案的開發,自己也領導幾個程式設計師,可是專案進展的一直不是特別順利。所以今天花了大量的時間來思考自己現在所扮演的角色,看看自己是不是乙個優秀的程式設計師。可是在自己心中卻沒有乙個好的標準,什麼...
怎麼才算乙個真正的程式設計師
在網際網路高速發展的今天,每個人似乎都融入了網際網路的環境裡。因此而造就了很多的 程式設計師 以至於每年的10月24,被定位程式設計師日。在這樣的行業裡,似乎每個人多多少少會一些程式設計,於是生產出大量自稱程式設計師或者自以為是程式設計師的人。關於程式設計師的段子,也在網上廣泛生產傳播,什麼程式猿 ...
怎樣才算是乙個合格的網頁設計師?
隨著網際網路的盛行,市場上各行各業的企業對於 的更新換代都有著不等級別的需求,然而網頁設計師這個專業便是乙個赤手可熱職位。在上海建站行業裡面什麼樣的網頁設計師才算是合格的,對於企業 設計理念,設計思路,設計規劃,以及最後 成型的框架頁面是否能夠得到客戶的認可,這些對於整個 製作專案來說都是非常重要的...