面向對象程序設計的雛形早在1960年的Simula語言中就出現過。當時程序設計領域正面臨一種危機:面對越來越復雜的軟 硬件系統,傳統的以C語言為代表的面向過程程序設計思想已越來越無法滿足現實的需要——面向過程的設計無法很好地描述整個系統,同時設計結果也讓人難以理 解,因而給軟件的實現以及后期的維護帶來了巨大的挑戰,項目越大越難以實現,越到項目后期越難以實現,人們正陷入一場前所未有的軟件危機中。為了化解這場 軟件危機,人們開始尋找能夠消滅“軟件危機”這頭怪獸的“銀彈(silver bullet)”。面向對象程序設計思想正是在這種背景下應運而生,它通過強調設計與實現的可擴展性和可重復性,成功地化解了這場“軟件危機”。至此以 后,面向對象的程序設計思想開始在業界大行其道,逐漸成為主流。而從C語言向C++的進化剛好就發生在這個時期,自然而然地,C++也就選擇了支持面向對 象程序設計思想。
《人月神話》與銀彈
《人月神話》是軟件領域里一本具有深遠影響的著作。它誕生於軟件危機的背景之下,而正是這本書提出了“銀彈”的概念。
在西方的神話傳說中,只有被銀彈擊中心臟,才可以殺死怪獸。而在這本書中,作者把那些規模越來越大的、管理與維護越來越困難的軟件開發項目比作傳說中無法控制的怪獸,並希望有一項技術能夠像銀彈殺死怪獸那樣,徹底地解決這場軟件危機。
其實,面向對象程序設計思想並不是完全意義上的銀彈,它不可能解決所有大型軟件項目所遇到的問題,但是它提出了一種描述軟件的更加自然的方式,在一定程度上解決了這場軟件危機。
6.1.1 “自頂向下,逐步求精”的面向過程程序設計
要想了解新的面對對象思想有什么優點,最簡單直接的方式就是先看看舊的面向過程思想有什么缺點。回顧前面章節中曾經學過的例 子,我們在解決問題時總是按照這樣的流程:先提出問題;然后分析問題的處理流程;接着根據流程需要把一個大問題划分為幾個小問題;如果細分后的小問題仍然 比較復雜,則進一步細分,直到小問題可以簡單解決為止;實現每個子模塊,解決每個小問題;最后通過主函數按照業務流程次序調用這些子模塊,最終解決整個大 問題,如圖6-1所示。像這樣從問題出發,自頂向下、逐步求精的開發思想我們稱為“面向過程程序設計思想”,它描述的主要是解決問題的“過程”。
圖6-1 面向過程程序設計的流程
面向過程程序設計思想誕生於20世紀60年代,鼎盛於20世紀80年代,是當時最為流行的程序設計思想。它的流行有其內在原因,跟當時其他程序設計思想相比,它有着明顯的優勢。
1. 程序僅由三種基本結構組成
正如第4章中所介紹的程序流程控制結構一樣,面向過程程序設計思想限定程序只有順序、選擇和循環這三種基本控制結構。任何程序邏輯,無論是簡單的還是復雜的,都可以用這三種基本的控制結構經過不同的組合或嵌套來實現。這就使得程序的結構相對比較簡單,易於實現和維護。
2. 分而治之,各個擊破
人們在解決復雜問題時,總是采用“分而治之”的策略,把大問題分解為多個小問題后,再“各個擊破”並最終讓大問題得到解決。 面向過程程序設計思想也采取這種“分而治之”的策略,把較大的程序按照業務邏輯划分為多個子模塊,然后分工逐個完成這些子模塊,最后再按照業務流程把它們 組織起來,最終使得整個問題得到解決。按照一定的原則,把大問題細分為小問題“各個擊破”,符合人們思考問題的一般規律,其設計結果更易於理解,同時這種 方法也更易於人們掌握。通過分解問題,降低了問題的復雜度,使得程序易於實現和維護。另外,部分分解后的小問題(子模塊)可以重復使用,從而避免了重復開 發。而多個子模塊也可由多人分工協作完成,提高了開發效率。
3. 自頂向下,逐步求精
面向過程程序設計思想倡導的方法是“自頂向下,逐步求精”。所謂“自頂向下,逐步求精”,就是先從宏觀角度考慮,按照功能或 者業務邏輯划分程序的子模塊,定義程序的整體結構,然后再對各個子模塊逐步細化,最終分解到程序語句為止。這種方法使得程序員能夠全面考慮問題,使程序的 邏輯關系清晰明了。它讓整個開發過程從原來的考慮“怎么做”變成考慮“先做什么,再做什么”,流程也更加清晰。
隨着時代的發展,軟件開發項目也越來越復雜。雖然面向過程程序設計思想有諸多優點,但在利用它解決復雜問題的時候,其缺點也 逐漸暴露出來:在面向過程程序設計中,數據和操作是相互分離的,這就導致如果數據的結構發生變化,相應的操作函數就不得不重新改寫;如果遇到需求變化或者 新的需求,還可能涉及模塊的重新划分,這就要修改大量原先寫好的功能模塊。面向過程程序設計中數據和操作相互分離的特點,使得一些模塊跟具體的應用環境結 合緊密,舊有的程序模塊很難在新的程序中得到復用。這些面向過程程序設計思想的固有缺點使得它越來越無法適應大型的軟件項目的開發,這真是“成也面向過 程,敗也面向過程”。於是,人們開始尋找一種新的程序設計思想。正是在這種情況下,一些新的程序設計思想開始不斷涌現並逐漸取代面向過程程序設計思想,而 面向對象程序設計思想就是其中的“帶頭大哥”。
結構化程序設計的概念最早由E。W。Dijikstra在1965年提出的。它的主要觀點是采用自頂向下、逐步求精的程序設計方法來對程序進行構造。結構化程序設計的概念、方法和支持這些方法的一整套軟件工具,構成了結構化革命。這是存儲程序計算機問世以來.對計算機界影響最大的一個軟件概念,被稱為軟件發展中的第三個里程碑,其影響比前兩個里程碑(子程序、高級語言)更為深遠。
結構化程序是由若干個基本結構組合而成,每一個結構可以包含若干條語句和其他基本結構。結構化程序設計中包含三種基本的結構:順序結構、選擇結構和循環結構由這三種基本控制結構進行構造。
1 順序結構
世界上的所有事情都是有順序的,那么順序結構當然也就表示程序中的各操作是按照它們出現的先后順序執行的,其流程如圖7-16所示。事實上,不論程序中包含了什么樣的結構,而程序的總流程都是順序結構的。
2 選擇結構
選擇結構顧名思義,當程序到了一定的處理過程時,遇到了很多分支,無法按直線走下去,它需要根據某一特定選擇結構表示程序的處理步驟出現了分支,它需要根據某一特定的條件選擇其中的一個分支執行,選擇結構有單選擇、雙選擇和多選彈三種形式。雙選擇結構如圖7-17所示。當語句1和語句3中的任意一個處理為空時,說明結構中只有一個可供選擇的分支。也就是說,當條件不滿足時,什么也沒執行,所以稱為單選擇結構。
3.循環結構
不斷的重復,被稱作循環,所以這里的循環結構通常就是用來表示反復執行一個程序或某些操作的過程,直到某條件為假(或為真)時才可終止循環。在循環結構中最主要的是:什么時候可以執行循環?出現哪些操作需要循環執行?循環結構的基本形式有兩種。當型循環和直到型循環,其流程如圖7-18所示。雖然什么是結構化程序設計,至今還沒有被普遍接受的定義。但是在軟件程序設計中,不同編程員的編程效率不同,差異可達-個數量級。主程序員組是指以一個非常能干的程序員為中心,即主程序員,小組中剩余成員為主程序員提供其他能力和服務。主程序員組結構可以提高編程效率並盡量減少開發系統中不必要的人與人之間的通信連線。作為這種組織形式中的一個程序員,應具備程序設計的基本知識,對項目所在的領域有較深入的了解,熟悉開發的技術環境。能承擔一定的程序編寫,更為重要的是必須有高度的組織紀律性和團隊精神,使自己的工作融人整個系統,與組內其他成員協調一致地工作。