軟件工程導(dǎo)論class13面向?qū)ο蠓椒▽W(xué)引論



單擊此處編輯母版標(biāo)題樣式,,單擊此處編輯母版文本樣式,,第二級(jí),,第三級(jí),,第四級(jí),,第五級(jí),,,,*,,,單擊此處編輯母版標(biāo)題樣式,,單擊此處編輯母版文本樣式,,第二級(jí),,第三級(jí),,第四級(jí),,第五級(jí),,,,*,軟件工程導(dǎo)論第,13,課,第,9,章 面向?qū)ο蠓椒▽W(xué)引論,發(fā)展概述,面向?qū)ο蟛⒎鞘且粋€(gè)新的概念,實(shí)際上它已有,30,多年的歷史尋其根源可追溯到,60,年代的挪威,當(dāng)時(shí)挪威計(jì)算中心的,Kristen Nygaard,和,Ole-Johan Dahl,開發(fā)了一種稱作,Simula67,的語言Simula67,首次引入了類、協(xié)同程序和子類的概念,這很象今天的面向?qū)ο笳Z言70,年代中期,,Xerox Palo Alto,研究中心的研究人員設(shè)計(jì)了,Smalltalk,語言,該語言的每個(gè)元素都被當(dāng)作一個(gè)對(duì)象來實(shí)現(xiàn),其程序設(shè)計(jì)環(huán)境及相關(guān)的各個(gè)方面都是面向?qū)ο蟮牡?,面向?qū)ο蟮耐茝V很慢例如:,Samlltalk,的成果直到,1981,年,8,月因,Byte,雜志的介紹才為外界所知,許多軟件開發(fā)人員了解,Samlltalk,時(shí),都把它看作是一個(gè)窗口系統(tǒng),而不是程序設(shè)計(jì)技術(shù)的一次革命80,年代,,C,成為很受歡迎的程序設(shè)計(jì)語言,它不僅可用在微機(jī)上,還可用在多種結(jié)構(gòu)的系統(tǒng)和環(huán)境中。
80,年代早期,,AT&T,貝爾實(shí)驗(yàn)室的,Bjarne Stroustrup,把,C,語言擴(kuò)展為支持面向?qū)ο蟪绦蛟O(shè)計(jì)的,C++,在,C++,中,程序員可以在其熟悉的語言環(huán)境下學(xué)習(xí)掌握面向?qū)ο蟮某绦蛟O(shè)計(jì)技術(shù),而不必去探究一種新的語言和環(huán)境自,90,年代以來,軟件與硬件之間的差距至少有兩代處理器之多,并且這種差距還在增大當(dāng)軟件系統(tǒng)變得更加復(fù)雜時(shí),常規(guī)軟件工具、技術(shù)和概念已不足以應(yīng)付,從而使軟件開發(fā)者陷入了困境但面向?qū)ο蟮姆椒軌蚩刂栖浖膹?fù)雜性,從而促進(jìn)了面向?qū)ο蟮陌l(fā)展,掀起了一股“面向?qū)ο蟆睙?.1.1,面向?qū)ο蠓椒▽W(xué)的要點(diǎn),OOM,的出發(fā)點(diǎn)和基本原則:,,盡可能,模擬人類習(xí)慣的思維方式,,使描述問題的,問題空間,與實(shí)現(xiàn)解法的,解空間,在結(jié)構(gòu)上盡可能,一致,面向?qū)ο蠓椒ㄊ且环N以,數(shù)據(jù)和信息,為主線,把數(shù)據(jù)和處理相結(jié)合的方法:,,面向?qū)ο蠓椒?把對(duì)象作為由數(shù)據(jù)及可以施加在這些數(shù)據(jù)上的操作所構(gòu)成的統(tǒng)一體,9.1.1,面向?qū)ο蠓椒▽W(xué)的要點(diǎn),解空間與問題空間的,“,語義斷層,”,,對(duì)象,,解空間對(duì)象和問題空間對(duì)象,,解空間對(duì)象的呆板,,問題空間對(duì)象,具有,靜態(tài)屬性,又具有,動(dòng)態(tài)行為,,OOM,的,4,個(gè)要素,(1),對(duì)象,(object),:世界由對(duì)象組成。
2),類,(class),:具有相同屬性和操作的對(duì)象可劃分為類; 單個(gè)對(duì)象可視為某一類的實(shí)例,(instance),,(3),繼承,(inheritance),:類可分層下層子類與上層父類有相同特征,稱為繼承,,(4),消息,(message),:對(duì)象間只能通過發(fā)送消息進(jìn)行聯(lián)系, 外界不能處理對(duì)象的內(nèi)部數(shù)據(jù),只能通過消息,,基于對(duì)象(,objects,-,based,)方法,,使用對(duì)象,-,消息,,基于類(,class-based,)方法,,使用類,-,對(duì)象,-,消息,,面向?qū)ο螅?objects-based,)方法,,使用類,-,對(duì)象,-,消息,-,繼承,,9.1.2,面向?qū)ο蠓椒▽W(xué)的優(yōu)點(diǎn),與人類習(xí)慣的思維方式一致,,穩(wěn)定性好,,可重用性好,,可維護(hù)性好,,注意,:,OOM,并不是減少了開發(fā)時(shí)間,而是通過提高可重用性、可維護(hù)性,進(jìn)行擴(kuò)充和修改的容易程度等,從長遠(yuǎn)角度改進(jìn)了軟件的質(zhì)量1,與人類習(xí)慣的思維方式一致,傳統(tǒng)方法,:面向過程設(shè)計(jì),以計(jì)算為核心,數(shù)據(jù)與操作分離,不易理解②,OOM,:以,object,為核心,,,基本原理,:使用現(xiàn)實(shí)世界的概念抽象地思考問題從而自然地解決問題,強(qiáng)調(diào)對(duì)現(xiàn)實(shí)概念的模擬而不強(qiáng)調(diào)算法。
面向?qū)ο蠓椒▽W(xué)的,基本原則,,是按照人們習(xí)慣的思維方式建立問題域的模型,開發(fā)出盡可 能直觀、自然地表現(xiàn)求解方法的軟件系統(tǒng)Class,:由特殊到一般的歸納,(induction),,Inheritance,:由一般到特殊的演繹,(deduction),,2,穩(wěn)定性好,傳統(tǒng)方法:結(jié)構(gòu)依賴于功能,不穩(wěn)定OOM,:以,object,模擬實(shí)體,以對(duì)象間的聯(lián)系刻畫實(shí)體間的聯(lián)系需求變化不會(huì)引起結(jié)構(gòu)的整體變化,只需做一些局部修改因?yàn)閷?shí)體相對(duì)穩(wěn)定,故系統(tǒng)也相應(yīng)穩(wěn)定3,可重用性好,傳統(tǒng)方法:通過建立標(biāo)準(zhǔn)函數(shù)庫來重用軟構(gòu)件但標(biāo) 準(zhǔn)函數(shù)缺少必要的,“,柔性,”,,難以適應(yīng)不同場合的不同需要OOM,:封裝性,信息隱蔽,獨(dú)立性,,靈活性:一個(gè),class,所有的,instances,都可重用它的代碼;由派生出的新的,class,可重用其父類的代碼,并且可以修改、擴(kuò)充而不影響其父類的使用4,較易開發(fā)大型軟件產(chǎn)品,構(gòu)成軟件系統(tǒng)的每個(gè)對(duì)象就象一個(gè)微型程序,有自己的數(shù)據(jù)、操作、功能、用途把一個(gè)大型軟件產(chǎn)品分解成一系列本質(zhì)上相互獨(dú)立的小產(chǎn)品處理,降低了技術(shù)難度便于管理,5,可維護(hù)性好,傳統(tǒng)方法:可維護(hù)性是最令人頭痛的問題OOM,:從以下幾方面改善了可維護(hù)性,,(1),穩(wěn)定性好,:需求的變化不牽動(dòng)全局,只需局部修改;,,(2),容易修改,:,Class,獨(dú)立性強(qiáng):只要修改不涉及,class,的對(duì)外接口,則內(nèi)部修改完全不影響外部調(diào)用;,,繼承,(Inheritance),和多態(tài)性,(polymorphism),使其易被修改和擴(kuò)充;,,(3),容易理解、容易測試、調(diào)試,5,可維護(hù)性好,(3),容易理解,,符合人的思維習(xí)慣,軟件系統(tǒng)結(jié)構(gòu)與問題空間的結(jié)構(gòu)基本一致,便于理解,,派生類只要理解新生部分,理解量少,,(4),容易測試、調(diào)試,,調(diào)試只對(duì)新派生類進(jìn)行,類獨(dú)立性強(qiáng),只對(duì)類內(nèi)部進(jìn)行調(diào)試,比較容易。
9.2,面向?qū)ο蟮母拍?9.2.1,對(duì)象,,在應(yīng)用領(lǐng)域中,有意義的、與所要解決的問題有關(guān)系的,任何事物,都可以作為對(duì)象,,對(duì)象既可以是具體的物理實(shí)體的抽象,也可以是人為的 概念,或者是任何有明確邊界和意義的東西例如,一名職工、一家公司、一個(gè)窗口、一座圖書館、一本圖書、貸款、借款等等,都可以作為一個(gè)對(duì)象9.2.1,對(duì)象,由于客觀世界中的實(shí)體通常都具有靜態(tài)的屬性,又具有動(dòng)態(tài)的行為,,面向?qū)ο蠓椒▽W(xué)中,的對(duì)象是,由描述該對(duì)象屬性數(shù)據(jù)以及可以對(duì)這些數(shù)據(jù)施加的所有操作封裝在一起的統(tǒng)一體從形式化角度看:,,對(duì)象,::=,,其中:,ID,是對(duì)象的標(biāo)識(shí)或名字,,MS,是對(duì)象中的數(shù)據(jù)集合,,DS,是對(duì)象中的數(shù)據(jù)結(jié)構(gòu),,MI,是對(duì)象受理的消息名集合1,對(duì)象的形象表示,對(duì)象很像錄音機(jī),,,2,對(duì)象的定義,從不同的角度給對(duì)象不同的定義,,定義,1,:對(duì)象是具有相同狀態(tài)的一組操作的集合定義,2,:對(duì)象是對(duì)問題域中某個(gè)東西的抽象,這種抽象反映了系統(tǒng)保存有關(guān)這個(gè)東西的信息或與它交互的 能力,,,定義,3,:對(duì)象,::=,,依次表示名字操作集合數(shù)據(jù)結(jié)構(gòu) 對(duì)外接口,,,,3,對(duì)象特點(diǎn),①,以數(shù)據(jù)為中心,,不設(shè)與數(shù)據(jù)無關(guān)的操作;,,②,Object,主動(dòng)處理而不被動(dòng)地等待被處理,外部只能通過,message,請(qǐng)求操作;,,③,具有封裝性,:外部操作時(shí),無須知道該,object,內(nèi)部的數(shù)據(jù)結(jié)構(gòu)及算法;,,④,具有并行性,:不同,object,各自獨(dú)立地處理自身數(shù)據(jù),彼此間僅通過傳遞,message,完成通信;,,⑤,模塊獨(dú)立性好,:內(nèi)聚強(qiáng)、耦合松,,,,,其他概念,1,類,:是對(duì)具有相同數(shù)據(jù)和相同操作的一組相似對(duì)象的定義。
例 人、圓,,是對(duì)象的抽象,是一種對(duì)象模型,,2,,實(shí)例,:是由某個(gè)特定的類所描述的一個(gè)具體對(duì)象類是建立對(duì)象時(shí)使用的模板,用這個(gè)模板建立的一個(gè)具體對(duì)象,就是類的實(shí)例對(duì)象既可以是一個(gè)具體的對(duì)象,也可以泛指一般的對(duì)象;而實(shí)例只能是一個(gè)具體的對(duì)象,3,消息,:是要求某個(gè)對(duì)象執(zhí)行在定義它的那個(gè)類中所定義的某個(gè)操作的規(guī)格說明由,3,部分組成:接受消息的對(duì)象、消息選擇符,(,名,),、零個(gè)和多個(gè)變?cè)?,方法,:是對(duì)象所能執(zhí)行的操作;即類中所定義的服務(wù)方法描述了對(duì)象執(zhí)行操作的算法,響應(yīng)消息的方法5,,屬性,:是類中所定義的數(shù)據(jù),是對(duì)客觀實(shí)體所具有的性質(zhì)的抽象,,,,,6,封裝,:是把某個(gè)事務(wù)包起來,使外界不知道該事物的具體內(nèi)容封裝的條件:,,(1),有一個(gè)清晰的邊界,,(2),有確定的接口接口就是對(duì)象可以接受的消息3),受保護(hù)的內(nèi)部實(shí)現(xiàn),繼承繼繼承繼7 繼承,,繼承是子類自動(dòng)地共享基類中定義的數(shù)據(jù)和方法的機(jī)制,其特性是:一個(gè)類的上層可以有父類,下層可以有子類繼承具有傳遞性,如果類,C,繼承類,B,,類,B,繼承類,A,,則類,C,繼承類,A,當(dāng)類等級(jí)為樹形結(jié)構(gòu)時(shí),類的繼承是單繼承;當(dāng)允許一個(gè)類有多個(gè)父親時(shí),類的繼承是多重繼承。
繼承性的優(yōu)點(diǎn),,共享程序代碼和數(shù)據(jù)結(jié)構(gòu),大大減少程序中的冗余信息,提高軟件的可重用性便于軟件修改維護(hù)當(dāng)需要擴(kuò)充原有的功能時(shí),派生類的方法可以調(diào)用其基類的方法,并在此基礎(chǔ)上增加必要的程序代碼;當(dāng)需要完全改變?cè)械乃惴〞r(shí),可以在派生類中實(shí)現(xiàn)一個(gè)與基類方法同名而算法不同的方法;當(dāng)需要增加新的功能時(shí),可以在派生類中實(shí)現(xiàn)一個(gè)新的方法站在巨人的肩頭上”用戶在開發(fā)新系統(tǒng)時(shí)不必從零開始,可以繼承原有相似功能或者從類庫中選取需要的類,再派生新類8 多態(tài)性,,多態(tài)性是指,子類對(duì)象可以像父類對(duì)象,那樣使用,同樣的消息既可以發(fā)送給父類對(duì)象也可以發(fā)送給子類對(duì)象,在,C++,語言中,多態(tài)性是通過虛函數(shù)來實(shí)現(xiàn)的虛函數(shù)機(jī)制使得程序員能在一個(gè)類等級(jí)中使用相同函數(shù)的 多個(gè)不同版本,稱為,動(dòng)態(tài)聯(lián)遍,,也叫滯后聯(lián)編多態(tài)性機(jī)制不僅增加了面向?qū)ο筌浖撵`活性,進(jìn)一 步減少了信息冗余,而且顯著提高了軟件可重用性和 可擴(kuò)充性9 重載,,函數(shù)重載是指在同一作用域內(nèi)的若干個(gè)參數(shù)特征不同 的函數(shù)可以使用相同的函數(shù)名字,,運(yùn)算符重載是指同一個(gè)運(yùn)算符可以施加與不同類型的 操作數(shù)上面,當(dāng)參數(shù)類型不同或被操作數(shù)的類型不同 時(shí),實(shí)現(xiàn)函數(shù)的算法或運(yùn)算符的語義是不相同的,,在,C++,語言中函數(shù)重載是通過靜態(tài)聯(lián)編(也叫先前聯(lián)編)實(shí)現(xiàn)的,也就是在編譯時(shí)根據(jù)函數(shù)變?cè)膫€(gè)數(shù)和 類型,決定到底使用函數(shù)的哪個(gè)實(shí)現(xiàn)代碼;對(duì)于重載 的運(yùn)算符,同樣是在編譯時(shí)根據(jù)被操作數(shù)的類型,決 定使用該運(yùn)算符的哪種語義,,,,,,,,9.3,面向?qū)ο蠼?為了更好地理解問題,采用建立模型的方法,,模型是為了理解事物而對(duì)事物作的一種抽象,是對(duì)事物的一種無歧義的書面描述。
模型是一種,把知識(shí)規(guī)范地表示出來的,工具,,,,用面向?qū)ο蟮姆椒ń⒛P?,9.3,面向?qū)ο蠼?用面向?qū)ο蠓椒ㄩ_發(fā)軟件,通常要建立,3,種形式的模型:,,描述系統(tǒng),數(shù)據(jù),結(jié)構(gòu)的,對(duì)象模型,,描述系統(tǒng),控制,結(jié)構(gòu)的,動(dòng)態(tài)模型,,描述系統(tǒng),功能,的,功能模型,,一個(gè)典型的軟件系統(tǒng)使用,數(shù)據(jù)結(jié)構(gòu),(對(duì)象模型),,執(zhí)行操作,(動(dòng)態(tài)模型),并完成數(shù)據(jù)值的,變化,(功能模型),,,,9.4,對(duì)象模型,關(guān)于建模語言,,模型通常由一組,圖示符號(hào),和組成這些符號(hào)的,規(guī)則,組成, 定義和描述問題域的術(shù)語和概念,,為建立模型,需要用適當(dāng)?shù)?語言,來表達(dá)模型,,建模語言由,記號(hào),(即模型中使用的符號(hào))和使用這些記號(hào)的,規(guī)則,(語法、語義)組成,,,,,,,,,,9.4.1,類圖的基本符號(hào),類圖描述類、類與類之間的,靜態(tài)關(guān)系,,是一種靜態(tài)模型,是創(chuàng)建其他,UML,圖的基礎(chǔ),,? 一個(gè)系統(tǒng)由多張類圖來描述,一個(gè)類也可以出現(xiàn)在幾張類圖中,,,,,,,,1,定義類,UML,中類的圖形符號(hào)為長方形,用兩條橫線把長方形分成上、中、下,3,個(gè)區(qū)域(下面兩個(gè)區(qū)域可以省略),,為類命名時(shí)應(yīng)該遵守以下幾條,準(zhǔn)則,:,,(1),使用標(biāo)準(zhǔn)術(shù)語,,(2),使用具有確切含義的名詞,,(3),必要時(shí)用名詞短語作為名字,,,,,,,,2,定義屬性,UML,描述屬性的語法如下:,,可見性 屬性名:類型名,=,初值,{,性質(zhì)串,},,屬性的可見性(即可訪問性)通常有下述,3,種:,,–,公有的(,public,) (,+,),,–,私有的(,private,) (,-,),,–,保護(hù)的(,protected,)(,#,),,類型名表示該屬性的數(shù)據(jù)類型,它可以是基本數(shù)據(jù)類型,也可以是用戶自定義的類型,,用花括號(hào)括起來的性質(zhì)串明列出該屬性所有可能的取值,,例:,-,管理員:,String,=,“,未定”,,3,定義服務(wù),UML,描述操作的語法格式如下:,,可見性 操作名,(,參數(shù)表,),:返回值類型,{,性質(zhì)串,},,操作可見性的定義方法與屬性相同。
參數(shù)表是用逗號(hào)分隔的形式參數(shù)的序列描述一個(gè)參數(shù)的語法如下:,,參數(shù)名:類型名=默認(rèn)值,,當(dāng)操作的調(diào)用者未提供實(shí)在參數(shù)時(shí),該參數(shù)就使用默認(rèn)值9.4.2,表示關(guān)系的符號(hào),類與類之間通常有,關(guān)聯(lián)、泛化(繼承)、依賴,和,細(xì)化,等,4,種關(guān)系,,1,關(guān)聯(lián),,關(guān)聯(lián)表示兩個(gè)類的對(duì)象之間存在某種語義上的聯(lián)系,,,,,,9.4.2,表示關(guān)系的符號(hào),普通關(guān)聯(lián):,,最常見的關(guān)聯(lián)關(guān)系,只要在類與類之間存在連接關(guān)系就可以用普通關(guān)聯(lián)表示例如,作家使用計(jì)算機(jī),我們就認(rèn)為在作家和計(jì)算機(jī)之間存在某種語義連接,因此在類圖中應(yīng)該在作家類和計(jì)算機(jī)類之間建立關(guān) 聯(lián)關(guān)系,,,,,,,,,黑三角表示關(guān)聯(lián)方向,,,(2),關(guān)聯(lián)的角色,在任何關(guān)聯(lián)中都會(huì)涉及到參與此關(guān)聯(lián)的對(duì)象所扮演的角色, 在某些情況下,顯式標(biāo)明角色,名有助于別人理解類圖,,例:一個(gè)人與另一個(gè)人結(jié)婚,必然一個(gè)人扮演丈夫的角色, 另一個(gè)人扮演妻子的角色如果沒有顯式標(biāo)出角色名,則意 味著用類名作為角色名。
