河北農(nóng)業(yè)大學(xué)渤海校區(qū)理工學(xué)院 石博文
淺談面向?qū)ο蠛兔嫦蜻^程程序設(shè)計(jì)
河北農(nóng)業(yè)大學(xué)渤海校區(qū)理工學(xué)院 石博文
主要論述了面向過程程序設(shè)計(jì)的結(jié)構(gòu)化思想和面向?qū)ο蟪绦蛟O(shè)計(jì)的抽象、封裝、繼承、多態(tài)技術(shù),并詳細(xì)介紹了兩種思維方式的特點(diǎn)、優(yōu)缺點(diǎn)以及相互聯(lián)系。
程序設(shè)計(jì);面向?qū)ο螅幻嫦蜻^程;模塊;封裝;繼承;多態(tài)
程序設(shè)計(jì)是給出解決特定問題程序的過程。程序設(shè)計(jì)的本質(zhì)是把人們在現(xiàn)實(shí)生活中遇到的問題經(jīng)過抽象處理,再利用計(jì)算機(jī)語言轉(zhuǎn)換到機(jī)器能夠理解的層面上去。如今,在程序設(shè)計(jì)中,有兩個(gè)非常成熟的設(shè)計(jì)方式:面向過程的程序設(shè)計(jì)和面向?qū)ο蟮某绦蛟O(shè)計(jì)。
2.1 設(shè)計(jì)思想
面向過程就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實(shí)現(xiàn),使用的時(shí)候再一個(gè)一個(gè)調(diào)用。結(jié)構(gòu)化程序設(shè)計(jì)是其核心思想。
2.2 設(shè)計(jì)特點(diǎn)
(1)模塊化
模塊化即功能分解,實(shí)質(zhì)是采用自頂向下、逐步求精的設(shè)計(jì)過程把程序分解成單一處理功能的模塊,進(jìn)而通過調(diào)用相應(yīng)模塊并傳遞參數(shù)以實(shí)現(xiàn)程序的功能,此功能模塊可以理解為函數(shù)、過程、子程序;每一模塊內(nèi)部均是由順序、選擇、循環(huán)三種基本結(jié)構(gòu)組成,利用這三種結(jié)構(gòu)的組合、嵌套,可以實(shí)現(xiàn)任何復(fù)雜的程序設(shè)計(jì)。功能分解使得系統(tǒng)是模塊的組件即:程序=(模塊+模塊+模塊+…)、模塊=(數(shù)據(jù)結(jié)構(gòu)+算法)[1]。
模塊設(shè)計(jì)應(yīng)堅(jiān)持“高內(nèi)聚,低耦合”的設(shè)計(jì)原則。其中“高內(nèi)聚”是指每一個(gè)模塊都執(zhí)行一個(gè)完整的功能,具有一個(gè)完整功能的業(yè)務(wù)都組合在一個(gè)模塊當(dāng)中,而不會分散到兩個(gè)或者多個(gè)模塊當(dāng)中;“低耦合”是指每一個(gè)模塊之間的共用信息應(yīng)該盡量少,每個(gè)模塊之間的交集應(yīng)盡可能小,應(yīng)該盡量降低每個(gè)模塊之間的耦合度。
(2)數(shù)據(jù)和操作分離
面向過程的程序設(shè)計(jì)把重點(diǎn)放在解決問題的功能模塊劃分上,將數(shù)據(jù)和操作這些數(shù)據(jù)的函數(shù)分開。數(shù)據(jù)處于次要地位,而過程即模塊劃分是關(guān)心的焦點(diǎn)[2]。
2.3 設(shè)計(jì)優(yōu)點(diǎn)
早期的程序設(shè)計(jì)屬于面向計(jì)算機(jī)的程序設(shè)計(jì),程序員需要考慮大量的機(jī)器細(xì)節(jié)。面向過程的程序設(shè)計(jì)優(yōu)點(diǎn)是相對前期程序設(shè)計(jì)而論的。
(1)模塊化思想將一個(gè)較復(fù)雜的問題分解為若干個(gè)子問題,各子問題分別由不同的人員解決,提高了開發(fā)效率,便于程序的調(diào)試;
(2)面向過程的設(shè)計(jì)按解決問題的過程劃分模塊,直接針對求解關(guān)系,集中處理數(shù)據(jù),運(yùn)行效率很高[3];
(3)自頂向下逐步求精的方法使程序具有清晰的層次結(jié)構(gòu),容易閱讀和理解,也較容易保證程序的正確性。
2.4 設(shè)計(jì)缺陷
(1)軟件模塊重用難。當(dāng)開發(fā)一個(gè)新的軟件系統(tǒng)時(shí),以前開發(fā)的軟件模塊很難直接使用;
(2)軟件系統(tǒng)功能擴(kuò)展難。一旦用戶的需求發(fā)生變化,要改進(jìn)系統(tǒng)或升級版本時(shí),程序員要面對調(diào)用關(guān)系復(fù)雜的許多函數(shù)模塊,系統(tǒng)的功能擴(kuò)展很困難;
(3)軟件維護(hù)難。軟件的模塊即函數(shù)越來越多,模塊間的調(diào)用關(guān)系越來越復(fù)雜,程序容易出錯(cuò),而且一旦出錯(cuò)很難查找[4]。
3.1 設(shè)計(jì)思想
面向?qū)ο缶褪前褬?gòu)成問題的事務(wù)分解成各個(gè)對象,建立對象的目的不是為了完成一個(gè)步驟,而是為了描述某個(gè)事物在整個(gè)解決問題步驟中的行為。
3.2 設(shè)計(jì)特點(diǎn)
(1)抽象、類、對象
抽象就是把事物共同點(diǎn)抽取出來,以統(tǒng)一的方式進(jìn)行概要描述的一種過程。面向?qū)ο笾校愂菍ΜF(xiàn)實(shí)世界事物的抽象,包括屬性和方法。其中屬性是對事物靜態(tài)特征的描述,方法是對事物動態(tài)特性即行為的描述[5]。一旦建立了類,就可以基于類初始化成員變量,實(shí)例化出一個(gè)對象,而程序就是由這一系列對象組成即:程序=(對象+對象+對象+…)、對象=(數(shù)據(jù)結(jié)構(gòu)+算法)。
(2)封裝
封裝又稱數(shù)據(jù)隱藏,就是將一個(gè)事物的屬性和方法放在一個(gè)類中,對外只提供訪問該數(shù)據(jù)的方法,程序的其它部分不能直接作用于此數(shù)據(jù)。這一特性大大降低了面向過程中模塊間的耦合性,從而提高了程序的可靠性,盡可能地排除了對數(shù)據(jù)進(jìn)行任意訪問造成的隱患[6]。
(3)繼承
類的繼承實(shí)質(zhì)上是先定義一個(gè)基類(父類),然后用該基類派生出其它的子類,子類在沿襲父類的屬性和方法的同時(shí)可以添加自己特有的屬性和方法。繼承性使得程序得以最大限度地實(shí)現(xiàn)代碼重用,同時(shí)在父類上所做的改動可以直接反映到它的所有子類中,軟件可維護(hù)性大為提高。
(4)多態(tài)
多態(tài)是指在一般類中定義的屬性或方法被特殊類繼承以后,通過重寫,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為。多態(tài)性使得程序員可以將所定義的方法應(yīng)用于多個(gè)類,同一個(gè)屬性和方法在一般類及各個(gè)特殊類中具有不同的語義,并使得程序更加容易擴(kuò)展[7]。
3.3 設(shè)計(jì)優(yōu)點(diǎn)
面向?qū)ο蟪绦蛟O(shè)計(jì)的優(yōu)越性是基于它的特點(diǎn)而論的。對客觀現(xiàn)實(shí)世界事物的抽象,使軟件開發(fā)可以按照人類習(xí)慣的思維方式建立起問題領(lǐng)域的模型從而模擬客觀世界,有利于大型軟件的開發(fā);事物屬性和方法的封裝避免了數(shù)據(jù)的隨意訪問,保證了數(shù)據(jù)的安全性;類與類之間的繼承關(guān)系,最大程度實(shí)現(xiàn)了代碼的重用;繼承關(guān)系下的多態(tài)性增強(qiáng)了程序的靈活性和擴(kuò)展性。
3.4 設(shè)計(jì)缺陷
(1)運(yùn)行效率較低。類的大量加載會犧牲系統(tǒng)性能,降低運(yùn)行速度。雖然CPU速度在提高,內(nèi)存容量在增加,但這一問題仍會隨著系統(tǒng)規(guī)模變大而逐漸顯示出來,變得越發(fā)嚴(yán)重。
(2)類庫龐大。由于類庫都過于龐大,程序員對它們的掌握需要一段時(shí)間,從普及、推廣的角度來看,類庫應(yīng)在保證其功能完備的基礎(chǔ)上進(jìn)行相應(yīng)的縮減。
(3)類庫可靠性。越龐大的系統(tǒng)必會存在我們無法預(yù)知的問題隱患,程序員無法完全保證類庫中的每個(gè)類在各種環(huán)境中百分之百的正確,當(dāng)使用的類發(fā)生了問題,就會影響后續(xù)工作,程序員也有可能推翻原來的全部工作[8,9]。
面向?qū)ο笾匾晫ΜF(xiàn)實(shí)世界的抽象,面向過程重視對問題的功能模塊化,但兩種技術(shù)不是非此即彼的對立關(guān)系。面向?qū)ο蟮某橄?、封裝、繼承、多態(tài)是建立在面向過程的順序、選擇、循環(huán)三種控制結(jié)構(gòu)之上。因此,如果將一個(gè)軟件任務(wù)分為兩層,那么面向?qū)ο蠹夹g(shù)用于解決“做什么”,而面向過程技術(shù)用于解決“怎么做”。
[1]馬金霞,宋傳磊.面向過程和面向?qū)ο蟪绦蛟O(shè)計(jì)分析[J].中國新通信,2016(11).
[2]錢能.C++程序設(shè)計(jì)教程(第2版)[M].北京:清華大學(xué)出版社,2005(09):13-16.
[3]許偉剛,梁大周.面向?qū)ο蟪绦蛟O(shè)計(jì)[J].計(jì)算機(jī)工程與應(yīng)用,1990(12).
[4]朱戰(zhàn)立,宋新愛.面向?qū)ο蟪绦蛟O(shè)計(jì)與C++語言[M].北京:電子工業(yè)出版社,2010(07):31-46.
[5]張海藩.軟件工程導(dǎo)論(第5版)[M].北京:清華大學(xué)出版社,2008(02):203-211.
[6][美]Grady Booch等.面向?qū)ο蠓治雠c設(shè)計(jì)(第3版)[M].王海鵬,潘加宇譯.北京:人民郵電出版社,2009(08):35-38.
[7][加]Scott W.Ambler.面向?qū)ο筌浖_發(fā)教程(第2版)[M].車皓陽,劉銳譯.北京:機(jī)械工業(yè)出版社,2003(06):97-130.
[8]徐向陽.面向?qū)ο蟪绦蛟O(shè)計(jì)現(xiàn)狀及發(fā)展趨勢研究[J].光盤技術(shù),2006(01).
[9]胡玲.面向?qū)ο蟪绦蛟O(shè)計(jì)和設(shè)計(jì)技術(shù)思考[J].電子技術(shù)與軟件工程,2016(06).
The Summary between Object-oriented Programming and Process-oriented Programming
ShiBowen
(College of Science and Engineering,Agricultural University of Hebei,Cangzhou,061000,China)
The summary is mainly about structured ideas of process-oriented programming and some important technologies in objectoriented programming like abstract,encapsulation,inheritance and polymorphism.At the same time,the article expatiates the feature,merits and drawbacks as well as the relationship between process-oriented and object-oriented programming.
programming;object-oriented;process-oriented,module;encapsulation;inheritance;polymorphism