必威电竞|足球世界杯竞猜平台

構件
來源:互聯(lián)網(wǎng)

構件是系統(tǒng)中實際存在的可更換部分。它實現(xiàn)特定的功能,符合一套接口標準并能實現(xiàn)一組接口。

在工程實際操縱中,各種機械與結構得到廣泛應用。組成機械與結構的零、構件,在工程力學中統(tǒng)稱為構件。

機械領域

機器中每一個獨立的運動單元體稱為構件。在英文中,構件通常表述為“component”,其復數(shù)形式為“components”,一般指機器或設備的組成部件,例如機器或設備的部件需定期維護。

[structural member]∶機構的組成單個元,它是一個和某相鄰構件有相對運動的剛體

橋梁構架;抗壓構件的設計。

[component part]∶組成部(分)。

電動機的各種構件人財產。

在機構學中組成機構的﹑彼此間具有確定的相對運動關系的基本單元﹐如曲柄滑塊機構中的曲柄﹑連桿﹑滑塊和機架﹐凸輪機構中的凸輪﹑從動桿和機架。在結構學中則指結構物中的計算或制造單元﹐它們是固定在一起的﹐彼此間除由于應變有微量位移外﹐沒有相對運動﹐如梁﹑柱﹑拉桿等。

軟件工程

構件是面向軟件體系架構的可復用軟件模塊。構件(component)是可復用的軟件組成成份,可被用來構造其他軟件。它可以是被封裝的對象類、類樹、一些功能 模塊、軟件框架(framework)、軟件構架(或體系結構Architectural)、文檔、分析件、設計模式(Pattern)等。1995年,Ian Graham給出的構件定義如下:構件(Component)是指一個對象(接口規(guī)范、或二進制代碼),它被用于復用,接口被明確定義。構件是作為一個邏輯緊密的程序代碼包的形式出現(xiàn)的,有著良好的接口。像Ada的Package、smalltalk80和C++的class和數(shù)據(jù)類型都可屬于構件范疇。但是,操作集合、過程、函數(shù)即使可以復用也不能成為一個構件。開發(fā)者可以通過組裝已有的構件來開發(fā)新的應用系統(tǒng),從而達到軟件復用的目的。軟件構件技術是軟件復用的關鍵因素,也是軟件復用技術研究的重點。

軟件構件應具備以下屬性

(1)有用性(Usefulness):構件必須提供有用的功能;

(2)可用性(Usability):構件必須易于理解和使用;

(3)質量(Quality):構件及其變形必須能正確工作;

(4)適應性(Adaptability):構件應該易于通過參數(shù)化等方式在不同語境中進行配置;

(5)可移植性(Portability):構件應能在不同的硬件運行平臺和軟件環(huán)境中工作。

日歷、工作流構件、訂單構件、用戶界面控制等等都可以是構件。

2.1.3 構件的特點

構件具有以下幾個特點:

(1)自描述:構件必須能夠識別其屬性、存取方法和事件,這些信息可以使集成開發(fā)環(huán)境將第三方軟件構件無縫地結合起來;

(2)可定制:允許提供一個典型的圖形方式環(huán)境,軟件構件的屬性只能通過控制面板來設置;

(3)可集成:構件必須可以被編程語言直接控制。構件也可以和腳本語言或者與從代碼級訪問構件的環(huán)境連接,這個特點使得軟件構件可以在非可視化開發(fā)項目中使用;

(4)連接機制:構件必須能產生事件或者具有讓程序員從語義上實現(xiàn)相互連接的其他機制。

采用構件軟件不需要重新編譯,也不需要源代碼并且不局限于某一種編程語言。該過程叫做二進制復用(Binary Reuse),因為它是建立在接口而不是源代碼級別的復用之上的。雖然軟件構件必須遵守一致的接口,但是它們的內部實現(xiàn)是完全自動的。因此,可以用過程語言和面向對象語言創(chuàng)建構件。

由于構件技術是由基于面向對象技術而發(fā)展起來的,與面向對象的設計中的對象相類似,它們都是針對軟件復用,都是被封裝的代碼,但它們之間仍存在很大差異。

差別

(1)在純面向對象的設計中,對象(類)、封裝和繼承三者缺一不可,但對構件可以沒有繼承性,只要實現(xiàn)封裝即可;

(2)從構件和對象的生成方式上,對象生成屬于實例化的過程,比較單一,而生成構件的方式較多;

(3)構件是設計的概念,與具體編程語言無關,不像對象屬于編程中的概念,要依賴于具體的編程語言;

(4)在對構件操作時不允許直接操作構件中的數(shù)據(jù),數(shù)據(jù)真正被封裝了。而對象的操作通過公共接口部分,這樣數(shù)據(jù)是可能被訪問操作的;

(5)對象對可重用軟件是通過繼承實現(xiàn)的,構件對軟件復用不僅可以通過繼承還可以通過組裝時的引用來實現(xiàn)。

因此,構件不是對象,只是與對象類似。

從力學角度來說,結構是指可以承受一定力的結構形態(tài),它可以抵抗能引起形狀和大小改變的力。每種事物都有它的架構形態(tài),這種架構形態(tài)體現(xiàn)著它的結構。一個較復雜的結構由許多不同的部分組成,這些組成部分通常成為構件。

計算機領域

構件是系統(tǒng)中實際存在的可更換部分,它實現(xiàn)特定的功能,符合一套接口標準并實現(xiàn)一組接口。構件代表系統(tǒng)中的一部分物理實施,包括軟件代碼(源代碼、二進制代碼或可執(zhí)行代碼)或其等價物(如腳本或命令文件)。

使用

設計中的類和對象被作為部署構件進行實施。您需要確定如何將設計類映 射為代碼;這應該在項目專用的設計指南中有所說明。

有關如何將設計類映射為代碼的詳細信息,請參見活動:實施構件。另請參見指南:類。

實施構件與修改構件在項目的配置管理環(huán)境中進行。實施員在為他們提供的專用開發(fā)工作區(qū)(請參見活動:創(chuàng)建開發(fā)工作區(qū))中,按照工件:工作單所指定的內容開展工作。在該工作區(qū)中,創(chuàng)建源元素并將其置于配置管理之下,或者在通常的檢出、編輯、構建、單元測試、檢入周期中進行修改(請參見活動:進行變更)。完成某個構件集(根據(jù)一個或多個工作單的定義以及即將生成的工作版本要求)后,實施員將把有關新的和修改過的構件交付(請參見活動:交付變更內容)到子系統(tǒng)集成工作區(qū),以便與其他實施員的工作進行集成。最后,實施員可以在方便的時候對專用開發(fā)工作區(qū)進行更新(或者重新調整基線),使該工作區(qū)與子系統(tǒng)集成工作區(qū)保持一致(請參見活動:更新工作區(qū))。

當實施類時,應遵循編程指南。

實施的主要基礎是具有公有操作、屬性與關聯(lián)關系的類。務必要注意,并不是所有公有操作、屬性與關聯(lián)關系都在設計過程中定義。

實施的輔助基礎是用例實現(xiàn),用例實現(xiàn)顯示了類和對象如何通過交互來執(zhí)行用例。

最好以遞增的方式實施類;編譯、鏈接和運行一些回歸測試,每天進行三兩次。

在從零開始實施一個類之前,可考慮修改現(xiàn)有的實施類(一般可通過建立子類或進行實例化來修改)。

實施操作

要實施操作,請執(zhí)行以下步驟:

選擇算法

選擇適合算法的數(shù)據(jù)結構

根據(jù)需要定義新的類和操作

編寫操作代碼

選擇算法

許多操作都十分簡單,可以從該操作及其規(guī)約中立即實施。

之所以需要特殊算法,主要是為了實施定義了規(guī)約的復雜操作,并優(yōu)化那些以簡單但卻低效的算法為定義的操作。

選擇適合算法的數(shù)據(jù)結構

選擇算法包括選擇算法所基于的數(shù)據(jù)結構。許多實施數(shù)據(jù)結構是容器類,例如數(shù)組、列表、隊列、棧、集合、無序單位組,以及這些類的各種不同形式。許多面向對象的語言和編程環(huán)境都提供了具有這些可復用構件的類庫。

根據(jù)需要定義新的類和操作

比如,可以使用新類來保存中間結果,也可對類添加新的低級操作來分解復雜操作。通常,這些操作是類的私有操作,所以在類之外看不見這些操作。

編寫操作代碼

要編寫操作的代碼,可從接口語句開始,例如 C++ 中的成員函數(shù)聲明、Ada 中的子程序規(guī)約或 Visual Basic 中的方法。請遵循編程指南。

實施狀態(tài)

對象的狀態(tài)可通過引用其屬性值來實施,而不必作特殊說明。這種對象的狀態(tài)轉移將隱含于變化的屬性值中,而變化的行為通過條件語句來編程。但對于復雜行為,該方法不能令人滿意,因為它往往會導致復雜的結構;而當添加更多狀態(tài)或當行為發(fā)生變化時,將很難更改這些結構。

如果構件(或其組成部分)的行為隨狀態(tài)而定,則通常會有一個或多個狀態(tài)圖來說明組成該構件的模型元素的行為。這些狀態(tài)圖可用作實施過程中的重要輸入。有關詳細信息,請參見指南:狀態(tài)圖。

狀態(tài)圖中所示的狀態(tài)機將表現(xiàn)對象的狀態(tài),并詳盡說明狀態(tài)轉移及所需的行為??梢酝ㄟ^以下幾種方法來實施狀態(tài)機:

對于簡單的狀態(tài)機,定義一項列舉可能狀態(tài)的屬性,然后使用該屬性在 Java 或 C++ 中的 switch 語句中選擇進入消息的行為。但這種方法不太適用于復雜的狀態(tài)機,它可能會導致運行時性能降低。如需此方法的示例,請參見 [DOUG98],第 4 章 4.4.3

對于較復雜的狀態(tài)機,可使用狀態(tài)模式。有關狀態(tài)模式的說明,請參見 [GAM94]。[DOUG98],第 6 章 6.2.3 狀態(tài)模式也說明了這種方法

表驅動法對于極復雜的狀態(tài)機十分有效,其特點是易于變更。當使用這種方法時,各個狀態(tài)在表中都有相應的條目,這些條目將輸入映射到后繼狀態(tài)和相關的轉移動作。如需此方法的示例,請參見 [DOUG98],第 6 章 6.2.3 狀態(tài)表模式。

要實施具有并行子狀態(tài)的狀態(tài)機,可以將狀態(tài)管理委派給主動對象(每個對象都被委派一個并行子狀態(tài)),因為并行子狀態(tài)代表了獨立的計算(但仍可能進行交互)。每個子狀態(tài)均可通過上述方法之一來進行管理。

通過委托關系復用實施

如果一個類或一個類的某些部分可通過復用現(xiàn)有類來實施,則應通過委托關系(而不要繼承)來實現(xiàn)。

委托表示一個類借助于其他類來得以實施。該類通過使用變量來引用其他類的對象。當調用某操作時,該操作將調用被引用對象(屬于被復用的類)中的操作,以實際執(zhí)行該操作。這樣,它就將職責委派給了其他類。

關聯(lián)關系

單向關聯(lián)關系將作為指針(包含對象引用的屬性)來進行實施。如果多重性為一,則將單向關聯(lián)關系當作簡單指針來實施。如果多重性為多個,則將其當作指針集來實施。但如果“多”端是有序排列的,則可以使用列表,而不使用集合。

雙向關聯(lián)關系將作為屬性,使用單向關聯(lián)關系的技術在兩個方向上實施。

限定關聯(lián)關系將作為限定對象中的查詢表(如一個 smalltalk Dictionary 類)來實施。查詢表中的選擇器值是限定詞,而目標值是另一個類的對象。

如果必須按順序訪問限定詞的值,就應將限定詞組織成經過排序的數(shù)組或樹。在這種情況下,訪問時間將與 log N 成比例,其中 N 為限定詞值的數(shù)目。

如果限定詞取自于一個緊湊的有限集,就可以將限定詞的值映射到一個整數(shù)范圍,并將關聯(lián)關系當作數(shù)組來有效地進行實施。如果關聯(lián)關系已基本上填滿(而不是稀疏填充),此方法會更加有效;而對于完全填滿的有限集,它可以算是理想的方法。

許多面向對象的語言和編程環(huán)境都提供了具有可復用構件的類庫,可用于實施不同種類的關聯(lián)關系。

實施屬性

可以作為內置基本變量、可復用的構件類或定義一個新類來實現(xiàn)屬性。定義新類通常是較為靈活的方法,但它卻會帶來不必要的間接性。例如,實施雇員的社會保障號時,既可將它作為類型“字符串”的屬性,也可將它作為一個新類。另一種可能的情況是:屬性組組成了新類。

向設計提供反饋

在以上任何步驟中,如果發(fā)現(xiàn)了設計錯誤,都必須向設計提供返工反饋。如果所需的變更較小,就可以由同一個人來設計并實施類,而無需提出正式的變更請求。他可在設計中進行變更。

如果所需的變更影響到幾個類(例如在公有操作中的變更),則應向 CCB(變更控制委員會)提交正式的變更請求。請參見活動:修復缺陷。

評估代碼

在開始單元測試之前,可以先作一些檢查。測試是一項花費較多的工作,因此最好先執(zhí)行以下幾項檢查:

始終對代碼進行編譯。將編譯器的警告等級設置到最詳細的程度。

通過想像對操作進行檢查。通讀代碼,盡可能考慮到所有情況,發(fā)現(xiàn)各種異常情況。一旦進行了新的實施活動,就需進行此項工作。

使用工具檢查代碼中是否存在錯誤。例如,使用靜態(tài)代碼規(guī)則檢查程序。

可執(zhí)行文件例如 .exe 文件

鏈接庫例如 .dll 文件

Applet 例如 Java 中的 .class 文件

Web 頁面例如 .HTML 和 .html 文件

數(shù)據(jù)庫表

工作產品構件的示例

源代碼文件例如 C++ 和 CORBA IDL 中的 .h、.cpp 和 .hpp 文件,或 Java 中的 .java 文件二進制文件例如鏈接到可執(zhí)行文件的 .o 文件和 .a 文件。SOM 文件IDL 和一些綁定編譯文件例如 unix 中的 makefile

使用

設計中的類和對象被作為部署構件進行實施。您需要確定如何將設計類映射為代碼;這應該在項目專用的設計指南中有所說明。

有關如何將設計類映射為代碼的詳細信息,請參見活動:實施構件。另請參見指南:類。

實施構件與修改構件在項目的配置管理環(huán)境中進行。實施員在為他們提供的專用開發(fā)工作區(qū)(請參見活動:創(chuàng)建開發(fā)工作區(qū))中,按照工件:工作單所指定的內容開展工作。在該工作區(qū)中,創(chuàng)建源元素并將其置于配置管理之下,或者在通常的檢%8D%95%E5%85%83%E6%B5%8B%E8%AF%95" target="_new" class=innerlink>單元測試、檢入周期中進行修改(請參見活動:進行變更)。完成某個構件集(根據(jù)一個或多個工作單的定義以及即將生成的工作版本要求)后,實施員將把有關新的和修改過的構件交付(請參見活動:交付變更內容)到子系統(tǒng)集成工作區(qū),以便與其他實施員的工作進行集成。最后,實施員可以在方便的時候對專用開發(fā)工作區(qū)進行更新(或者重新調整基線),使該工作區(qū)與子系統(tǒng)集成工作區(qū)保持一致(請參見活動:更新工作區(qū))。

當實施類時,應遵循編程指南。

實施的主要基礎是具有公有操作、屬性與關聯(lián)關系的類。務必要注意,并不是所有公有操作、屬性與關聯(lián)關系都在設計過程中定義。

實施的輔助基礎是用例實現(xiàn),用例實現(xiàn)顯示了類和對象如何通過交互來執(zhí)行用例。

最好以遞增的方式實施類;編譯、鏈接和運行一些回歸測試,每天進行三兩次。

在從零開始實施一個類之前,可考慮修改現(xiàn)有的實施類(一般可通過建立子類或進行實例化來修改)。

實施操作

要實施操作,請執(zhí)行以下步驟:

選擇算法 選擇適合算法的數(shù)據(jù)結構 根據(jù)需要定義新的類和操作 編寫操作代碼 選擇算法許多操作都十分簡單,可以從該操作及其規(guī)約中立即實施。

之所以需要特殊算法,主要是為了實施定義了規(guī)約的復雜操作,并優(yōu)化那些以簡單但卻低效的算法為定義的操作。

選擇適合算法的數(shù)據(jù)結構選擇算法包括選擇算法所基于的數(shù)據(jù)結構。許多實施數(shù)據(jù)結構是容器類,例如數(shù)組、列表、隊列、棧、集合、無序單位組,以及這些類的各種不同形式。許多面向對象的語言和編程環(huán)境都提供了具有這些可復用構件的類庫。

根據(jù)需要定義新的類和操作比如,可以使用新類來保存中間結果,也可對類添加新的低級操作來分解復雜操作。通常,這些操作是類的私有操作,所以在類之外看不見這些操作。

編寫操作代碼要編寫操作的代碼,可從接口語句開始,例如 C++ 中的成員函數(shù)聲明、Ada 中的子程序規(guī)約或 Visual Basic 中的方法。請遵循編程指南。

實施構件工作流程明細

實施狀態(tài)

對象的狀態(tài)可通過引用其屬性值來實施,而不必作特殊說明。這種對象的狀態(tài)轉移將隱含于變化的屬性值中,而變化的行為通過條件語句來編程。但對于復雜行為,該方法不能令人滿意,因為它往往會導致復雜的結構;而當添加更多狀態(tài)或當行為發(fā)生變化時,將很難更改這些結構。

如果構件(或其組成部分)的行為隨狀態(tài)而定,則通常會有一個或多個狀態(tài)圖來說明組成該構件的模型元素的行為。這些狀態(tài)圖可用作實施過程中的重要輸入。有關詳細信息,請參見指南:狀態(tài)圖。

狀態(tài)圖中所示的狀態(tài)機將表現(xiàn)對象的狀態(tài),并詳盡說明狀態(tài)轉移及所需的行為??梢酝ㄟ^以下幾種方法來實施狀態(tài)機:

對于簡單的狀態(tài)機,定義一項列舉可能狀態(tài)的屬性,然后使用該屬性在 Java 或 C++ 中的 switch 語句中選擇進入消息的行為。但這種方法不太適用于復雜的狀態(tài)機,它可能會導致運行時性能降低。如需此方法的示例,請參見【DOUG98】,第 4 章 4.4.3 對于較復雜的狀態(tài)機,可使用狀態(tài)模式。有關狀態(tài)模式的說明,請參見【GAM94】。【DOUG98】,第 6 章 6.2.3 狀態(tài)模式也說明了這種方法 表驅動法對于極復雜的狀態(tài)機十分有效,其特點是易于變更。當使用這種方法時,各個狀態(tài)在表中都有相應的條目,這些條目將輸入映射到后繼狀態(tài)和相關的轉移動作。如需此方法的示例,請參見【DOUG98】,第 6 章 6.2.3 狀態(tài)表模式。要實施具有并行子狀態(tài)的狀態(tài)機,可以將狀態(tài)管理委派給主動對象(每個對象都被委派一個并行子狀態(tài)),因為并行子狀態(tài)代表了獨立的計算(但仍可能進行交互)。每個子狀態(tài)均可通過上述方法之一來進行管理。

通過委托關系復用實施

如果一個類或一個類的某些部分可通過復用現(xiàn)有類來實施,則應通過委托關系(而不要繼承)來實現(xiàn)。

委托表示一個類借助于其他類來得以實施。該類通過使用變量來引用其他類的對象。當調用某操作時,該操作將調用被引用對象(屬于被復用的類)中的操作,以實際執(zhí)行該操作。這樣,它就將職責委派給了其他類。

實施關聯(lián)關系

單向關聯(lián)關系將作為指針(包含對象引用的屬性)來進行實施。如果多重性為一,則將單向關聯(lián)關系當作簡單指針來實施。如果多重性為多個,則將其當作指針集來實施。但如果“多”端是有序排列的,則可以使用列表,而不使用集合。

雙向關聯(lián)關系將作為屬性,使用單向關聯(lián)關系的技術在兩個方向上實施。

限定關聯(lián)關系將作為限定對象中的查詢表(如一個 smalltalk Dictionary 類)來實施。查詢表中的選擇器值是限定詞,而目標值是另一個類的對象。

如果必須按順序訪問限定詞的值,就應將限定詞組織成經過排序的數(shù)組或樹。在這種情況下,訪問時間將與 log N 成比例,其中 N 為限定詞值的數(shù)目。

如果限定詞取自于一個緊湊的有限集,就可以將限定詞的值映射到一個整數(shù)范圍,并將關聯(lián)關系當作數(shù)組來有效地進行實施。如果關聯(lián)關系已基本上填滿(而不是稀疏填充),此方法會更加有效;而對于完全填滿的有限集,它可以算是理想的方法。

許多面向對象的語言和編程環(huán)境都提供了具有可復用構件的類庫,可用于實施不同種類的關聯(lián)關系。

實施屬性

可以作為內置基本變量、可復用的構件類或定義一個新類來實現(xiàn)屬性。定義新類通常是較為靈活的方法,但它卻會帶來不必要的間接性。例如,實施雇員的社會保障號時,既可將它作為類型“字符串”的屬性,也可將它作為一個新類。

屬性的備選實施。

另一種可能的情況是:屬性組組成了新類,如下例所示。這兩種實施都是正確的。

將 Line 中的屬性當作 小數(shù)點 類的關聯(lián)關系來實施。

向設計提供反饋

在以上任何步驟中,如果發(fā)現(xiàn)了設計錯誤,都必須向設計提供返工反饋。如果所需的變更較小,就可以由同一個人來設計并實施類,而無需提出正式的變更請求。他可在設計中進行變更。

如果所需的變更影響到幾個類(例如在公有操作中的變更),則應向 CCB(變更控制委員會)提交正式的變更請求。請參見活動:修復缺陷。

評估代碼

在開始單元測試之前,可以先作一些檢查。測試是一項花費較多的工作,因此最好先執(zhí)行以下幾項檢查:

始終對代碼進行編譯。將編譯器的警告等級設置到最詳細的程度。通過想像對操作進行檢查。通讀代碼,盡可能考慮到所有情況,發(fā)現(xiàn)各種異常情況。一旦進行了新的實施活動,就需進行此項工作。使用工具檢查代碼中是否存在錯誤。例如,使用靜態(tài)代碼規(guī)則檢查程序。

其他定義

一個理解術語直觀含義的方法就是列舉它的所有特性。具體的做法是這樣的:如果一樣東西具有屬性a1、a2和a3,它就是A。例如,在著名的Wegner定義(1987)里,如果一種語言支持對象、類和繼承,那么它就可以被認為是面向對象的。

構件的特性是:

# 獨立部署單元;

# 作為第三方的組裝單元;

# 沒有(外部的)可見狀態(tài)。

這些特性有幾種含義。一個構件是獨立可部署的,意味著它必須能跟它所在的環(huán)境及其他構件相分離。因此,構件必須封裝自己全部內部特性。并且,構件作為可部署單元,具有原子性,是不可拆分的。

在這樣的約束下,如果第三方廠商能將一個構件和其他構件組裝在一起,那么這個構件必須具備良好的內聚性,還必須將自己的依賴條件和所提供的服務說明清楚。換句話說,構件必須封裝它的實現(xiàn),并且只通過良好定義的接口和外部環(huán)境進行交互。

最后,一個構件不能有任何(外部的)可見狀態(tài)——這要求構件不能與自己的拷貝有所區(qū)別。但對于不影響構件功能的某些屬性則沒有這種限制。

參考資料 >

生活家百科家居網(wǎng)