C++的程式設計典範 (轉)

worldblog發表於2008-01-21
C++的程式設計典範 (轉)[@more@]

  pw:不清楚收藏是什麼意思,這篇文章以前見過,後來我做了一下整理,就算是收藏吧。

  語言設計自從50年代中期至今,歷經了將近半個世紀,其中經歷了無數的挫折,更可喜的是語言的發展取得了重大的進步,其中發展了4中程式設計典範,在計算機的發展史上留下了光輝的一頁。

一、過程式程式設計:確定你需要哪些過程,採用你能找到的最好的演算法。
  它關注的是計算機的處理過程,在這個階段,演算法是最重要的,不僅僅是因為這種設計典範的原因,還有當時的科研條件的限制,,都少得可憐,一個演算法的好壞直接影響了程式的最終質量。
  當時支援這種典範的語言(當然,當時的語言還不是很多)都是以為中心,各種演算法都是透過函式和其他語言功能寫出的,於是函式就被當作在演算法迷宮裡建立起來的一種秩序。
  由於當時設計典範就是這個樣子的,所以促使人們研究各種演算法,從而出現了很多非常經典的演算法(也許更加準卻的說法是,演算法的出現,促使了這種設計典範的產生)例如:
1、1946 LAlamos的Von Neumann,Stan Vlam,Nick Metropolis編的 Metropolis演算法,即
Monte Carlo方法
2、1947 蘭德公司的Grorge Dantzig創造的線性規劃的單純性演算法
3、1950 美國國家標準局數值分析所的Mas Hestenes,Edward Stiefel,Cornelius Lan
czos的Krylovz空間迭代法
4、1951 橡樹嶺國家實驗室的Alston Householder矩陣計算的分解方法
5、1951 John Backus在IBM領導的小組研製的Fortron最優編譯程式
6、1959-61 倫敦的Ferranti Ltd的J.G.F.Francis的稱為QR的演算法的計算機本徵值的穩定
的方法
7、1962 London的Elliot Brothers Ltd的Tony Hoare提出的(按大小)分類法
8、1965 IBM的Cooley與Princeton及Bell的Turkey的FFT演算法
  可以這麼說,這是這種設計典範的興起,才會湧現瞭如此精彩的演算法,以後就很少有什麼經典的演算法產生了(當然有,但是沒這麼多了)。

二、模組式程式設計:確定你需要哪些模組;將程式分為一些相應的模組,使資料隱藏在模組之中。
  在隨後的年代裡,程式設計的重點放生了轉移:從過程式設計轉移到了對資料的組織。這種轉移也反映了程式規模的增長,同時也暗示了工廠的出現。
  模組簡單的說就是一組過程和資料的包,這就是廣為人知的“資料隱藏原理”。在一些小型的程式裡面或者那些不需要處理與資料相關的過程之外,採用過程式設計已經綽綽有餘了,但是一個比較好的技術----模組式設計,自從其出現之後,就備受關注,這是的後期維護工作變得相對簡單了很多,設計思路也更加得清晰了。
  比較常見的模組式設計方法有:
  (1)名字空間/結構。這是一種很容易的達到資訊隱藏的目的的方法,於是函式、型別等的名字就能夠很容易的做成區域性的東西。
  (2)頭和實現檔案分離。透過這種方法,我們可以把宣告和實現分離,一方面隱藏了並不關心的實現部分,另一方面也為重新編譯提供了的手段。這種方法的實現是靠一個很重要的概念---分別編譯。嚴格的說來,分別編譯的使用不是語言要考慮的問題,而是關於如何最好的利用特定的語言實現的優點的問題。當然,最好的方式就是最大限度的模組化,透過語言特徵去邏輯的表示模組化,然後透過能最有效的分別編譯的一組檔案,物理的利用這種模組化機制。
  (3)使用者定義型別。這時候你就要關心你需要哪些資料型別和相應的操作,然後對他們進行封裝即可,實際的應用中,這種方式應用的很廣泛,例如類,不過這個時候還沒有實際的類。
  模組式程式設計的引入,導致異常處理變得非常重要,對於錯誤的處理也就自然而然的建立在這些模組的基礎之上,隨著時間的推移,各種庫被廣泛應用,於是標準化的方式就要求出現,於是異常處理就應運而生。

三、面向式程式設計():確定你需要哪些類,為每個類提供完整的一組操作,利用繼承去明確的表示共性。
  物件導向,這是大家都非常熟悉的概念,但是什麼是物件導向?你問10個人,會有15各答案。物件導向究竟必須包含那些特性?毫無疑問,繼承、多型是肯定要入選的,關鍵是還有什麼。封裝?模板?異常?無論哪一個都有相當一部分忠實的擁護者。
  這些我們沒有必要去爭論,關鍵的是物件導向有什麼優勢,嗯,這很多,你可以參考Booch的《物件導向分析與設計》。
  物件概念對軟體解決方案具有莫大的好處,在設計優秀合理的情況下尤其如此。你可以只編寫一次程式碼而在今後反覆重用,而在非OOP的情況下你則多半要在應用程式內部各個部分反覆多次編寫同樣的功能程式碼。所以說,由於物件導向減少了編寫程式碼的總量,從而加快了開發的進度同時降低了軟體中的錯誤量。
  用來建立物件的程式碼還可能用於多個應用程式。比方說,你的團隊可以編寫一組標準類來計算你的可用資源,然後用這些程式碼在所有需要同類物件的解決方案中建立物件,比如客戶定單介面、股票價值報表和發給銷售隊伍的通知等等。
  OOP的另一優點是對程式碼結構的影響。像繼承之類的物件導向概念透過簡化變數和函式的方式而便利了軟體的開發過程。OOP可以更容易地在團隊之間劃分編碼任務。同時,由於採用OOP,辨別子類程式碼的依附關係也變得更簡單了(比如說繼承物件的程式碼)。此外,軟體的測試和也得以大大簡化。
  但是OOP也存在一些固有的缺點。假如某個類被修改了,那麼所有依賴該類的程式碼都必須重新測試,而且還可能需要重新修改以支援類的變更。還有,如果文件沒有得到仔細的維護,那麼我們很難確定哪些程式碼採用了父類(被繼承的程式碼)。假如在開發後期發現了軟體中的錯誤,那麼它可能影響應用程式中的相當大部分的程式碼。
  物件導向程式設計在程式設計思想上同傳統開發不同,需要開發人員轉變傳統開發中所具備的慣性思維方式。對一個有的OOP開發隊伍來說,採用OOP的好處是顯而易見的。如果你正在考慮轉向OOP,那麼你必須保證已經擁有了富有經驗的主要開發人員能負責地檢查軟體中的缺陷和體系結構。
 
四、範型程式設計:確定你需要哪些演算法,將他們引數化。
  利用類和類層次機制,我們可以優雅並高效的表達單一的概念,還可以表達在某種層次體系中相互聯絡著的多個概念。然而有一些常見的重要概念卻既不具有單一性又不屬於某種層次體系。例如“整型vector”和“複數vector”,它們都是vector(這即是說,它們之間存在某種關係),但它們又因為各自的元素型別不同而被區分開來。像這樣的抽象概念最好用引數化的概念來表達。比如,我們可以把元素的型別作為引數而將其引數化。
  C++透過模板來提供型別的引數化能力。有一個極為重要的設計準則是:在使用模板定義基本的container時,模板應該在嚴格的要求下仍具有足夠的可適應性和高。具體來說,其設計目標就是提供一種vector模板類,並且其與內建型別相比,又並不帶來額外的執行時間負荷或者空間負荷。

  總結:++並沒有說專門支援哪一種設計典範,相反,它提供了上面的4中設計典範,為我們提供了相當的靈活性,但是個人認為要想發揮C++的強大優勢,還是要使用OO&GP,另外,標準庫一定要熟練使用,這是提高你設計能力的一個重要方面。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-997934/,如需轉載,請註明出處,否則將追究法律責任。

相關文章