官术网_书友最值得收藏!

1.1 面向過程與面向對象程序設計

1.面向過程程序設計

早期計算機程序的規模較小,主要開發方式為個人設計、個人使用,沒有組織原則,只需將相應的程序代碼組織在一起,再讓計算機執行它就可以完成相應的程序功能。隨著計算機技術的發展和應用的普及,程序的規模和復雜度越來越大,到了20世紀60年代初期,個人軟件開發方式已不能滿足要求,出現了許多問題,如軟件開發費用超出預算,不能按期完成軟件開發,質量達不到要求,軟件維護困難等,這就是所謂的軟件危機。

軟件危機表明個人手工編程方式已經跟不上軟件開發的需求了,迫切需要改變軟件的生產方式,提高軟件生產率。20世紀60年代末產生了影響深遠的結構化程序設計(Structure Programming,SP)思想。結構化程序設計采用“自頂向下、逐步求精、模塊化”的方法進行程序設計。即采用模塊分解、功能抽象、自頂向下、分而治之的方法,將一個復雜、龐大的軟件系統分解成為許多易于控制、處理、可獨立編程的子任務、子模塊。各模塊由順序、分支、循環三種基本結構組成,每個模塊則由結構化程序設計語言的子程序(函數)實現。其基本特點是:① 按層次結構組織模塊;② 每個模塊只有一個入口,一個出口;③ 代碼和數據分離,即“程序=數據結構+算法”。

在進行結構化程序設計時,首先將要解決的問題分解成若干個功能模塊,再根據模塊功能設計一系列用于存儲數據的數據結構,并編寫一些函數(或過程)對這些數據進行操作,最終的程序是由許多函數(或過程)組成的。

結構化程序設計是一種面向過程的程序設計方法,把數據和過程分離為相互獨立的程序實體,用數據代表問題空間的客體,表達實際問題中的信息;程序代碼則是用于體現和加工處理這些數據的算法。在設計軟件時,必須時時考慮所要處理數據的結構和類型,對于不同格式的數據要做相同的處理,或者對于相同格式的數據要做不同的處理,都必須編寫不同的程序,代碼的可重用性較差。

此外,代碼和操作過程的分離還會導致程序的可維護性也較差。其原因是它把數據和處理數據的過程(函數)分為兩個獨立的部分,當數據結構改變時,所有與之相關的處理過程都要進行修改,增大了程序維護的難度。

例如,假設實現一個通信錄管理軟件,程序員編寫了4個函數:InputData,SearchPhone,PrintData,SearchAddr,分別用于實現通信錄數據的輸入、輸出和數據查詢功能。許多技術都可以實現通信錄的數據存取,如數組、鏈表、隊列或堆棧等,本例中采用數組存取數據。

struct Person{   //用于存放個人信息的數據結構
   char name[10];
   char addr[20];
   char phone[11];
}
Person p[100];   //保存所有個人信息的全局數組
int n=0;    //用于保存實際人數的全局變量
void InputData(){……}  //初始化全局數組P,讀入每個人的姓名、地址和電話
void SearchAddr(char *name){……} //根據姓名查找地址
void SearchPhone(char *name){……} //根據姓名查找電話號碼
void PrintData(){……}    //打印輸入每個人的姓名、地址和電話

這4個函數通過全局數組(即P)共享數據,并且相互影響。如果將這些函數提供給其他程序員使用,就必須讓該程序員知道他不能定義和修改全局數組(即P),只能通過這4個過程存取全局數據P。

個人通信錄管理程序代表了面向過程的編程方法:先定義一些全局性的數據結構,然后編寫一些過程對這些數據結構進行操作,其模型如圖1-1所示。

圖1-1 結構化程序設計模型

從圖1-1的程序模型可以看出,數據和函數之間存在潛在的連接關系。某個全局數據的修改可能會引起大量操作該全局數據的函數的修改。此外,若某個函數意外修改了某個全局數據,很可能引起程序數據的混亂。例如在個人通信錄管理程序中,Person的變化會引起操作它的所有函數(如InputData()、SearchAddr()等)的修改。此外,誰也沒有辦法限制其他程序員定義與全局數據同名的變量(如數組P),也不能限制他修改全局數組的值。當程序規模較大時,這個問題尤其突出,軟件維護困難。

支持結構化程序設計的高級語言稱為結構化程序設計語言,提供了順序、分支和循環三種基本結構,支持面向過程的程序設計。C、Fortran、BASIC、Pascal、Foxpro等都是當前仍在廣泛使用的面向過程的程序設計語言。

2.面向對象程序設計

隨著計算機技術的發展,軟件應用的領域更加廣泛,軟件的規模和復雜度越來越大,軟件更新的速度更快,面向過程程序設計技術已不能滿足軟件開發在效率、代碼共享和更新維護等方面的需求了,取而代之的是面向對象的程序設計技術。

面向對象程序設計的基本觀點是:計算機求解的都是現實世界中的問題,它們由一些相互聯系并且處于不斷運動變化的事物(即對象)組成,每個事物都可以通過兩方面來刻畫:描述事物狀態的數據和描述事物行為的函數,應該把它們結合成一個整體,代表一個客觀事物,這個整體就是對象。

可以看出,一個對象由數據和函數兩部分構成。數據常被稱為數據成員,函數則被稱為成員函數。一個對象的數據成員通常只能通過自身的成員函數修改。對象真實地表達了客觀事物,它將數據和操作數據的過程(函數)綁在一起,形成一個相互依存、不可分離的整體(即對象),從同類對象中抽象出共性,形成類。同類對象中的數據原則上只能用本類提供的方法(成員函數)進行處理。

面向對象程序技術能夠實現對客觀世界的真實模擬,反映出世界的本來面目。從客觀世界中抽象出一個個對象,對象之間能夠傳遞消息(一個對象向其他對象發出的服務請求信息),并通過特定的函數進行數據訪問,禁止以任何未經允許的方式修改對象的數據,這就是面向對象程序設計的基本模式,如圖1-2所示。

圖1-2 面向對象程序設計的程序模型

面向對象程序技術提高了軟件的重用性、靈活性和擴展性,且使軟件具有更好的可維護性。因為某類對象數據的改變只會引起該類對象程序代碼的改變,而與其他類型的對象無關,這就把程序代碼的修改維護局限在了一個很小的范圍內。由于數據和操作它的函數是一個整體,因此易被重用。在擴展某個對象的功能時,不用考慮它對其他對象的相互影響,軟件功能的擴展更容易。

主站蜘蛛池模板: 普宁市| 雷波县| 奈曼旗| 高邮市| 北海市| 邯郸县| 肥东县| 荥经县| 宾川县| 左贡县| 正宁县| 乐都县| 吐鲁番市| 尼木县| 武定县| 玉树县| 独山县| 兴山县| 乌海市| 宜宾市| 定安县| 浏阳市| 吉林市| 陕西省| 信宜市| 元江| 信宜市| 安新县| 普陀区| 大姚县| 彩票| 文登市| 武强县| 伊川县| 遵义市| 庄河市| 陆丰市| 渭源县| 汉沽区| 南川市| 皋兰县|