- UML基礎(chǔ)與Rose建模實(shí)用教程(第三版)
- 謝星星 周新國(guó)編著
- 2223字
- 2020-11-23 15:05:04
1.1.2 面向?qū)ο笈c面向過(guò)程的區(qū)別
在面向?qū)ο蟮某绦蛟O(shè)計(jì)(Object Oriented Programming,OOP)方法出現(xiàn)之前,結(jié)構(gòu)化程序設(shè)計(jì)占據(jù)著主流。結(jié)構(gòu)化程序設(shè)計(jì)是一種自上而下的設(shè)計(jì)方法,通常指使用一個(gè)主函數(shù)來(lái)概括出整個(gè)程序需要做的事情,而主函數(shù)由一系列子函數(shù)所組成。對(duì)于主函數(shù)中的每一個(gè)子函數(shù),又可以被分解為更小的子函數(shù)。結(jié)構(gòu)化程序設(shè)計(jì)的思想就是把大的程序分解成具有層次結(jié)構(gòu)的若干個(gè)模塊,每個(gè)模塊再分解為下一層模塊,如此自頂向下、逐步細(xì)分,把復(fù)雜的大模塊分解為許多功能單一的小模塊。結(jié)構(gòu)化程序設(shè)計(jì)的特征就是以函數(shù)(Function)或過(guò)程(Procedure)為中心,也就是以功能為中心來(lái)描述系統(tǒng),用函數(shù)或過(guò)程來(lái)作為劃分程序的基本單位,數(shù)據(jù)在過(guò)程式設(shè)計(jì)中往往處于從屬的位置。我們可以看出,結(jié)構(gòu)化程序設(shè)計(jì)的優(yōu)點(diǎn)是易于理解和掌握,但是這種模塊化、結(jié)構(gòu)化、自頂向下與逐步求精的設(shè)計(jì)原則有它的局限性,當(dāng)任務(wù)明確、邏輯結(jié)構(gòu)清晰而且需求變化相對(duì)較少時(shí),結(jié)構(gòu)化程序設(shè)計(jì)是可以勝任的。
然而,在比較復(fù)雜的問(wèn)題或是在開(kāi)發(fā)中需求變化比較多的情況下,結(jié)構(gòu)化程序設(shè)計(jì)往往就顯得力不從心。這是因?yàn)榻Y(jié)構(gòu)化程序設(shè)計(jì)是自上而下的,這要求設(shè)計(jì)者在一開(kāi)始就要對(duì)需要解決的問(wèn)題有一定的了解。在問(wèn)題比較復(fù)雜的時(shí)候,要做到這一點(diǎn)會(huì)比較困難,而當(dāng)開(kāi)發(fā)中的需求發(fā)生變化時(shí),以前對(duì)問(wèn)題的理解也許會(huì)變得不再適用。事實(shí)上,開(kāi)發(fā)一個(gè)系統(tǒng)的過(guò)程往往也是一個(gè)對(duì)系統(tǒng)不斷了解和學(xué)習(xí)的過(guò)程,而結(jié)構(gòu)化程序設(shè)計(jì)的方法忽略了這一點(diǎn)。另外,結(jié)構(gòu)化程序設(shè)計(jì)的方法把密切相關(guān)、相互依賴的數(shù)據(jù)和對(duì)數(shù)據(jù)的操作相互分離了,這種實(shí)質(zhì)上的依賴與形式上的分離使得大型程序的編寫(xiě)變得愈加困難,難于調(diào)試、維護(hù)和修改。在擁有多人進(jìn)行協(xié)同開(kāi)發(fā)的項(xiàng)目組中,程序員彼此之間很難讀懂對(duì)方的代碼,代碼的重用變得十分困難。由于現(xiàn)代應(yīng)用程序的規(guī)模越來(lái)越大,因而對(duì)代碼的可重用性和易維護(hù)性的要求也越來(lái)越高,面向?qū)ο蟮某绦蛟O(shè)計(jì)技術(shù)對(duì)這些要求則提供了很好的支持。
面向?qū)ο蟮某绦蚣夹g(shù)是一種以對(duì)象為基礎(chǔ),以事件或消息來(lái)驅(qū)動(dòng)對(duì)象執(zhí)行處理的程序設(shè)計(jì)技術(shù)。從程序設(shè)計(jì)的方法上來(lái)說(shuō),它是一種自下而上的程序設(shè)計(jì)方法,它不像面向過(guò)程的程序設(shè)計(jì)那樣一開(kāi)始就需要使用一個(gè)主函數(shù)來(lái)概括出整個(gè)程序,面向?qū)ο蟮某绦蛟O(shè)計(jì)往往從問(wèn)題的一部分著手,一點(diǎn)一點(diǎn)地構(gòu)建出整個(gè)程序。面向?qū)ο蟮某绦蛟O(shè)計(jì)是以數(shù)據(jù)為中心,使用類(lèi)(Class)作為表現(xiàn)數(shù)據(jù)的工具,類(lèi)是劃分程序的基本單位,而函數(shù)在面向?qū)ο蟮某绦蛟O(shè)計(jì)中成了類(lèi)的接口。面向?qū)ο蟮某绦蛟O(shè)計(jì)這種以數(shù)據(jù)為中心而不是以功能為中心來(lái)描述系統(tǒng)的設(shè)計(jì)方法,相對(duì)來(lái)講,使程序具有更好的穩(wěn)定性。它將數(shù)據(jù)和對(duì)數(shù)據(jù)的操作封裝到一起,作為一個(gè)整體進(jìn)行處理,并且采用數(shù)據(jù)抽象和信息隱藏技術(shù),最終被抽象成一種新的數(shù)據(jù)類(lèi)型—類(lèi)(Class)。類(lèi)與類(lèi)之間的聯(lián)系以及類(lèi)的重用性催生了類(lèi)的繼承、多態(tài)等特性。類(lèi)的集成度越高,越適合大型應(yīng)用程序的開(kāi)發(fā)。另外,面向?qū)ο蟪绦蜻\(yùn)行時(shí)的控制流程是由事件來(lái)驅(qū)動(dòng)的,而不再由預(yù)先設(shè)定的順序來(lái)引導(dǎo)程序的執(zhí)行。事件驅(qū)動(dòng)程序的運(yùn)行機(jī)制以消息的產(chǎn)生與處理為核心,靠消息的循環(huán)機(jī)制來(lái)實(shí)現(xiàn)所謂事件驅(qū)動(dòng)的執(zhí)行方式。更為重要的是,我們可以在編程過(guò)程中采用不斷成熟的各種框架(比如.NET的.NET Framework等),使用這些框架能夠幫助我們迅速地將程序構(gòu)建起來(lái)。面向?qū)ο蟮某绦蛟O(shè)計(jì)方法還能夠使程序的結(jié)構(gòu)清晰簡(jiǎn)單,極大地提高了代碼的可重用性,有效地減少了程序維護(hù)的工作量,從而提高了軟件的開(kāi)發(fā)效率。
在結(jié)構(gòu)上,面向?qū)ο蟮某绦蛟O(shè)計(jì)和結(jié)構(gòu)化程序設(shè)計(jì)也有很大的不同。結(jié)構(gòu)化的程序設(shè)計(jì)首先應(yīng)該確定的是程序流程的走向,函數(shù)間的調(diào)用關(guān)系,函數(shù)間的依賴關(guān)系。一個(gè)主函數(shù)依賴于其子函數(shù),這些子函數(shù)又依賴于更小的子函數(shù),而在程序中,越小的函數(shù)往往是具體細(xì)節(jié)的實(shí)現(xiàn),這些具體的實(shí)現(xiàn)又常常變化。于是,程序的核心邏輯依賴于外延的細(xì)節(jié),程序中本來(lái)應(yīng)該是比較穩(wěn)定的核心邏輯,也因?yàn)橐蕾囉谝鬃兓牟糠侄兊貌环€(wěn)定起來(lái),一個(gè)細(xì)節(jié)上的小小改動(dòng)也有可能在依賴關(guān)系上引發(fā)一系列變動(dòng)。可以說(shuō)這種依賴關(guān)系也是過(guò)程式程序設(shè)計(jì)不能很好應(yīng)對(duì)需求變化的原因之一,而一個(gè)合理的依賴關(guān)系本應(yīng)該是倒過(guò)來(lái)的,即細(xì)節(jié)的實(shí)現(xiàn)應(yīng)該依賴于核心的邏輯。而面向?qū)ο蟮某绦蛟O(shè)計(jì)是由類(lèi)的定義和類(lèi)的使用這兩個(gè)部分組成,主程序中定義對(duì)象并規(guī)定它們之間消息傳遞的方式,程序中的一切操作都是通過(guò)面向?qū)ο蟮南l(fā)送機(jī)制來(lái)實(shí)現(xiàn)的。對(duì)象接收到消息后,啟動(dòng)消息處理函數(shù)完成相應(yīng)的操作。
關(guān)于在程序?qū)崿F(xiàn)上的不同,下面仍然以圖書(shū)管理系統(tǒng)為例來(lái)說(shuō)明,在使用結(jié)構(gòu)化的程序設(shè)計(jì)時(shí),首先需要在主函數(shù)中確定圖書(shū)管理要做哪些事情,分別使用函數(shù)來(lái)“表述”這些事情,使用一個(gè)分支選擇程序進(jìn)行任務(wù)的選擇,然后再將這些函數(shù)進(jìn)行細(xì)化的實(shí)現(xiàn),確定調(diào)用的流程等。而使用面向?qū)ο蟮某绦蚣夹g(shù)來(lái)實(shí)現(xiàn)圖書(shū)管理系統(tǒng)是,以圖書(shū)管理系統(tǒng)中的學(xué)生為例,我們要了解圖書(shū)管理系統(tǒng)中學(xué)生的主要屬性,比如學(xué)號(hào)、院系等;學(xué)生會(huì)執(zhí)行什么操作,比如借書(shū)、還書(shū)等,并且把這些數(shù)據(jù)及其操作當(dāng)成一個(gè)整體來(lái)對(duì)待,形成一個(gè)類(lèi),即學(xué)生類(lèi)。使用這個(gè)類(lèi),我們可以創(chuàng)建不同的學(xué)生實(shí)例,也就是創(chuàng)建許多具體的學(xué)生模型,每個(gè)學(xué)生擁有不同的學(xué)號(hào),一些學(xué)生在不同的院系,他們都可以在圖書(shū)館借書(shū)和還書(shū)。學(xué)生類(lèi)中的數(shù)據(jù)和操作都是可供應(yīng)用程序進(jìn)行共享的,我們可以在學(xué)生類(lèi)的基礎(chǔ)上派生出大學(xué)生類(lèi)、大專(zhuān)生類(lèi)、研究生類(lèi)等,這樣就可以實(shí)現(xiàn)代碼的重用了。
類(lèi)與對(duì)象是面向?qū)ο蟮某绦蛟O(shè)計(jì)中最基本和最重要的概念,也是創(chuàng)建和使用UML圖的基礎(chǔ),必須仔細(xì)理解和掌握,并且在學(xué)習(xí)中不斷強(qiáng)化和深入。
- The Modern C++ Challenge
- Java 開(kāi)發(fā)從入門(mén)到精通(第2版)
- Java高并發(fā)核心編程(卷2):多線程、鎖、JMM、JUC、高并發(fā)設(shè)計(jì)模式
- PHP 從入門(mén)到項(xiàng)目實(shí)踐(超值版)
- Visual FoxPro程序設(shè)計(jì)教程
- 精通軟件性能測(cè)試與LoadRunner實(shí)戰(zhàn)(第2版)
- Nginx Essentials
- 網(wǎng)站構(gòu)建技術(shù)
- Jenkins Continuous Integration Cookbook(Second Edition)
- Visual C#.NET Web應(yīng)用程序設(shè)計(jì)
- 小程序從0到1:微信全棧工程師一本通
- Mastering PowerCLI
- Node.js實(shí)戰(zhàn):分布式系統(tǒng)中的后端服務(wù)開(kāi)發(fā)
- Clojure for Finance
- SAP HANA Cookbook