第二章面向?qū)ο蠓椒▽W導(dǎo)論_第1頁
第二章面向?qū)ο蠓椒▽W導(dǎo)論_第2頁
第二章面向?qū)ο蠓椒▽W導(dǎo)論_第3頁
第二章面向?qū)ο蠓椒▽W導(dǎo)論_第4頁
第二章面向?qū)ο蠓椒▽W導(dǎo)論_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第二章面向?qū)ο蠓椒▽W導(dǎo)論本章概要

傳統(tǒng)的軟件工程方法學曾經(jīng)給軟件產(chǎn)業(yè)帶來巨大進步,部分地緩解了軟件危機,使用這種方法學開發(fā)的許多中、小規(guī)模軟件項目都獲得了成功。但是,人們也注意到當把這種方法學應(yīng)用于大型軟件產(chǎn)品的開發(fā)時,似乎很少取得成功。在20世紀60年代后期出現(xiàn)的面向?qū)ο缶幊陶Z言Simula-67中首次引入了類和對象的概念,自20世紀80年代中期起,人們開始注重面向?qū)ο蠓治龊驮O(shè)計的研究,逐步形成了面向?qū)ο蠓椒▽W。到了20世紀90年代,面向?qū)ο蠓椒▽W已經(jīng)成為人們在開發(fā)軟件時首選的范型。面向?qū)ο蠹夹g(shù)已成為當前最好的軟件開發(fā)技術(shù)。2.1面向?qū)ο蠓椒▽W概述2.1.1面向?qū)ο蠓椒▽W導(dǎo)論

○面向過程程序設(shè)計:根據(jù)計算機的要求,圍繞算法進行程序設(shè)計。開發(fā)軟件的方法與過程不同于人類認識世界解決問題時習慣采用的方法與過程,因此使得描述問題的問題空間與實現(xiàn)解法的解空間在結(jié)構(gòu)上明顯不同。人類習慣的解決問題的方法

讓我們觀察一個日常生活中常見的事例:一位廚師的頭發(fā)長了需要理發(fā),他會走進理發(fā)館,告訴理發(fā)師要理什么發(fā)式。也就是說,為了解決頭發(fā)過長的問題,廚師只需向理發(fā)師提出要求,告訴他“做什么”(即,理什么發(fā)式),并不需要告訴理發(fā)師“怎樣做”,理發(fā)師自己知道第一步做什么,第二步做什么。類似地,理發(fā)師肚子餓了,只需走進餐館點好自己要吃的飯菜,廚師自己知道該怎樣做,并不需要顧客告訴他做菜的具體步驟,事實上,顧客無需知道做菜的具體步驟。

面向?qū)ο蟪绦蛟O(shè)計方法模擬人類習慣的解題方法,用對象分解取代功能分解,也就是把程序分解成許多對象,不同對象之間通過發(fā)消息向?qū)Ψ教岢龇?wù)要求,接受消息的對象主動完成指定功能,程序中的所有對象分工協(xié)作,共同完成整個程序的功能。面向?qū)ο蟪绦蛟O(shè)計方法模擬人類習慣2.1.2面向?qū)ο蠓椒ǜ攀?/p>

面向?qū)ο蠓椒▽W的出發(fā)點和基本原則,是盡可能模擬人類習慣的思維方式,使開發(fā)軟件的方法與過程盡可能接近人類認識世界解決問題的方法與過程,也就是使描述問題的問題空間(也稱為問題域)與實現(xiàn)解法的解空間(也稱求解域)在結(jié)構(gòu)上盡可能一致。面向?qū)ο蠓椒ň哂邢率?個要點:

⑴認為客觀世界是由各種對象組成的,任何事物都是對象,復(fù)雜的對象可以由比較簡單的對象以某種方式組合而成。⑵把所有對象都劃分成各種對象類(簡稱為類,Class),每個對象類都定義了一組數(shù)據(jù)和一組方法。⑶按照子類(或稱為派生類)與父類(或稱為基類)的關(guān)系,把若干個對象類組成一個層次結(jié)構(gòu)的系統(tǒng)(也稱為類等級)。⑷對象彼此之間僅能通過傳遞消息互相聯(lián)系。2.1.3面向?qū)ο蠓椒ǖ闹饕獌?yōu)點⑴與人類習慣的思維方法比較一致面向?qū)ο蠓椒▽W的基本原則是按照人們習慣的思維方式建成立問題域的模型,開發(fā)出盡可能直觀、自然地表現(xiàn)求解方法的軟件系統(tǒng)。面向?qū)ο蟮能浖到y(tǒng)中廣泛使用的對象,是對客觀世界中實體的抽象。⑵穩(wěn)定性好面向?qū)ο蠓椒ɑ跇?gòu)造問題領(lǐng)域的對象模型,以對象為中心構(gòu)造軟件系統(tǒng)。它的基本作法是用對象模擬問題領(lǐng)域中的實體,以對象間的聯(lián)系刻畫實體間的聯(lián)系。因此,以對象為中心構(gòu)造的軟件系統(tǒng)也是比較穩(wěn)定的。⑶可重用性好面向?qū)ο蟮能浖夹g(shù)在利用可重用的軟件成分構(gòu)造新的軟件系統(tǒng)時,有很大的靈活性。其中,有兩種方法可以重復(fù)使用一個對象類:一種方法是創(chuàng)建該類的實例,從而直接使用它;另一種方法是從它派生出一個滿足當前需要的新類。⑷較易開發(fā)大型軟件產(chǎn)品⑸可維護性好⑹面向?qū)ο筮€有如下突出優(yōu)點:①面向?qū)ο筌浖€(wěn)定性比較好;②面向?qū)ο蟮能浖容^容易修改;③面向?qū)ο蟮能浖容^容易理解;④易于測試和調(diào)試。2.1.4噴泉模型

噴泉模型體現(xiàn)了面向?qū)ο蠓椒ㄋ逃械牡蜔o間隙的特征。迭代是軟件開發(fā)過程中普遍存在的一種內(nèi)在屬性。即,軟件開發(fā)活動需多次重復(fù),每次重復(fù)都從分析開始,依次進行設(shè)計、實現(xiàn),逐漸細化,演化出最終系統(tǒng)。圖2.1 噴泉模型2.2面向?qū)ο蟮母拍?.2.1對象在應(yīng)用領(lǐng)域中有意義的,與所要解決的問題有關(guān)系的任何事物都可以作為對象(Object),它既可以是具體的物理實體的抽象,也可以是人為的概念,或者是任何有明確邊界和意義的東西。例如,一名職工、一家公司、一個窗口、一座圖書館、一本圖書、貸款、借款等等,都可以作為一個對象??傊?,對象是對問題域中某個實體的抽象,設(shè)立某個對象就反映了軟件系統(tǒng)具有保存有關(guān)它的信息并且與它進行交互的能力。

面向?qū)ο蠓椒▽W中的對象:是由描述該對象屬性的數(shù)據(jù)以及可以對這些數(shù)據(jù)施加的所有操作封裝在一起構(gòu)成的統(tǒng)一體。對象可以作的操作表示它的動態(tài)行為,通常稱為服務(wù)或方法。對象的形象表示(舉例)

一個對象很像一臺錄音機。當在軟件中使用一個對象的時候,只能通過對象與外界的界面來操作它。對象與外界的界面也就是該對象向公眾開放的操作,例如,C++語言中對象的公有的(Public)成員函數(shù)。一個對象好象是一個黑盒子,表示它內(nèi)部狀態(tài)的數(shù)據(jù)和實現(xiàn)各個操作的代碼及局部數(shù)據(jù),都被封裝在這個黑盒子內(nèi)部,在外面是看不見的,更不能從外面去訪問或修改這些數(shù)據(jù)或代碼。對象的形象表示:圖2.2對象的形象表示對象的定義

人們從不同角度給出對象的不同定義:

1、定義1:對象是具有相同狀態(tài)的一組操作的集合。

2、定義2:對象是對屬性值和操作的封裝。

3、定義3:對象=〈ID,MS,DS,MI〉

其中,ID是對象的標識或名字,MS是對象中的操作集合,DS是對象的數(shù)據(jù)結(jié)構(gòu),MI是對象受理的消息名集合(即對外接口),注意:這個定義是一個形式化的定義。

總之,對象是封裝了數(shù)據(jù)結(jié)構(gòu)及可以施加在這些數(shù)據(jù)結(jié)構(gòu)上的操作的封裝體,這個封裝體有可以唯一地標識它的名字,而且向外界提供一組服務(wù)(即公有的操作)。對象中的數(shù)據(jù)表示對象的狀態(tài),一個對象的狀態(tài)只能由該對象本身的操作來改變。對象的特點⒈以數(shù)據(jù)為中心,操作是為數(shù)據(jù)服務(wù)的。⒉對象是主動的,為了完成某個操作,不能從外部直接加工它的私有數(shù)據(jù),而是必須通過它的公有接口向?qū)ο蟀l(fā)消息,請求它執(zhí)行它的某個操作,處理它的私有數(shù)據(jù)。(舉例:廚師與理發(fā)匠)。⒊實現(xiàn)了數(shù)據(jù)封裝。對象好像是一只黑盒子,它的私的數(shù)據(jù)完全被封裝在盒子內(nèi)部,對外是隱藏的、不可見的,對私有數(shù)據(jù)的訪問或處理只能通過公有的操作進行。抽象數(shù)據(jù)類型的概念,無須知道數(shù)據(jù)的具體結(jié)構(gòu)以及實現(xiàn)操作的算法。

⒋本質(zhì)上具有并行性。不同對象各自獨立地處理自身的數(shù)據(jù),彼此通過發(fā)消息傳遞信息完成通信。因此,對于不同的對象來說,本質(zhì)上具有并行工作的屬性。⒌模塊獨立性好。對象是面向?qū)ο蟮能浖幕灸K。2.2.2其他概念⒈類(class)“類”——就是對具有相同數(shù)據(jù)和相同操作的一組相似對象的定義,也就是說,類是對具有相同屬性和行為的一個或多個對象的描述。例如:張三、李四、王五等,雖說每個人職業(yè)、性格、愛好、特長等等各有不同。但是,他們的基本特征是相似的,都是黃皮膚、黑頭發(fā)、黑眼睛,于是人們把他們統(tǒng)稱為“中國人”。⒉實例(instance)“實例”是由某個特定的類所描述的一個具體的對象?!皩ο蟆边@個術(shù)語,既可以指一個具體的對象,也可以泛指一般的對象,而“實例”這個術(shù)語,必然是指一個具體的對象。

C++中,要定義一個對象或?qū)嵗?,必須先建立一個這類對象的類。⒊消息(message):要求某個對象執(zhí)行其中某個操作的規(guī)格的說明,一個消息由下述三部分組成:⑴接收消息的對象;⑵消息選擇符(也稱為消息名);⑶零個或多個變元。例如:MyCircle.Show(GREEN);其中:MyCircle是Circle類的對象,也是Circle類的一個實例。

Show是消息選擇符(即消息名);

GREEN是消息的變元。⒋方法(method)方法,就是對象所能執(zhí)行的操作,也就是類中所定義的服務(wù)。在C++語言中把方法稱為成員函數(shù)。通常,一個函數(shù)對應(yīng)一個操作,實現(xiàn)一個功能。例如:為了MYCircle這個對象能夠顯示一個圓,在Circle類中必須定義成員函數(shù)Show(intcolor)。⒌屬性(attribute)屬性,就是類中所定義的數(shù)據(jù),它是對客觀世界實體所具有的性質(zhì)的抽象。例如:Circle類中定義代表圓心坐標、半徑、顏色等屬性。在C++語言中把屬性稱為數(shù)據(jù)成員。⒍封裝性(encapsulation)從字面上理解,所謂封裝就是把某個事物包起來,使外界不知道該事物的具體內(nèi)容把數(shù)據(jù)和實現(xiàn)操作的代碼集中起來放在對象內(nèi)部。使用一個對象的時候,只需知道它向外界提供的接口形式而無須知道它的數(shù)據(jù)結(jié)構(gòu)細節(jié)和實現(xiàn)操作的算法。實現(xiàn)封裝的條件:⑴有一個清楚的邊界。⑵有確定的接口(這些接口就是對象可以接受的消息,用戶只能通過向?qū)ο蟀l(fā)送消息來使用它)。⑶受保護的內(nèi)部實現(xiàn)。⒎繼承(inheritance)繼承是指能夠直接獲得已有的性質(zhì)和特征,而不必重復(fù)定義它們。子類自動地共享基類中定義的數(shù)據(jù)和方法的機制。(舉例:父與子)繼承具有傳遞性,如果類C繼承類B,類B繼承類A,則類C繼承類A。一個類除了具有該類所描述的性質(zhì)外,還具有類等級中該類上層全部基類描述的一切性質(zhì)。繼承機制的原理圖2.4 實現(xiàn)繼承機制的原理⒏多態(tài)性(polymorphism)

多態(tài)性是指子類對象可以像父類對象那樣使用。同樣的消息既可以發(fā)送給父類對象也可以發(fā)送給子類對象。在類等級的不同層次中,相同的消息,被不同的類(屬同一簇)的對象接收,產(chǎn)生了不同的行為。在C++語言中,多態(tài)性是通過虛函數(shù)來實現(xiàn)的。虛函數(shù)機制使得程序員能在一個類等級中使用相同函數(shù)的多個不同版本,在運行時刻才根據(jù)接收消息的對象所屬于的類,決定到底執(zhí)行哪個特定的版本,這稱為動態(tài)聯(lián)編,也叫滯后聯(lián)編。⒐重載(overloading)(有兩種重載)⑴函數(shù)重載是指在同一作用域內(nèi)的若干個參數(shù)特征不同的函數(shù)可以使用相同的函數(shù)名字;⑵運算符重載是指同一個運算符可以施加于不同類型的操作數(shù)上面。在C++語言中函數(shù)重載是通過靜態(tài)聯(lián)編實現(xiàn)的,也就是在編譯時根據(jù)函數(shù)變元的個數(shù)和類型,決定到底使用函數(shù)的哪個實現(xiàn)代碼;對于重載的運算符,同樣是在編譯時根據(jù)被操作數(shù)的類型,決定使用該算符的哪種語義。如:cout<<“2”;表示向屏幕輸出字符串2x<<2;表示將x中的二進制左移2位熟悉并使用類C++標準庫提供了string類,string類的屬性是一個字符串str,同名函數(shù)string是用來初始化符串,另外3個成員函數(shù)用來對屬性str進行操作。當定義了一個對象后,這個對象可以通過這些成員函數(shù)展現(xiàn)自身的特性。stringstrstring()find()size()substr()使用string類的例子#include<iostream>#include<string>usingnamespacestd;voidmain(){ stringstr1("Wearehere!"); stringstr2; cout<<str1[0]<<str1[11]<<","<<str1<<endl; cout<<"pleaseinputaword:"; cin>>str2;//輸入一個單詞給對象str2 cout<<"lengthofstr2is"<<str2.size()<<endl; stringnewstr=str2.substr(3,1);//從str2的第3位開始截取1個字符 cout<<"newstr="<<newstr<<endl; inti=str1.find(“are”,0);//從字符串str1的位置0開始檢索are cout<<"i="<<i<<endl;}注意:C++規(guī)定符串的計數(shù)是從零開始的2.3面向?qū)ο蠼?/p>

所謂模型,由一組圖示符號和組織這些符號的規(guī)則組成,利用它們來定義和描述問題域中的術(shù)語和概念。模型是一種思考工具,利用這種工具可以把知識規(guī)范地表示出來。為了開發(fā)復(fù)雜的軟件系統(tǒng),系統(tǒng)分析員應(yīng)該抽象出目標系統(tǒng)的特性,使用精確的表示方法構(gòu)造系統(tǒng)的模型,并在設(shè)計過程中逐漸把和實現(xiàn)有關(guān)的細節(jié)加進模型中,直至最終用程序?qū)崿F(xiàn)模型。

用面向?qū)ο蠓椒ㄩ_發(fā)軟件,通常需要建立三種形式的模型,它們分別是:⒈描述系統(tǒng)數(shù)據(jù)結(jié)構(gòu)的對象模型(基本、核心)⒉描述系統(tǒng)控制結(jié)構(gòu)的動態(tài)模型⒊描述系統(tǒng)功能的功能模型一個典型的軟件系統(tǒng)組合了上述三方面內(nèi)容:它使用數(shù)據(jù)結(jié)構(gòu)(對象模型),執(zhí)行操作(動態(tài)模型),并且完成數(shù)據(jù)值的變化(功能模型)。2.4對象模型

對象模型是上述三種模型中最重要、最基本、最核心的模型,是表示靜態(tài)的、結(jié)構(gòu)化的系統(tǒng)的“數(shù)據(jù)”性質(zhì)。

它是對模擬客觀世界實體的對象以及對象彼此間的關(guān)系的映射,描述了系統(tǒng)的靜態(tài)結(jié)構(gòu)。面向?qū)ο蠓椒◤娬{(diào)圍繞對象而不是圍繞功能來構(gòu)造系統(tǒng)。對象模型為建立動態(tài)模型和功能模型,提供了實質(zhì)性的框架。2.4.1類圖的基本符號⒈定義類

UML中類的圖形符號為長方形,用兩條橫線把長方形分成上、中、下3個區(qū)域(下面兩個區(qū)域可省略),3個區(qū)域分別放類的名字、屬性和服務(wù)。2.4.1類圖的基本符號類命名時應(yīng)遵守以下幾條準則:⑴使用標準術(shù)語。⑵使用具有確切含義的名詞。⑶必要時用名詞短語作名字。總之,名字應(yīng)該是富于描述性的、簡潔的而且無二義性的。2.4.1類圖的基本符號⒉定義屬性UML描述屬性的語法格式如下: 可見性屬性名:類型名=初值{性質(zhì)串}屬性的可見性(即可訪問性)通常有下述3種:公有的(public)用加號(+)表示 私有的(private)用減號(-)表示 和保護的(protected)用井號(#)表示 如果未聲明可見性,則表示該屬性的可見性尚未定義。例如:“學生”類的屬性“學號”,可以這樣描述:-學號:String=“020010”

2.4.1類圖的基本符號⒊定義服務(wù)服務(wù)也就是操作,UML描述操作的語法格式如下:

可見性操作名(參數(shù)表):返回值類型{性質(zhì)串}操作可見性的定義方法與屬性相同。參數(shù)表是用逗號分隔的形式參數(shù)的序列。描述一個參數(shù)的語法如下:

參數(shù)名:類型名=默認值2.4.2表示關(guān)系的符號

⒈關(guān)聯(lián)關(guān)聯(lián)表示兩個類的對象之間存在某種語義上的聯(lián)系。⑴普通關(guān)聯(lián) 普通關(guān)聯(lián)是最常見的關(guān)聯(lián)關(guān)系,只要在類與類之間存在連接關(guān)系就可以用普通關(guān)聯(lián)表示。普通關(guān)聯(lián)的圖示符號是連接兩個類之間的直線。圖2.6 普通關(guān)系示例2.4.2表示關(guān)系的符號⑵關(guān)聯(lián)的角色

例如:一個人與另一個人結(jié)婚,必然一個人扮演丈夫的角色,另一個人扮演妻子的角色。

圖2.7 關(guān)聯(lián)的角色2.4.2表示關(guān)系的符號⑶限定關(guān)聯(lián) 限定關(guān)聯(lián)通常用在一對多或多對多的關(guān)聯(lián)關(guān)系中,可以把模型中的重數(shù)從一對多變成一對一,或從多對多簡化成多對一。 例如,某操作系統(tǒng)中一個目錄下有許多文件,一個文件僅屬于一個目錄,在一個目錄內(nèi)文件名確定了惟一一個文件。

圖2.8 一個受限的關(guān)聯(lián)2.4.2表示關(guān)系的符號⑷關(guān)聯(lián)類 為了說明關(guān)聯(lián)的性質(zhì)可能需要一些附加信息??梢砸胍粋€關(guān)聯(lián)類來記錄這些信息。

例如,圖2.9是一個電梯系統(tǒng)的類模型,隊列就是電梯控制器類與電梯類的關(guān)聯(lián)關(guān)系上的關(guān)聯(lián)類。圖2.9關(guān)聯(lián)類示例2.4.2表示關(guān)系的符號⒉聚集 聚集也稱為聚合,是關(guān)聯(lián)的特例。聚集表示類與類之間的關(guān)系是整體與部分的關(guān)系。⑴共享聚集 如圖2.10所示。一般聚集和共享聚集的圖示符號,都是在表示關(guān)聯(lián)關(guān)系的直線末端緊挨著整體類的地方畫一個空心菱形。

圖2.10共享聚集示例2.4.2表示關(guān)系的符號⑵組合聚集圖2.11是窗口的組成,從圖上可以看出組成關(guān)系用實心棱形表示。

圖2.11組合聚集示例2.4.2表示關(guān)系的符號⒊泛化

UML中的泛化關(guān)系就是通常所說的繼承關(guān)系,它是通用元素和具體元素之間的分類關(guān)系。 泛化可進一步劃分成普通泛化和受限泛化。

2.4.2表示關(guān)系的符號圖2.12抽象類示例⑴普通泛化2.4.2表示關(guān)系的符號圖2.13復(fù)雜類圖示例2.4.2表示關(guān)系的符號圖2.14多重繼承示例⑵受限泛化2.4.2表示關(guān)系的符號⒋依賴和細化

⑴依賴關(guān)系 依賴關(guān)

溫馨提示

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

評論

0/150

提交評論