構(gòu)件 - 學術(shù)名詞
構(gòu)件是系統(tǒng)中實際存在的可更換部分,它實現(xiàn)特定的功能,符合一套接口標準并實現(xiàn)一組接口。構(gòu)件代表系統(tǒng)中的一部分物理實施,包括軟件代碼(源代碼、二進制代碼或可執(zhí)行代碼)或其等價物(如腳本或命令文件)。在圖中,構(gòu)件表示為一個帶有標簽的矩形。在工程實際中,各種機械與結(jié)構(gòu)得到廣泛應用。組成機械與結(jié)構(gòu)的零、構(gòu)件,在工程力學中統(tǒng)稱為構(gòu)件。
解釋
(1)組成機構(gòu)的單元,可以是一個零件,也可以是由許多零件構(gòu)成的剛體。(2)組成建筑物某一結(jié)構(gòu)的單元,如梁、柱。
機械領(lǐng)域
機器中每一個獨立的運動單元體稱為一個構(gòu)件。[structuralmember]∶機構(gòu)的組成單個元,它是一個和某相鄰構(gòu)件有相對運動的剛體。橋梁構(gòu)架;抗壓構(gòu)件的設(shè)計。[componentpart]∶組成部 - 分。電動機的各種構(gòu)件人財產(chǎn)。在機構(gòu)學中組成機構(gòu)的﹑彼此間具有確定的相對運動關(guān)系的基本單元﹐如曲柄滑塊機構(gòu)中的曲柄﹑連桿﹑滑塊和機架﹐凸輪機構(gòu)中的凸輪﹑從動桿和機架。在結(jié)構(gòu)學中則指結(jié)構(gòu)物中的計算或制造單元﹐它們是固定在一起的﹐彼此間除由于應變有微量位移外﹐沒有相對運動﹐如梁﹑柱﹑拉桿等。
軟件工程中的構(gòu)件
構(gòu)件是面向軟件體系架構(gòu)的可復用軟件模塊。構(gòu)件(component)是可復用的軟件組成成份,可被用來構(gòu)造其他軟件。它可以是被封裝的對象類、類樹、一些功能模塊、軟件框架(framework)、軟件構(gòu)架(或體系結(jié)構(gòu)Architectural)、文檔、分析件、設(shè)計模式(Pattern)等。1995年,Ian.oraham給出的構(gòu)件定義如下:構(gòu)件(Component)是指一個對象(接口規(guī)范、或二進制代碼),它被用于復用,接口被明確定義。構(gòu)件是作為一個邏輯緊密的程序代碼包的形式出現(xiàn)的,有著良好的接口。像Ada的Package、Smalltalk-80和C++的class和數(shù)據(jù)類型都可屬于構(gòu)件范疇。但是,操作集合、過程、函數(shù)即使可以復用也不能成為一個構(gòu)件。開發(fā)者可以通過組裝已有的構(gòu)件來開發(fā)新的應用系統(tǒng),從而達到軟件復用的目的。軟件構(gòu)件技術(shù)是軟件復用的關(guān)鍵因素,也是軟件復用技術(shù)研究的重點。
軟件構(gòu)件應具備以下屬性
(1)有用性(Usefulness):構(gòu)件必須提供有用的功能;
(2)可用性(Usability):構(gòu)件必須易于理解和使用;
(3)質(zhì)量(Quality):構(gòu)件及其變形必須能正確工作;
(4)適應性(Adaptability):構(gòu)件應該易于通過參數(shù)化等方式在不同語境中進行配置;
(5)可移植性(Portability):構(gòu)件應能在不同的硬件運行平臺和軟件環(huán)境中工作。
日歷、工作流構(gòu)件、訂單構(gòu)件、用戶界面控制等等都可以是構(gòu)件。
構(gòu)件具有以下幾個特點
(1)自描述:構(gòu)件必須能夠識別其屬性、存取方法和事件,這些信息可以使開發(fā)環(huán)境將第三方軟件構(gòu)件無縫地結(jié)合起來;
(2)可定制:允許提供一個典型的圖形方式環(huán)境,軟件構(gòu)件的屬性只能通過控制面板來設(shè)置;
(3)可集成:構(gòu)件必須可以被編程語言直接控制。構(gòu)件也可以和腳本語言或者與從代碼級訪問構(gòu)件的環(huán)境連接,這個特點使得軟件構(gòu)件可以在非可視化開發(fā)項目中使用;
(4)連接機制:構(gòu)件必須能產(chǎn)生事件或者具有讓程序員從語義上實現(xiàn)相互連接的其他機制。
采用構(gòu)件軟件不需要重新編譯,也不需要源代碼并且不局限于某一種編程語言。該過程叫做二進制復用(BinaryReuse),因為它是建立在接口而不是源代碼級別的復用之上的。雖然軟件構(gòu)件必須遵守一致的接口,但是它們的內(nèi)部實現(xiàn)是完全自動的。因此,可以用過程語言和面向?qū)ο笳Z言創(chuàng)建構(gòu)件。
由于構(gòu)件技術(shù)是由基于面向?qū)ο蠹夹g(shù)而發(fā)展起來的,與面向?qū)ο蟮脑O(shè)計中的對象相類似,它們都是針對軟件復用,都是被封裝的代碼,但它們之間仍存在很大差異。
差別
(1)在純面向?qū)ο蟮脑O(shè)計中,對象(類)、封裝和繼承三者缺一不可,但對構(gòu)件可以沒有繼承性,只要實現(xiàn)封裝即可;
(2)從構(gòu)件和對象的生成方式上,對象生成屬于實例化的過程,比較單一,而生成構(gòu)件的方式較多;
(3)構(gòu)件是設(shè)計的概念,與具體編程語言無關(guān),不像對象屬于編程中的概念,要依賴于具體的編程語言;
(4)在對構(gòu)件操作時不允許直接操作構(gòu)件中的數(shù)據(jù),數(shù)據(jù)真正被封裝了。而對象的操作通過公共接口部分,這樣數(shù)據(jù)是可能被訪問操作的;
(5)對象對軟件復用是通過繼承實現(xiàn)的,構(gòu)件對軟件復用不僅可以通過繼承還可以通過組裝時的引用來實現(xiàn)。
因此,構(gòu)件不是對象,只是與對象類似。
從力學角度來說,結(jié)構(gòu)是指可以承受一定力的結(jié)構(gòu)形態(tài),它可以抵抗能引起形狀和大小改變的力。每種事物都有它的架構(gòu)形態(tài),這種架構(gòu)形態(tài)體現(xiàn)著它的結(jié)構(gòu)。一個較復雜的結(jié)構(gòu)由許多不同的部分組成,這些組成部分通常成為構(gòu)件。
計算機領(lǐng)域
概述
構(gòu)件是系統(tǒng)中實際存在的可更換部分,它實現(xiàn)特定的功能,符合一套接口標準并實現(xiàn)一組接口。構(gòu)件代表系統(tǒng)中的一部分物理實施,包括軟件代碼(源代碼、二進制代碼或可執(zhí)行代碼)或其等價物(如腳本或命令文件)。
使用
設(shè)計中的類和對象被作為部署構(gòu)件進行實施。您需要確定如何將設(shè)計類映射為代碼;這應該在項目專用的設(shè)計指南中有所說明。
有關(guān)如何將設(shè)計類映射為代碼的詳細信息,請參見活動:實施構(gòu)件。另請參見指南:類。
實施構(gòu)件與修改構(gòu)件在項目的配置管理環(huán)境中進行。實施員在為他們提供的專用開發(fā)工作區(qū)(請參見活動:創(chuàng)建開發(fā)工作區(qū))中,按照工件:工作單所指定的內(nèi)容開展工作。在該工作區(qū)中,創(chuàng)建源元素并將其置于配置管理之下,或者在通常的檢出、編輯、構(gòu)建、單元測試、檢入周期中進行修改(請參見活動:進行變更)。完成某個構(gòu)件集(根據(jù)一個或多個工作單的定義以及即將生成的工作版本要求)后,實施員將把有關(guān)新的和修改過的構(gòu)件交付(請參見活動:交付變更內(nèi)容)到子系統(tǒng)集成工作區(qū),以便與其他實施員的工作進行集成。最后,實施員可以在方便的時候?qū)S瞄_發(fā)工作區(qū)進行更新(或者重新調(diào)整基線),使該工作區(qū)與子系統(tǒng)集成工作區(qū)保持一致(請參見活動:更新工作區(qū))。
當實施類時,應遵循編程指南。
實施的主要基礎(chǔ)是具有公有操作、屬性與關(guān)聯(lián)關(guān)系的類。務必要注意,并不是所有公有操作、屬性與關(guān)聯(lián)關(guān)系都在設(shè)計過程中定義。
實施的輔助基礎(chǔ)是用例實現(xiàn),用例實現(xiàn)顯示了類和對象如何通過交互來執(zhí)行用例。
最好以遞增的方式實施類;編譯、鏈接和運行一些回歸測試,每天進行三兩次。
在從零開始實施一個類之前,可考慮修改現(xiàn)有的實施類(一般可通過建立子類或進行實例化來修改)。
實施操作
要實施操作,請執(zhí)行以下步驟:
選擇算法
選擇適合算法的數(shù)據(jù)結(jié)構(gòu)
根據(jù)需要定義新的類和操作
編寫操作代碼
選擇算法
許多操作都十分簡單,可以從該操作及其規(guī)約中立即實施。
之所以需要特殊算法,主要是為了實施定義了規(guī)約的復雜操作,并優(yōu)化那些以簡單但卻低效的算法為定義的操作。
選擇適合算法的數(shù)據(jù)結(jié)構(gòu)
選擇算法包括選擇算法所基于的數(shù)據(jù)結(jié)構(gòu)。許多實施數(shù)據(jù)結(jié)構(gòu)是容器類,例如數(shù)組、列表、隊列、棧、集合、無序單位組,以及這些類的各種不同形式。許多面向?qū)ο蟮恼Z言和編程環(huán)境都提供了具有這些可復用構(gòu)件的類庫。
根據(jù)需要定義新的類和操作
比如,可以使用新類來保存中間結(jié)果,也可對類添加新的低級操作來分解復雜操作。通常,這些操作是類的私有操作,所以在類之外看不見這些操作。
編寫操作代碼
要編寫操作的代碼,可從接口語句開始,例如 C++ 中的成員函數(shù)聲明、Ada 中的子程序規(guī)約或 Visual Basic 中的方法。請遵循編程指南。
實施狀態(tài)
對象的狀態(tài)可通過引用其屬性值來實施,而不必作特殊說明。這種對象的狀態(tài)轉(zhuǎn)移將隱含于變化的屬性值中,而變化的行為通過條件語句來編程。但對于復雜行為,該方法不能令人滿意,因為它往往會導致復雜的結(jié)構(gòu);而當添加更多狀態(tài)或當行為發(fā)生變化時,將很難更改這些結(jié)構(gòu)。
如果構(gòu)件(或其組成部分)的行為隨狀態(tài)而定,則通常會有一個或多個狀態(tài)圖來說明組成該構(gòu)件的模型元素的行為。這些狀態(tài)圖可用作實施過程中的重要輸入。有關(guān)詳細信息,請參見指南:狀態(tài)圖。
狀態(tài)圖中所示的狀態(tài)機將表現(xiàn)對象的狀態(tài),并詳盡說明狀態(tài)轉(zhuǎn)移及所需的行為??梢酝ㄟ^以下幾種方法來實施狀態(tài)機:
對于簡單的狀態(tài)機,定義一項列舉可能狀態(tài)的屬性,然后使用該屬性在 Java 或 C++ 中的 switch語句中選擇進入消息的行為。但這種方法不太適用于復雜的狀態(tài)機,它可能會導致運行時性能降低。如需此方法的示例,請參見[DOUG98],第 4 章 4.4.3
對于較復雜的狀態(tài)機,可使用狀態(tài)模式。有關(guān)狀態(tài)模式的說明,請參見[GAM94]。[DOUG98],第 6 章 6.2.3 狀態(tài)模式也說明了這種方法
表驅(qū)動法對于極復雜的狀態(tài)機十分有效,其特點是易于變更。當使用這種方法時,各個狀態(tài)在表中都有相應的條目,這些條目將輸入映射到后繼狀態(tài)和相關(guān)的轉(zhuǎn)移動作。如需此方法的示例,請參見[DOUG98],第 6 章 6.2.3 狀態(tài)表模式。
要實施具有并行子狀態(tài)的狀態(tài)機,可以將狀態(tài)管理委派給主動對象(每個對象都被委派一個并行子狀態(tài)),因為并行子狀態(tài)代表了獨立的計算(但仍可能進行交互)。每個子狀態(tài)均可通過上述方法之一來進行管理。
通過委托關(guān)系復用實施
如果一個類或一個類的某些部分可通過復用現(xiàn)有類來實施,則應通過委托關(guān)系(而不要繼承)來實現(xiàn)。
委托表示一個類借助于其他類來得以實施。該類通過使用變量來引用其他類的對象。當調(diào)用某操作時,該操作將調(diào)用被引用對象(屬于被復用的類)中的操作,以實際執(zhí)行該操作。這樣,它就將職責委派給了其他類。
實施關(guān)聯(lián)關(guān)系
單向關(guān)聯(lián)關(guān)系將作為指針(包含對象引用的屬性)來進行實施。如果多重性為一,則將單向關(guān)聯(lián)關(guān)系當作簡單指針來實施。如果多重性為多個,則將其當作指針集來實施。但如果“多”端是有序排列的,則可以使用列表,而不使用集合。
雙向關(guān)聯(lián)關(guān)系將作為屬性,使用單向關(guān)聯(lián)關(guān)系的技術(shù)在兩個方向上實施。
限定關(guān)聯(lián)關(guān)系將作為限定對象中的查詢表(如一個 Smalltalk Dictionary 類)來實施。查詢表中的選擇器值是限定詞,而目標值是另一個類的對象。
如果必須按順序訪問限定詞的值,就應將限定詞組織成經(jīng)過排序的數(shù)組或樹。在這種情況下,訪問時間將與 log N 成比例,其中 N為限定詞值的數(shù)目。
如果限定詞取自于一個緊湊的有限集,就可以將限定詞的值映射到一個整數(shù)范圍,并將關(guān)聯(lián)關(guān)系當作數(shù)組來有效地進行實施。如果關(guān)聯(lián)關(guān)系已基本上填滿(而不是稀疏填充),此方法會更加有效;而對于完全填滿的有限集,它可以算是理想的方法。
許多面向?qū)ο蟮恼Z言和編程環(huán)境都提供了具有可復用構(gòu)件的類庫,可用于實施不同種類的關(guān)聯(lián)關(guān)系。
實施屬性
可以作為內(nèi)置基本變量、可復用的構(gòu)件類或定義一個新類來實現(xiàn)屬性。定義新類通常是較為靈活的方法,但它卻會帶來不必要的間接性。例如,實施雇員的社會保障號時,既可將它作為類型“字符串”的屬性,也可將它作為一個新類。另一種可能的情況是:屬性組組成了新類。
向設(shè)計提供反饋
在以上任何步驟中,如果發(fā)現(xiàn)了設(shè)計錯誤,都必須向設(shè)計提供返工反饋。如果所需的變更較小,就可以由同一個人來設(shè)計并實施類,而無需提出正式的變更請求。他可在設(shè)計中進行變更。
如果所需的變更影響到幾個類(例如在公有操作中的變更),則應向 CCB(變更控制委員會)提交正式的變更請求。請參見活動:修復缺陷。
評估代碼
在開始單元測試之前,可以先作一些檢查。測試是一項花費較多的工作,因此最好先執(zhí)行以下幾項檢查:
始終對代碼進行編譯。將編譯器的警告等級設(shè)置到最詳細的程度。
通過想像對操作進行檢查。通讀代碼,盡可能考慮到所有情況,發(fā)現(xiàn)各種異常情況。一旦進行了新的實施活動,就需進行此項工作。
使用工具檢查代碼中是否存在錯誤。例如,使用靜態(tài)代碼規(guī)則檢查程序。
構(gòu)件是系統(tǒng)中實際存在的可更換部分,它實現(xiàn)特定的功能,符合一套接口標準并實現(xiàn)一組接口。構(gòu)件代表系統(tǒng)中的一部分物理實施,包括軟件代碼(源代碼、二進制代碼或可執(zhí)行代碼)或其等價物(如腳本或命令文件)。在圖中,構(gòu)件表示為一個帶有標簽的矩形。
可執(zhí)行文件例如 .exe 文件
鏈接庫例如 .dll 文件
Applet 例如 Java 中的 .class 文件
Web 頁面例如 .htm 和 .html 文件
數(shù)據(jù)庫表
工作產(chǎn)品構(gòu)件的示例
源代碼文件例如 C++ 和 CORBA IDL 中的 .h、.cpp 和 .hpp 文件,或 Java 中的 .java 文件二進制文件例如鏈接到可執(zhí)行文件的 .o 文件和 .a 文件。SOM 文件IDL 和一些綁定編譯文件例如 UNIX 中的 makefile
使用
設(shè)計中的類和對象被作為部署構(gòu)件進行實施。您需要確定如何將設(shè)計類映射為代碼;這應該在項目專用的設(shè)計指南中有所說明。
有關(guān)如何將設(shè)計類映射為代碼的詳細信息,請參見活動:實施構(gòu)件。另請參見指南:類。
實施構(gòu)件與修改構(gòu)件在項目的配置管理環(huán)境中進行。實施員在為他們提供的專用開發(fā)工作區(qū)(請參見活動:創(chuàng)建開發(fā)工作區(qū))中,按照工件:工作單所指定的內(nèi)容開展工作。在該工作區(qū)中,創(chuàng)建源元素并將其置于配置管理之下,或者在通常的檢%8D%95%E5%85%83%E6%B5%8B%E8%AF%95" target="_new" class=innerlink>單元測試、檢入周期中進行修改(請參見活動:進行變更)。完成某個構(gòu)件集(根據(jù)一個或多個工作單的定義以及即將生成的工作版本要求)后,實施員將把有關(guān)新的和修改過的構(gòu)件交付(請參見活動:交付變更內(nèi)容)到子系統(tǒng)集成工作區(qū),以便與其他實施員的工作進行集成。最后,實施員可以在方便的時候?qū)S瞄_發(fā)工作區(qū)進行更新(或者重新調(diào)整基線),使該工作區(qū)與子系統(tǒng)集成工作區(qū)保持一致(請參見活動:更新工作區(qū))。
當實施類時,應遵循編程指南。
實施的主要基礎(chǔ)是具有公有操作、屬性與關(guān)聯(lián)關(guān)系的類。務必要注意,并不是所有公有操作、屬性與關(guān)聯(lián)關(guān)系都在設(shè)計過程中定義。
實施的輔助基礎(chǔ)是用例實現(xiàn),用例實現(xiàn)顯示了類和對象如何通過交互來執(zhí)行用例。
最好以遞增的方式實施類;編譯、鏈接和運行一些回歸測試,每天進行三兩次。
在從零開始實施一個類之前,可考慮修改現(xiàn)有的實施類(一般可通過建立子類或進行實例化來修改)。
實施操作
要實施操作,請執(zhí)行以下步驟:
選擇算法選擇適合算法的數(shù)據(jù)結(jié)構(gòu)根據(jù)需要定義新的類和操作編寫操作代碼選擇算法許多操作都十分簡單,可以從該操作及其規(guī)約中立即實施。
之所以需要特殊算法,主要是為了實施定義了規(guī)約的復雜操作,并優(yōu)化那些以簡單但卻低效的算法為定義的操作。
選擇適合算法的數(shù)據(jù)結(jié)構(gòu)選擇算法包括選擇算法所基于的數(shù)據(jù)結(jié)構(gòu)。許多實施數(shù)據(jù)結(jié)構(gòu)是容器類,例如數(shù)組、列表、隊列、棧、集合、無序單位組,以及這些類的各種不同形式。許多面向?qū)ο蟮恼Z言和編程環(huán)境都提供了具有這些可復用構(gòu)件的類庫。
根據(jù)需要定義新的類和操作比如,可以使用新類來保存中間結(jié)果,也可對類添加新的低級操作來分解復雜操作。通常,這些操作是類的私有操作,所以在類之外看不見這些操作。
編寫操作代碼要編寫操作的代碼,可從接口語句開始,例如 C++ 中的成員函數(shù)聲明、Ada中的子程序規(guī)約或 Visual Basic 中的方法。請遵循編程指南。
實施構(gòu)件工作流程明細
實施狀態(tài)
對象的狀態(tài)可通過引用其屬性值來實施,而不必作特殊說明。這種對象的狀態(tài)轉(zhuǎn)移將隱含于變化的屬性值中,而變化的行為通過條件語句來編程。但對于復雜行為,該方法不能令人滿意,因為它往往會導致復雜的結(jié)構(gòu);而當添加更多狀態(tài)或當行為發(fā)生變化時,將很難更改這些結(jié)構(gòu)。
如果構(gòu)件(或其組成部分)的行為隨狀態(tài)而定,則通常會有一個或多個狀態(tài)圖來說明組成該構(gòu)件的模型元素的行為。這些狀態(tài)圖可用作實施過程中的重要輸入。有關(guān)詳細信息,請參見指南:狀態(tài)圖。
狀態(tài)圖中所示的狀態(tài)機將表現(xiàn)對象的狀態(tài),并詳盡說明狀態(tài)轉(zhuǎn)移及所需的行為。可以通過以下幾種方法來實施狀態(tài)機:
對于簡單的狀態(tài)機,定義一項列舉可能狀態(tài)的屬性,然后使用該屬性在 Java 或 C++ 中的 switch 語句中選擇進入消息的行為。但這種方法不太適用于復雜的狀態(tài)機,它可能會導致運行時性能降低。如需此方法的示例,請參見【DOUG98】,第 4 章 4.4.3 對于較復雜的狀態(tài)機,可使用狀態(tài)模式。有關(guān)狀態(tài)模式的說明,請參見【GAM94】?!綝OUG98】,第 6 章 6.2.3 狀態(tài)模式也說明了這種方法 表驅(qū)動法對于極復雜的狀態(tài)機十分有效,其特點是易于變更。當使用這種方法時,各個狀態(tài)在表中都有相應的條目,這些條目將輸入映射到后繼狀態(tài)和相關(guān)的轉(zhuǎn)移動作。如需此方法的示例,請參見【DOUG98】,第 6 章 6.2.3 狀態(tài)表模式。要實施具有并行子狀態(tài)的狀態(tài)機,可以將狀態(tài)管理委派給主動對象(每個對象都被委派一個并行子狀態(tài)),因為并行子狀態(tài)代表了獨立的計算(但仍可能進行交互)。每個子狀態(tài)均可通過上述方法之一來進行管理。
通過委托關(guān)系復用實施
如果一個類或一個類的某些部分可通過復用現(xiàn)有類來實施,則應通過委托關(guān)系(而不要繼承)來實現(xiàn)。
委托表示一個類借助于其他類來得以實施。該類通過使用變量來引用其他類的對象。當調(diào)用某操作時,該操作將調(diào)用被引用對象(屬于被復用的類)中的操作,以實際執(zhí)行該操作。這樣,它就將職責委派給了其他類。
實施關(guān)聯(lián)關(guān)系
單向關(guān)聯(lián)關(guān)系將作為指針(包含對象引用的屬性)來進行實施。如果多重性為一,則將單向關(guān)聯(lián)關(guān)系當作簡單指針來實施。如果多重性為多個,則將其當作指針集來實施。但如果“多”端是有序排列的,則可以使用列表,而不使用集合。
雙向關(guān)聯(lián)關(guān)系將作為屬性,使用單向關(guān)聯(lián)關(guān)系的技術(shù)在兩個方向上實施。
限定關(guān)聯(lián)關(guān)系將作為限定對象中的查詢表(如一個 Smalltalk Dictionary 類)來實施。查詢表中的選擇器值是限定詞,而目標值是另一個類的對象。
如果必須按順序訪問限定詞的值,就應將限定詞組織成經(jīng)過排序的數(shù)組或樹。在這種情況下,訪問時間將與 log N 成比例,其中N 為限定詞值的數(shù)目。
如果限定詞取自于一個緊湊的有限集,就可以將限定詞的值映射到一個整數(shù)范圍,并將關(guān)聯(lián)關(guān)系當作數(shù)組來有效地進行實施。如果關(guān)聯(lián)關(guān)系已基本上填滿(而不是稀疏填充),此方法會更加有效;而對于完全填滿的有限集,它可以算是理想的方法。
許多面向?qū)ο蟮恼Z言和編程環(huán)境都提供了具有可復用構(gòu)件的類庫,可用于實施不同種類的關(guān)聯(lián)關(guān)系。
實施屬性
可以作為內(nèi)置基本變量、可復用的構(gòu)件類或定義一個新類來實現(xiàn)屬性。定義新類通常是較為靈活的方法,但它卻會帶來不必要的間接性。例如,實施雇員的社會保障號時,既可將它作為類型“字符串”的屬性,也可將它作為一個新類。
屬性的備選實施。
另一種可能的情況是:屬性組組成了新類,如下例所示。這兩種實施都是正確的。
將 Line 中的屬性當作 Point 類的關(guān)聯(lián)關(guān)系來實施。
向設(shè)計提供反饋
在以上任何步驟中,如果發(fā)現(xiàn)了設(shè)計錯誤,都必須向設(shè)計提供返工反饋。如果所需的變更較小,就可以由同一個人來設(shè)計并實施類,而無需提出正式的變更請求。他可在設(shè)計中進行變更。
如果所需的變更影響到幾個類(例如在公有操作中的變更),則應向 CCB(變更控制委員會)提交正式的變更請求。請參見活動:修復缺陷。
評估代碼
在開始單元測試之前,可以先作一些檢查。測試是一項花費較多的工作,因此最好先執(zhí)行以下幾項檢查:
始終對代碼進行編譯。將編譯器的警告等級設(shè)置到最詳細的程度。通過想像對操作進行檢查。通讀代碼,盡可能考慮到所有情況,發(fā)現(xiàn)各種異常情況。一旦進行了新的實施活動,就需進行此項工作。使用工具檢查代碼中是否存在錯誤。例如,使用靜態(tài)代碼規(guī)則檢查程序。
其他定義
一個理解術(shù)語直觀含義的方法就是列舉它的所有特性。具體的做法是這樣的:如果一樣東西具有屬性a1、a2和a3,它就是A。例如,在著名的Wegner定義(1987)里,如果一種語言支持對象、類和繼承,那么它就可以被認為是面向?qū)ο蟮摹?/p>
構(gòu)件的特性是:
# 獨立部署單元;
# 作為第三方的組裝單元;
# 沒有(外部的)可見狀態(tài)。
這些特性有幾種含義。一個構(gòu)件是獨立可部署的,意味著它必須能跟它所在的環(huán)境及其他構(gòu)件相分離。因此,構(gòu)件必須封裝自己全部內(nèi)部特性。并且,構(gòu)件作為可部署單元,具有原子性,是不可拆分的。
在這樣的約束下,如果第三方廠商能將一個構(gòu)件和其他構(gòu)件組裝在一起,那么這個構(gòu)件必須具備良好的內(nèi)聚性,還必須將自己的依賴條件和所提供的服務說明清楚。換句話說,構(gòu)件必須封裝它的實現(xiàn),并且只通過良好定義的接口和外部環(huán)境進行交互。
最后,一個構(gòu)件不能有任何(外部的)可見狀態(tài)——這要求構(gòu)件不能與自己的拷貝有所區(qū)別。但對于不影響構(gòu)件功能的某些屬性則沒有這種限制。
