摘要:大綱什么是軟件復用如何衡量可復用性可復用組件的級別和形態源代碼級別復用模塊級別的復用類抽象類接口庫級別的復用包系統級別的復用框架對可復用性的外部觀察類型變化例行分組實施變更代表獨立分解常見行為總結什么是軟件復用軟件復用軟件復用是使用現有軟件
大綱
什么是軟件復用?
如何衡量“可復用性”?
可復用組件的級別和形態
源代碼級別復用
模塊級別的復用:類/抽象類/接口
庫級別的復用:API /包
系統級別的復用:框架
對可復用性的外部觀察
類型變化
例行分組
實施變更
代表獨立
分解常見行為
總結
什么是軟件復用?軟件復用
軟件復用是使用現有軟件組件實施或更新軟件系統的過程。
軟件復用的兩個觀點
創建:以系統方式創建可復用資源(面向復用編程:開發出可復用的軟件)
使用:復用資源作為創建新系統的構建塊(基于復用編程:利用已有的可復用軟件搭建應用系統)
為什么復用?
“創造可重復使用而不是暫時性文物的動力具有審美和知識以及經濟動機,并且是人類對不朽渴望的一部分。
它將人與其他生物區分開來,并從原始社會文明“(Wegner,1989)。
為什么復用?
重復使用具有成本效益,并且具有及時性降低成本和開發時間
通過縮短軟件生產周期時間來提高軟件生產力(開發速度更快,人員更少的軟件)
不浪費資源不必要地“重新發明輪子”
降低維護成本(可生產更好的質量,更可靠和更高效的軟件)
經過充分測試,可靠,穩定,生成可靠的軟件
重復使用已經存在一段時間并被調試的功能是構建穩定子系統的基礎
重復使用標準化,在不同應用中保持一致
復用GUI庫可在應用程序中產生常見的外觀。
與常規,一致的設計保持一致。
重復使用成本
可復用組件的設計和構建應該采用明確,開放的方式,具有簡潔的接口規范,易于理解的文檔以及面向未來的使用。做到這些,需要代價。
復用成本很高:涉及跨越組織,技術和流程變更,以及支持這些變更的工具成本,以及培訓人員使用新工具和變更的成本。 不僅面向復用編程代價高,基于復用編程代價也高
面向復用開發:開發可復用的軟件
可復用組件的開發成本高于特定等價物的成本。 這種額外的可復用性增強成本應該是一個組織而不是項目成本。 開發成本高于一般軟件的成本:要有足夠高的適應性
通用組件的空間效率可能較低,執行時間可能長于其特定的等效項。 性能差些:針對更普通場景,缺少足夠的針對性。
基于復用開發:使用已有軟件進行開發
必須開發和維護用于體系結構,設計,文檔和代碼的組件管理工具,例如存儲庫。可復用軟件庫,對其進行有效的管理
一個關鍵問題:適應往往無法拿來就用,需要適配
可能需要將額外的功能添加到組件。 添加完成后,新組件可以重新使用。
可以從組件中刪除不需要的功能,以提高其性能或減少其空間要求
某些組件操作的實現可能需要修改。
如何衡量“可復用性”?衡量可復用性
軟件資產在不同應用場景中的重復使用頻率如何?
資產使用的可能性越高,其可復用性越高。
編寫一次,重復使用多次。
為重復使用此資產需支付多少費用?
購買資產和其他強制性庫的成本
調整和擴展它的成本
實例化它的成本
更改與其交互的系統的其他部分的成本
可復用性
可復用性意味著對構建,打包,分發,安裝,配置,部署,維護和升級問題進行一些明確的管理。
具有高可復用性的軟件資產應該:
簡短(小尺寸)和簡單(低復雜度)
便攜式和標準合規性
適應性和靈活性
可擴展性
通用和參數化
模塊化
易變(可變)設計假設的本地化
改變要求時的穩定性
豐富的文檔
可重復使用組件的級別和形態復用水平
可復用組件可能是代碼
最普遍:大多數程序員與復用有關
但是,從更廣泛和更高層次上看待可以重復使用的觀點帶來的好處。
要求
設計和規格
數據
測試用例
文件
我們在這節課中關注的是什么
源代碼級別:方法,語句等
模塊級別:類和接口
庫級別:API
Java庫,.jar
架構級別:框架框架
代碼復用的類型
白盒復用:源代碼可見,可修改和擴展
代碼本身可用時復用代碼。 通常需要某種修改或改編
Pro:您可以自定義模塊以適應特定的情況,這允許在更多情況下復用
Con:你現在擁有自定義的結果,所以它增加了你的代碼復雜度。 您需要內部組件的內在知識。
黑盒復用:源代碼不可見,不能修改
通過提供一些“膠水”來重新組合現有代碼的形式,但不必更改代碼本身 - 通常是因為您無法訪問代碼。只能通過API接口來使用,無法修改代碼
Pro:簡潔和清潔
Con:很多時候這是不可能的
可復用組件分布的格式
形式:
源代碼
包,如.jar,.gem,.dll,
可復用軟件組件的來源:
組織的內部代碼庫(Guava)
第三方提供的庫(Apache)
語言自己提供的庫(JDK)
來自教程,示例,書籍等的代碼示例
本地代碼專家或知識淵博的同事
現有的系統代碼
開源產品(請務必遵守任何許可協議)
(1)源代碼復用
復用代碼 - 最低級別
將部分/全部復制/粘貼到您的程序中
維護問題
需要在多個地方更正代碼
使用太多的代碼(很多版本)
過程中出現錯誤的風險很高
可能需要知道如何使用的軟件工作
需要訪問源代碼
(2)模塊級復用:類/接口
復用類
類是代碼復用的原子單元
不需要源代碼,類文件或jar / zip
只需要包含在類路徑中
可以使用javap工具來獲取類的公共方法頭
文檔非常重要(Java API)
封裝有助于復用
代碼管理較少
版本控制,向后兼容性仍然存在問題
需要一起打包相關的類 - 靜態鏈接
復用類的方法:繼承
Java提供了一種名為Inheritance的代碼復用方法
類擴展現有類的屬性/行為
另外,他們可能會覆蓋現有的行為
不需要放置僅僅轉發或委托工作的虛擬方法
更好地捕捉現實世界
通常需要在實現之前設計繼承層次結構
無法取消屬性或方法,因此一定要小心,不要過分
復用類的方法:委托
委托只是當一個對象依賴另一個對象來實現其功能的某個子集時(一個實體將某個事物傳遞給另一個實體)
例如分揀機正在委托比較器的功能
審慎的委托支持代碼復用
分揀機可以重復使用任意的排序順序
比較器可以重復使用需要比較整數的任意客戶端代碼
顯式委托:將發送對象傳遞給接收對象
隱式委托:由語言的成員查找規則
委托可以被描述為在實體之間共享代碼和數據的低級機制。
(3)庫級復用:API /包
庫:一組提供可復用功能的類和方法(API)
框架:可以定制到應用程序中的可重復使用的框架代碼
框架調用回客戶端代碼
好萊塢原則:“不要打電話給我們。 我們會打電話給你。“
一般區別:庫與框架
框架作為主程序加執行,執行過程中調用開發者所寫的程序
開發者構造可運行軟件實體,其中涉及到對可復用庫的調用
(4)系統級復用:框架
應用程序框架
框架是子系統設計,包含一系列抽象和具體類以及每個類之間的接口
框架:一組具體類,抽象類,及其之間的連接關系 - 只有“骨架”,沒有“血肉”
框架是一種抽象,其中提供通用功能的軟件可以通過額外的用戶編寫的代碼進行選擇性更改,從而提供特定于應用程序的軟件。 開發者根據框架的規約,填充自己的代碼進去,形成完整系統
可復用性利用了應用領域知識和經驗豐富的開發人員的先前努力
數據處理,圖形用戶界面等
將框架看作是更大規模的API復用,除了提供可復用的API,還將這些模塊之間的關系都確定下來,形成了整體應用的領域復用
框架:領域復用
系統通過添加組件來填充缺失的設計元素并實例化抽象類來實現
通常通過選擇性覆蓋來擴展框架; 或者程序員可以添加專門的用戶代碼來提供特定的功能---定義從抽象類祖先繼承操作的具體類
鉤子方法,被應用程序覆蓋以擴展框架。 鉤子(Hook)方法系統地將應用程序域的接口和行為與應用程序在特定上下文中所需的變體解耦。
控制反轉:與庫或標準用戶應用程序不同,控制流不是由調用者決定的,而是由框架決定的。
不可修改的框架代碼:框架代碼不應該被修改,同時接受用戶實現的擴展。 換句話說,用戶可以擴展框架,但不應修改其代碼。
控制反轉(Inverse of Control)
由第三方的容器來控制對象之間的依賴關系,而非傳統實現中由代碼直接操控。
控制權由代碼中轉到了外部容器,帶來的好處就是降低了對象之間的依賴程度,提高靈活性和可維護性。
框架設計
框架與應用程序不同
抽象級別不同,因為框架為相關問題家族提供解決方案,而不是單一解決方案。
為了適應這一系列問題,該框架是不完整的,包含熱點和掛鉤以允許定制
框架可以用擴展它們的技術來分類。
白盒框架
黑盒框架
白盒和黑盒框架
白盒框架:
通過繼承和動態綁定實現的可擴展性。
通過繼承框架基類并重寫預定義的鉤子方法來擴展現有功能
通常使用模板方法模式等設計模式來覆蓋鉤子方法。
黑盒框架
通過為可插入框架的組件定義接口來實現可擴展性。
通過定義符合特定接口的組件來復用現有功能
這些組件通過委托與框架集成。
類庫與框架
類庫:
較少的域特定
提供更小的復用范圍。
類庫是被動的; 對控制流程沒有限制。
框架:
類為相關應用系列合作。
框架活動; 影響控制流程。
在實踐中,開發人員經常使用兩種:
框架通常在內部使用類庫來簡化框架的開發。
框架事件處理程序使用類庫來執行基本任務(例如字符串處理,文件管理,數值分析......)。
組件與框架
組件
類的獨立實例
連接在一起形成完整的應用程序。
黑盒定義了一套連貫的操作,
可以基于接口的語法和語義使用。
組件甚至可以在二進制代碼級復用。
?優點是應用程序不一定需要在組件更改時重新編譯。
構架:
經常用于開發組件
組件通常插入黑盒框架。
可復用性的外部觀察對可復用性的外部觀察
類型可變
功能分組
實現可變
表示獨立
共性抽取
類型可變
可復用組件應該是類型參數化的,以便它們可以適應不同的數據類型(輸入,計算和輸出);
可重復使用的模塊應該適用于許多不同類型的元素,而不需要開發人員對軟件文本進行手動更改。
換句話說,我們需要一個用于描述類型參數化模塊的工具,這個模塊也被稱為通用模塊。
通用性:可復用組件應該是通用的。
類型可變(泛型):適應不同的類型,且滿足LSP
實現可變
在實踐中有很多種適用的數據結構和算法。
我們不能期望單個模塊能夠處理所有可能性,這種變化確實是這樣; 這將是巨大的。
我們需要一系列模塊來涵蓋所有不同的實現。
實現可變:ADT有多種不同的實現,提供不同的表示和抽象功能,但具有同樣的規范(前置條件,后置條件,不變式),從而可以適應不同的應用場景
功能分組
一個自給自足的可復用模塊需要包含一組功能,每個操作一個功能。
完整性
提供完備的細粒度操作,保證功能的完整性,不同場景下復用不同的操作(及其組合)
表示獨立性
可復用模塊的一般形式應該使客戶能夠指定一個操作而不知道它是如何實現的。
表示獨立性是信息隱藏規則的延伸,對于大型系統的順利開發至關重要:實施決策經常會改變,客戶應該受到保護。 內部實現可能會經常變化,但客戶端不應受到影響。
表示獨立反映了客戶對可復用性的看法 - 忽略內部實現細節和變體的能力
表示獨立性,信息隱藏
共性抽取
分解共同行為,反映了供應商的觀點,更一般地反映了可復用類的開發者的觀點。
目標是利用家庭或實施子系列中可能存在的任何通用性。
將共同的行為(共性)抽象出來,形成可復用實體
如上所述,在某些問題領域可用的各種實現通常需要基于模塊族的解決方案。
這些類別中的每一個都涵蓋了許多變體,但通常可以在這些變體之間找到顯著的共性。
什么是軟件復用?
如何衡量“可復用性”?
可復用組件的級別和形態
源代碼級別復用
模塊級復用:類/接口
庫級:API /包
系統級復用:框架
對可復用性的外部觀察
類型可變
功能分組
實現可變
表示獨立
共性抽取
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71350.html
摘要:代碼使用泛型類中不依賴于類型參數的方法。委托依賴于動態綁定,因為它要求給定的方法調用可以在運行時調用不同的代碼段。委托捕獲操作并將其發送給另一個對象。委托可以被看作是在對象層次上的復用機制,而繼承是類層次上的復用機制。 大綱 設計可復用的類 繼承和重寫 重載(Overloading) 參數多態和泛型編程 行為子類型與Liskov替換原則 組合與委托 設計可復用庫與框架 API和庫...
摘要:共性的步驟在抽象類內公共實現,差異化的步驟在各個子類中實現子類為每個步驟提供不同的實現。模板方法將算法的骨架定義為抽象類,允許其子類提供具體行為。迭代器依次訪問對象的元素而不暴露其基礎表示。 大綱 結構模式 Adapter允許具有不兼容接口的類通過將自己的接口包裝到已有類的接口中來一起工作。 Decorator動態添加/覆蓋對象的現有方法中的行為。 Facade為大量代碼提供簡化的界...
摘要:設計方案的容易改變這就是所謂的軟件構建的可維護性,可擴展性和靈活性。這也可能表明類型或方法可能難以維護。基于源代碼中不同運算符和操作數的數量的合成度量。對修改的封閉這種模塊的源代碼是不可侵犯的。 大綱 軟件維護和演變可維護性度量模塊化設計和模塊化原則OO設計原則:SOLIDOO設計原則:GRASP總結 軟件維護和演變 什么是軟件維護? 軟件工程中的軟件維護是交付后修改軟件產品以糾正故障...
摘要:解釋模塊耦合性的含義,對不同的耦合舉例說明耦合性,也叫耦合度,是對模塊間關聯程度的度量。模塊間的耦合度是指模塊之間的依賴關系,包括控制關系調用關系數據傳遞關系。軟件設計中通常用耦合度和內聚度作為衡量模塊獨立程度的標準。 ...
摘要:抽象工廠模式將具有共同主題的對象工廠分組。對可重用性和可維護性設計模式的高層考慮創造性模式工廠方法模式也稱為虛擬構造器意圖定義一個用于創建對象的接口,但讓子類決定實例化哪個類。 大綱 創造性模式 工廠方法模式創建對象而不指定要創建的確切類。 抽象工廠模式將具有共同主題的對象工廠分組。 Builder模式通過分離構造和表示來構造復雜的對象。 結構模式 Bridge將抽象從其實現中分...
閱讀 2178·2023-04-25 19:06
閱讀 1375·2021-11-17 09:33
閱讀 1767·2019-08-30 15:53
閱讀 2582·2019-08-30 14:20
閱讀 3541·2019-08-29 12:58
閱讀 3534·2019-08-26 13:27
閱讀 501·2019-08-26 12:23
閱讀 485·2019-08-26 12:22