什麼是軟件複用?
如何衡量「可複用性」?
可複用組件的級別和形態java
對可複用性的外部觀察程序員
總結算法
軟件複用編程
軟件複用是使用現有軟件組件實施或更新軟件系統的過程。設計模式
軟件複用的兩個觀點數據結構
爲何複用?架構
爲何複用?框架
重複使用具備成本效益,而且具備及時性下降成本和開發時間數據結構和算法
通過充分測試,可靠,穩定,生成可靠的軟件模塊化
重複使用標準化,在不一樣應用中保持一致
重複使用成本
可複用組件的設計和構建應該採用明確,開放的方式,具備簡潔的接口規範,易於理解的文檔以及面向將來的使用。作到這些,須要代價。
複用成本很高:涉及跨越組織,技術和流程變動,以及支持這些變動的工具成本,以及培訓人員使用新工具和變動的成本。 不只面向複用編程代價高,基於複用編程代價也高
面向複用開發:開發可複用的軟件
可複用組件的開發成本高於特定等價物的成本。 這種額外的可複用性加強成本應該是一個組織而不是項目成本。 開發成本高於通常軟件的成本:要有足夠高的適應性
通用組件的空間效率可能較低,執行時間可能長於其特定的等效項。 性能差些:針對更普通場景,缺乏足夠的針對性。
基於複用開發:使用已有軟件進行開發
必須開發和維護用於體系結構,設計,文檔和代碼的組件管理工具,例如存儲庫。可複用軟件庫,對其進行有效的管理
一個關鍵問題:適應每每沒法拿來就用,須要適配
衡量可複用性
軟件資產在不一樣應用場景中的重複使用頻率如何?
爲重複使用此資產需支付多少費用?
可複用性
可複用性意味着對構建,打包,分發,安裝,配置,部署,維護和升級問題進行一些明確的管理。
具備高可複用性的軟件資產應該:
複用水平
可複用組件多是代碼
可是,從更普遍和更高層次上看待能夠重複使用的觀點帶來的好處。
咱們在這節課中關注的是什麼
源代碼級別:方法,語句等
模塊級別:類和接口
庫級別:API
架構級別:框架框架
代碼複用的類型
白盒複用:源代碼可見,可修改和擴展
黑盒複用:源代碼不可見,不能修改
可複用組件分佈的格式
形式:
可複用軟件組件的來源:
(1)源代碼複用
複用代碼 - 最低級別
將部分/所有複製/粘貼到您的程序中
維護問題
過程當中出現錯誤的風險很高
可能須要知道如何使用的軟件工做
須要訪問源代碼
(2)模塊級複用:類/接口
複用類
類是代碼複用的原子單元
文檔很是重要(Java API)
封裝有助於複用
代碼管理較少
版本控制,向後兼容性仍然存在問題
須要一塊兒打包相關的類 - 靜態連接
複用類的方法:繼承
Java提供了一種名爲Inheritance的代碼複用方法
不須要放置僅僅轉發或委託工做的虛擬方法
更好地捕捉現實世界
一般須要在實現以前設計繼承層次結構
沒法取消屬性或方法,所以必定要當心,不要過度
複用類的方法:委託
委託只是當一個對象依賴另外一個對象來實現其功能的某個子集時(一個實體將某個事物傳遞給另外一個實體)
審慎的委託支持代碼複用
顯式委託:將發送對象傳遞給接收對象
隱式委託:由語言的成員查找規則
委託能夠被描述爲在實體之間共享代碼和數據的低級機制。
(3)庫級複用:API /包
庫:一組提供可複用功能的類和方法(API)
框架:能夠定製到應用程序中的可重複使用的框架代碼
框架調用回客戶端代碼
通常區別:庫與框架
框架做爲主程序加執行,執行過程當中調用開發者所寫的程序
開發者構造可運行軟件實體,其中涉及到對可複用庫的調用
(4)系統級複用:框架
應用程序框架
框架是子系統設計,包含一系列抽象和具體類以及每一個類之間的接口
框架:一組具體類,抽象類,及其之間的鏈接關係 - 只有「骨架」,沒有「血肉」
框架是一種抽象,其中提供通用功能的軟件能夠經過額外的用戶編寫的代碼進行選擇性更改,從而提供特定於應用程序的軟件。 開發者根據框架的規約,填充本身的代碼進去,造成完整系統
可複用性利用了應用領域知識和經驗豐富的開發人員的先前努力
框架:領域複用
系統經過添加組件來填充缺失的設計元素並實例化抽象類來實現
控制反轉(Inverse of Control)
由第三方的容器來控制對象之間的依賴關係,而非傳統實現中由代碼直接操控。
控制權由代碼中轉到了外部容器,帶來的好處就是下降了對象之間的依賴程度,提升靈活性和可維護性。
框架設計
框架與應用程序不一樣
框架能夠用擴展它們的技術來分類。
白盒和黑盒框架
白盒框架:
黑盒框架
類庫與框架
類庫:
框架:
在實踐中,開發人員常用兩種:
組件與框架
組件
•優勢是應用程序不必定須要在組件更改時從新編譯。
構架:
對可複用性的外部觀察
類型可變
功能分組
實現可變
表示獨立
共性抽取
類型可變
可複用組件應該是類型參數化的,以便它們能夠適應不一樣的數據類型(輸入,計算和輸出);
換句話說,咱們須要一個用於描述類型參數化模塊的工具,這個模塊也被稱爲通用模塊。
通用性:可複用組件應該是通用的。
類型可變(泛型):適應不一樣的類型,且知足LSP
實現可變
在實踐中有不少種適用的數據結構和算法。
咱們不能指望單個模塊可以處理全部可能性,這種變化確實是這樣; 這將是巨大的。
咱們須要一系列模塊來涵蓋全部不一樣的實現。
實現可變:ADT有多種不一樣的實現,提供不一樣的表示和抽象功能,但具備一樣的規範(前置條件,後置條件,不變式),從而能夠適應不一樣的應用場景
功能分組
一個自給自足的可複用模塊須要包含一組功能,每一個操做一個功能。
完整性
提供完備的細粒度操做,保證功能的完整性,不一樣場景下複用不一樣的操做(及其組合)
表示獨立性
可複用模塊的通常形式應該使客戶可以指定一個操做而不知道它是如何實現的。
表示獨立性是信息隱藏規則的延伸,對於大型系統的順利開發相當重要:實施決策常常會改變,客戶應該受到保護。 內部實現可能會常常變化,但客戶端不該受到影響。
表示獨立反映了客戶對可複用性的見解 - 忽略內部實現細節和變體的能力
表示獨立性,信息隱藏
共性抽取
分解共同行爲,反映了供應商的觀點,更通常地反映了可複用類的開發者的觀點。
目標是利用家庭或實施子系列中可能存在的任何通用性。
將共同的行爲(共性)抽象出來,造成可複用實體
如上所述,在某些問題領域可用的各類實現一般須要基於模塊族的解決方案。
這些類別中的每個都涵蓋了許多變體,但一般能夠在這些變體之間找到顯着的共性。
什麼是軟件複用?
如何衡量「可複用性」?
可複用組件的級別和形態
對可複用性的外部觀察