第02章 面向?qū)ο蟮某绦蛟O(shè)計(jì)與軟件開(kāi)發(fā)初步_第1頁(yè)
第02章 面向?qū)ο蟮某绦蛟O(shè)計(jì)與軟件開(kāi)發(fā)初步_第2頁(yè)
第02章 面向?qū)ο蟮某绦蛟O(shè)計(jì)與軟件開(kāi)發(fā)初步_第3頁(yè)
第02章 面向?qū)ο蟮某绦蛟O(shè)計(jì)與軟件開(kāi)發(fā)初步_第4頁(yè)
第02章 面向?qū)ο蟮某绦蛟O(shè)計(jì)與軟件開(kāi)發(fā)初步_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

面向?qū)ο蟮某绦蛟O(shè)計(jì)與軟件開(kāi)發(fā)初步目標(biāo)閱讀和研究本章之后,你應(yīng)該能夠:說(shuō)出面向?qū)ο蟮某绦蛟O(shè)計(jì)的基本組成部分。區(qū)分類和對(duì)象。區(qū)分類和實(shí)例方法。區(qū)分類和實(shí)例數(shù)據(jù)值。利用表示類、對(duì)象和面向?qū)ο蟪绦蛟O(shè)計(jì)的其他組成部分的圖標(biāo)畫(huà)出對(duì)象框圖。講述面向?qū)ο蟮某绦蛑欣^承性的重要意義。說(shuō)出并解釋軟件生命周期的各個(gè)階段。引言開(kāi)始編寫實(shí)際程序之前,我們需要介紹面向?qū)ο蟪绦蛟O(shè)計(jì)(ObjectOrientedProgramming)的幾個(gè)基本的概念,面向?qū)ο蟮某绦蛟O(shè)計(jì)是你將在本書(shū)學(xué)習(xí)的程序設(shè)計(jì)方式。本章的目的是讓你留下面向?qū)ο蟮某绦蛟O(shè)計(jì)的印象,介紹有關(guān)面向?qū)ο蟮某绦蛟O(shè)計(jì)的概念基礎(chǔ)。學(xué)習(xí)這本書(shū)之后,你可能需要重新閱讀本章。讀者中也許有一部分人有一定的程序設(shè)計(jì)經(jīng)驗(yàn),無(wú)論是面向?qū)ο蟮幕蚍敲嫦驅(qū)ο蟮?,大概均?huì)感到C#與自己以前學(xué)過(guò)的程序設(shè)計(jì)語(yǔ)言有些相似之處。這種相似可以加快你的學(xué)習(xí)進(jìn)程。但在許多情況下,看起來(lái)很相似,實(shí)際卻完全不同,所以請(qǐng)你不要對(duì)相似之處草率地下結(jié)論。本章的另一個(gè)目的是介紹軟件開(kāi)發(fā)過(guò)程。為了能夠編寫程序,只是知道面向?qū)ο蟪绦虻慕M成是不夠的,你必須學(xué)習(xí)程序的開(kāi)發(fā)過(guò)程。在這一章中。我們將簡(jiǎn)要介紹軟件的開(kāi)發(fā)過(guò)程。類和對(duì)象面向?qū)ο蟮某绦蛟O(shè)計(jì)中兩個(gè)最重要的概念是類和對(duì)象。從廣義的術(shù)語(yǔ)來(lái)說(shuō),對(duì)象(object)是一個(gè)可以想象的物體,既是有形的又是無(wú)形的。以面向?qū)ο蠓绞骄帉懙某绦蛴上嗷プ饔玫膶?duì)象組成。銀行用來(lái)維護(hù)往來(lái)賬戶的程序可能有許多Account、Customer、Transaction和ATM對(duì)象。對(duì)象由數(shù)據(jù)和處理這些數(shù)據(jù)的操作組成。例如,一個(gè)Account對(duì)象可以由諸如賬戶號(hào)碼、所有者、開(kāi)戶日期、最初余額以及當(dāng)前余額這樣的數(shù)據(jù)和諸如存款、轉(zhuǎn)賬以及取款這樣的操作組成。圖2.1對(duì)象的圖形表示法幾乎所有有價(jià)值的程序都有許多類型相同的對(duì)象。例如,在銀行使用的程序中我們可想象出它有許多Account、Customer和其他的對(duì)象。圖2.2顯示兩個(gè)名為Jack和Jill的Customer對(duì)象和一個(gè)名為SVl29的Account對(duì)象。圖2.2名為Jack和Jill的兩個(gè)Customer對(duì)象和一個(gè)名為Svl29的Account對(duì)象我們?cè)诔绦騼?nèi)部編寫出指令創(chuàng)建對(duì)象。為了讓計(jì)算機(jī)能夠創(chuàng)建一個(gè)對(duì)象,我們必須提供一個(gè)稱為“類(class)的定義。類是計(jì)算機(jī)用來(lái)創(chuàng)建對(duì)象的模型或模板,對(duì)象稱為“類的實(shí)例’(instance)。對(duì)象是某個(gè)確切類的實(shí)例,一個(gè)類的實(shí)例屬于(belongsto)這個(gè)類。Jack和JilI這兩個(gè)customer對(duì)象就是customer類的實(shí)例。只要一個(gè)類被定義,我們即可根據(jù)程序的需要?jiǎng)?chuàng)建這個(gè)類的許多對(duì)象。在創(chuàng)建一個(gè)類的實(shí)例(對(duì)象)之前必須定義這個(gè)類。圖2.3所示為本書(shū)中用來(lái)表示類的框圖,圖2.4顯示兩個(gè)類和5個(gè)對(duì)象。注意,其中包括了對(duì)象的類名,以清楚地識(shí)別某對(duì)象屬于哪個(gè)類。圖2.3類的圖形表示法圖2.4有兩個(gè)Account對(duì)象和3個(gè)Customer對(duì)象的兩個(gè)類Account和Customer消息和方法編寫面向?qū)ο蟮某绦虻倪^(guò)程中我們首先定義類,而當(dāng)程序開(kāi)始運(yùn)行時(shí),由這些類創(chuàng)建對(duì)象以完成任務(wù)。任務(wù)可以是兩個(gè)數(shù)相加、計(jì)算學(xué)校貸款利息支付以及計(jì)算航天飛機(jī)的返回角度等。為了命令類或?qū)ο髨?zhí)行一項(xiàng)任務(wù),我們要為其發(fā)送一個(gè)消息(message)。例如,我們發(fā)送new消息給Account類以創(chuàng)建一個(gè)實(shí)例(一個(gè)Account對(duì)象),然后可以為Account對(duì)象發(fā)送deposit消息,存款100美元。處理消息的類或?qū)ο蟊匦柘鄳?yīng)編程,不能只是將消息隨便發(fā)送給一個(gè)類或?qū)ο螅荒軐⑾l(fā)送給能夠理解這個(gè)消息的類或?qū)ο?。處理所收到消息的類或?qū)ο蟊仨氂袑?duì)應(yīng)的方法(method),也就是類或?qū)ο鬄橥瓿梢豁?xiàng)任務(wù)而執(zhí)行的指令序列。為類定義的方法稱為“類方法"_(classmethod),而為對(duì)象定義的方法就是實(shí)例方法(instancemethod)。我們首先看一個(gè)實(shí)例方法的例子。假設(shè)為Account對(duì)象定義了deposit方法,然后命令這個(gè)對(duì)象將指定數(shù)目的存款存入賬戶。由此方法定義,我們可以為Account對(duì)象發(fā)送一個(gè)deposit消息,隨后存入此存款。我們傳遞給對(duì)象的數(shù)值稱為“消息的變量"(argument)。注意,發(fā)送給對(duì)象或類的消息名必須與該方法名相同。圖2.5描述說(shuō)明了消息的發(fā)送過(guò)程。圖2.5發(fā)送deposit消息給Account對(duì)象圖2.5所示的框圖顯示的是單向傳送,即對(duì)象完成所請(qǐng)求的操作(存入指定的存款),但是不響應(yīng)信息發(fā)送者。在很多情況下,我們需要雙向傳送。在雙向傳送中,對(duì)象返回給信息發(fā)送者一個(gè)值。例如,假設(shè)我們需知道一個(gè)賬戶按月收取的費(fèi)用,則可以定義一個(gè)getMonthlyFee方法返回月費(fèi)用。圖2.6所示為一個(gè)為信息發(fā)送者返回值的方法。一個(gè)方法還可以報(bào)告所請(qǐng)求操作的狀態(tài),而不一定返回?cái)?shù)字值。例如,我們可以定義一個(gè)deduct方法,如果減去所傳遞的數(shù)量之,后得出負(fù)數(shù)余額,則返回fail狀態(tài)。圖2.6每月費(fèi)用的結(jié)果返回給信息的發(fā)送者類似地,如果類或?qū)ο蟛惶幚砟惆l(fā)送的消息,則不能將消息發(fā)送給這個(gè)類或?qū)ο?,即類或?qū)ο蟊仨毎瑢?duì)應(yīng)的方法。將消息發(fā)送給類或?qū)ο笫菆?zhí)行對(duì)應(yīng)方法的途徑,如果沒(méi)有對(duì)應(yīng)的方法,就什么都不會(huì)發(fā)生(事實(shí)上,將發(fā)生錯(cuò)誤)?,F(xiàn)在我們查看一個(gè)類方法的例子,如圖2.7所示的類方法getAverageBalance返回所有Account對(duì)象的平均余額。諸如getAverageBalance這樣的處理與類的實(shí)例有關(guān)的共同信息的方法通常被定義為類方法。因此為適合單獨(dú)實(shí)例的任務(wù)定義實(shí)例方法,應(yīng)為適合所有實(shí)例的任務(wù)定義類方法。圖2.7類方法getAverageBalance返回所有Account對(duì)象的平均余額注意我們?nèi)绾斡貌煌膱D標(biāo)表示類方法(長(zhǎng)方形)和實(shí)例方法(圓角長(zhǎng)方形)。由于類定義是我們定義其實(shí)例化所擁有方法之處,因此必須把類方法和實(shí)例方法都連接到類圖標(biāo)。虛線表示不能將實(shí)例消息發(fā)送給類本身。圖2.8概括了用來(lái)表示類、實(shí)例及其方法的繪制方法。圖2.8類和對(duì)象的圖形表示法類和實(shí)例數(shù)據(jù)值A(chǔ)ccount對(duì)象的deposit方法命令這個(gè)對(duì)象將指定數(shù)量的存款存入當(dāng)前余額,但是對(duì)象在何處保存當(dāng)前余額?要知道對(duì)象由數(shù)據(jù)值和方法組成。與定義類和實(shí)例方法類似,我們需要定義類和實(shí)例數(shù)據(jù)值。舉例來(lái)說(shuō),我們?yōu)锳ccount對(duì)象定義一個(gè)實(shí)例數(shù)據(jù)值currentbalance,以保存當(dāng)前余額。圖2.9顯示3個(gè)Account對(duì)象及其數(shù)據(jù)值currentbalance。注意它們?nèi)坑型瑯拥臄?shù)據(jù)值currentbalance。同一個(gè)類的所有實(shí)例化將擁有同一組數(shù)據(jù)值。currentbalance實(shí)際的美元數(shù)如框圖所說(shuō)明,各個(gè)實(shí)例不同。如同開(kāi)戶余額和賬戶編號(hào)這樣的項(xiàng)是Account對(duì)象可能擁有的其他實(shí)例數(shù)據(jù)值。圖2.93個(gè)Account對(duì)象擁有同樣的currentbalance,但實(shí)際的美元數(shù)不同類數(shù)據(jù)值用來(lái)表示所有實(shí)例共享的信息或表示與實(shí)例有關(guān)的共同信息。例如,如果每個(gè)賬戶必須維持一個(gè)最小余額,比如100美元,則我們可以定義一個(gè)類數(shù)據(jù)值。一個(gè)實(shí)例可以訪問(wèn)其所屬類的類數(shù)據(jù)值,因此每個(gè)Account對(duì)象可以訪問(wèn)這個(gè)minimumbalance類數(shù)據(jù)值。圖2.10說(shuō)明如何表示類數(shù)據(jù)值。為了理解類數(shù)據(jù)值的重要性,我們查看如果將最小余額表示為實(shí)例數(shù)據(jù)值將發(fā)生的情況。圖2.11顯示3個(gè)Account對(duì)象,其中currentbalance具有不同美元數(shù),但minimumbalance的美元數(shù)相同。很明顯,minimumbalance的重復(fù)是多余的,而且浪費(fèi)空間??紤]如果銀行將minimumbalance升到200美元后發(fā)生的情況。如果有100個(gè)Account對(duì)象,那么minimumbalance的所有100個(gè)副本都必須更新,將minimumbalance定義為類數(shù)據(jù)值即可避免這種情況。數(shù)據(jù)值有兩種類型:可以隨時(shí)改變的和不能改變的。前者稱為“變量”(variable),后者為“常數(shù)”(constant)。注意,現(xiàn)在有4種數(shù)據(jù)值:類變量、類常數(shù)、實(shí)例變量和實(shí)例常數(shù)。圖2.103個(gè)Account對(duì)象共享以類數(shù)據(jù)值存儲(chǔ)的信息(minimumbalance=100美元)圖2.11在實(shí)例化數(shù)據(jù)值中復(fù)制信息(minimumbalance=100美元)的3個(gè)Account對(duì)象繼承當(dāng)我們用Account,類及其實(shí)例闡明面向?qū)ο蟮母拍顣r(shí),有些人可能正在考慮經(jīng)常賬戶,而其他人可能已經(jīng)考慮儲(chǔ)蓄賬戶。在上面的例子中,我們未區(qū)分這兩種賬戶。如果稍微認(rèn)真地考慮這個(gè)問(wèn)題,你將明白,即使這兩種賬戶有許多共同的特征,事實(shí)上它們也是不同的。一般來(lái)說(shuō),用單個(gè)類作為兩個(gè)或多個(gè)相似,但不同的實(shí)體模型不是好的設(shè)計(jì)。讓我們研究竟為什么這種情況下使用Account類。假設(shè)銀行要求對(duì)儲(chǔ)蓄賬戶和經(jīng)常賬戶保持不同的最小余額,那么我們?nèi)绾斡脝蝹€(gè)的類作為這種情況的模型?有兩種選擇:(1)令minimumbalance為實(shí)例變量。(2)設(shè)2個(gè)類變量minimumsavingsbalance和minimumcheckingbalance。兩種解決方法都有重要缺陷:第1種方法復(fù)制相同的值,我們已經(jīng)說(shuō)過(guò)這是不好的設(shè)計(jì);第2種方法使取款的處理變得復(fù)雜,因?yàn)楸仨毚_定一個(gè)賬戶的類型后才能使用相應(yīng)的最小余額。確定一個(gè)特定對(duì)象是儲(chǔ)蓄賬戶還是經(jīng)常賬戶需要附加處理和數(shù)據(jù)值。如果用單個(gè)類作為兩個(gè)或多個(gè)實(shí)體的模型不是好的設(shè)計(jì),那么我們是否應(yīng)該為每個(gè)不同類型的實(shí)體設(shè)計(jì)單獨(dú)的類?對(duì)前面的例子,我們應(yīng)該定義兩個(gè)類:SavingsAccount和CheckingAccount。這種選擇也不是好的設(shè)計(jì),因?yàn)樽罱K還是要復(fù)制這些方法。例如,如果我們從儲(chǔ)蓄賬戶扣除取款金額的方式與檢查經(jīng)常賬戶的方式相同,那么我們將不得不為這兩個(gè)類定義完全相同的方法,復(fù)制相同的代碼。數(shù)據(jù)值復(fù)制問(wèn)題從而還可能隨方法復(fù)制出現(xiàn)。因此兩種選擇都有問(wèn)題,所以在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,我們實(shí)際使用一種稱為“繼承”(inheritance)的機(jī)制設(shè)計(jì)兩個(gè)或多個(gè)不同但有許多共同特征的實(shí)體。首先我們定義一個(gè)包括實(shí)體共同特征的類,然后定義公共類的擴(kuò)展類,擴(kuò)展類繼承公共類的所有成員。我們將公共類稱為超類(superclass),而由公共類繼承的類稱為子類(subclass).超類還稱為祖先(ancetor),子類稱為后代(descendant)。對(duì)于銀行的例子,我們可以定義一個(gè)Account.超類,然后定義Savings和Checking作為Account的子類。我們按圖2.12所示那樣表示超類及其子類。注意,我們之所以畫(huà)出從子類指向超類的箭頭,是因?yàn)樽宇惪梢砸闷涑愔卸x的項(xiàng),但反之不行。圖2.12超類Account及其子類Savings和Checking子類將繼承其超類的所有成員,我們不能說(shuō)我們需要子類繼承超類的50%,然而子類重載繼承的部分是可能的。例如,Account類定義了一個(gè)100美元minimumbalance的類變量,而Saving類用250美元重載此值。繼承的其他部分成份也可以被重載。舉例來(lái)說(shuō),Checking類可以通過(guò)增加適用于該類實(shí)例的指令重載繼承的deduct方法(例如,在任何一個(gè)指定的月份開(kāi)出超過(guò)10張支票以后,每回收一張的費(fèi)用是1美元)。子類還可以在由其超類繼承的部分增加方法和數(shù)據(jù)成員,Checking類可以增加一個(gè)新的實(shí)例變量保存一個(gè)月中開(kāi)出支票的數(shù)量。繼承不限于一層,子類可以是其他類的超類,從而形成繼承的層次結(jié)構(gòu)。思考圖2.13所示的例子。繼承性是非常強(qiáng)大的,如果使用正確,我們即可非常有效精致地開(kāi)發(fā)復(fù)雜的程序。使用強(qiáng)大工具的另一方面是如果不小心,則可能錯(cuò)誤,到最后也許陷入比不用它更糟的境地。貫穿全書(shū),我們都將討論繼承和如何正確地使用它。2.13不同類型帳號(hào)之間繼承的層次結(jié)構(gòu)的例子軟件工程和軟件生命周期當(dāng)我們說(shuō)到計(jì)算機(jī)程序設(shè)計(jì)(computerprogramming)時(shí),指的不僅是編寫Java語(yǔ)句,還包括整個(gè)軟件開(kāi)發(fā)的過(guò)程。只懂得程序設(shè)計(jì)語(yǔ)言并不足以成為一個(gè)有造詣的軟件開(kāi)發(fā)人員,你必須知道如何設(shè)計(jì)程序。本書(shū)講授如何以面向?qū)ο蟮姆绞皆O(shè)計(jì)程序。建房子時(shí),我們要分幾個(gè)明確的階段,每個(gè)階段均遵循設(shè)計(jì)原則。類似地,開(kāi)發(fā)程序也要分為若干階段,程序開(kāi)發(fā)的每個(gè)階段均遵循科學(xué)的方法。從程序的構(gòu)思到運(yùn)行所經(jīng)過(guò)的各個(gè)階段稱為"軟件生命周期"(SoftwareLifeCycle),而軟件工程(softwareengineering)是運(yùn)用系統(tǒng)、科學(xué)的方法開(kāi)發(fā)、測(cè)試和維護(hù)程序。軟件生命周期有5個(gè)主要階段:分析、設(shè)計(jì)、編寫代碼、測(cè)試和運(yùn)行。軟件的生命開(kāi)始于顧客的需求,例如某人需要一個(gè)在線地址簿。分析(analysis)階段完成可行性研究,我們分析問(wèn)題并確定解決方案是否可行。如果方案可行,則此階段的成果是描述程序功能的需求規(guī)范(requirementsspecification)。程序功能必須以一種可以測(cè)試的方式陳述,地址簿程序的功能之一是通過(guò)指定他或她的名字查找某人。我們可以通過(guò)運(yùn)行程序并實(shí)際查找某人測(cè)試這項(xiàng)功能。鍵入在地址簿中某人的名字和不在地址簿中某人的名字作為查找條件,檢查程序運(yùn)行是否符合要求。我們?cè)跍y(cè)試階段完成此測(cè)試,并簡(jiǎn)單說(shuō)明。在設(shè)計(jì)(design)階段,需求規(guī)范變?yōu)槌绦虻脑敿?xì)設(shè)計(jì)。對(duì)于面向?qū)ο蟮脑O(shè)計(jì),此階段的成果是一套滿足需求的類/對(duì)象。類/對(duì)象必須完全定義,要說(shuō)明其如何工作及之問(wèn)如何通信。對(duì)地址簿程序,我們可以設(shè)計(jì)Person、Phone和其他對(duì)象。在編寫代碼(coding)階段,我們將設(shè)計(jì)實(shí)現(xiàn)為實(shí)際的程序,在本書(shū)中即實(shí)現(xiàn)C#程序。只要我們有一個(gè)周密的設(shè)計(jì),然后將其實(shí)現(xiàn)為實(shí)際的代碼其實(shí)不難,難的是設(shè)計(jì)。在本書(shū)中,我們將更多重點(diǎn)放在軟件構(gòu)造

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論