一.什麼是可複用軟體
定義:軟體的複用是一個通過實用已經存在的軟體的元件來實作或更新軟體系統的一個過程。
從兩個角度來看軟體複用:
· 創造(Creation):面向複用的程式設計(Programming for reuse)——開發出可複用的軟體。
· 使用(Use):基于複用的程式設計(Programming with reuse)——利用已有的可複用軟體搭建應用系統
複用的好處:
· 降低成本和開發時間
· 經過充分的測試,可靠、穩定
· 标準化,在不同的應用之中保持一緻
複用的代價:
· 複用的部分需要有着清晰的定義、開放的方法、簡明的接口的規約、可了解的文檔、并着眼于未來的使用
· 複用涉及到了組織、技術、過程的變化,同樣也需要支援這些變化的工具和訓練那些能使用工具來應對變化的人
開發可複用的軟體:
因為軟體要具有足夠高的可适應性,是以開發成本要高于一般的軟體。相對于其它軟體而言,它的性能可能回更差,但是更具有普适性。
使用已有的軟體進行開發:
可複用軟體庫,對其進行有效的管理
注意:對于複用的軟體,需要進行适配
· 增加新的功能
· 移除不必要的功能
· 有些操作需要被修改
二. 如何衡量可複用性
複用的機會有多頻繁(How frequently);複用的代價有多大(How much)
可複用性意味着一些明确的建構方式、包裝、分發、安裝、配置、部署、維護和更新的問題。
一個具有高複用性的軟體應當具有以下特征:
· 小而簡單——Brief and Simple
· 與标準相容——Portable and Standard Compliance
· 靈活可變——Adaptable and Flexible
· 泛型、參數化
· 子產品化——Modularity
· 變化的局部性
· 穩定
· 豐富的文檔
三.不同層面的複用
最主要的複用是在代碼層面。但是軟體構造過程中的任何實體都可能被複用——需求、規約、資料、測試用例、文檔。
我們關系四個層面的複用——
· 代碼層面——方法,陳述
· 子產品層面——類和接口
· 庫層面——API,Java的庫,jar包
· 建構層面——架構(framework)
1.代碼層面的複用——最低層次的複用
方法:複制代碼
- 維護問題、在運作之中有很高的錯誤的風險、需要對于軟體的運作方式有所了解
· 白盒複用(White box reuse):源代碼可見,可修改和擴充。複制已有的代碼到正在開發的系統,并做适當的修改。
好處:因為可以修改代碼,是以能複用到更多的場合,可定制化程度更好。
缺點:對其修改增加了軟體的複雜度,且需要對其内部有充分的了解。
· 黑盒複用(Black box reuse):源代碼不可見,不能修改。隻能通過API接口來使用,無法修改代碼。
好處:簡單清晰
缺點:适應性較差
2.子產品層面的複用
類是代碼複用的原子單元(atomic unit),并不需要源代碼,隻需要類的路徑(classpath)
- 類的文檔十分重要(Java API)
- 封裝有助于複用
- 更少的代碼管理
- 還會存在版本的相容問題
- 需要将包和類相關聯(靜态連結)
Java提供了一種類的複用方式——繼承(inheritance)
另一種類的複用方式——委派(Delegation)
委派——一個對象依賴另一個對象來實作其某一子功能
e.g. Sorter将其部分功能委派給了Comparator
明智的委派可以增加代碼的複用性。委派可以說是一種實作在不同執行個體之間分享代碼和資料低級機制。
3.庫層面的複用(API和包)
庫(Libraries):一系列提供了複用功能的類和方法
架構(Framework):能在應用之中被定制的可複用的代碼
4.系統層面的複用:架構
架構:一組具體類、抽象類、及其之間的連接配接關系。開發者根據framework的規約,填充自己的代碼進去,形成完整系統
四.可複用性的外部觀察
類型可變(Type Variation):
可複用元素應當被類型參數化(type-parameterized),是以它們才能适應不同的資料類型。由此可見,應當使用泛型來适應不同的類型,且要滿足LSP原則。
實作可變(Implementation Variation)
ADT 有多種不同的實作,提供不同的representations 和abstract funtion ,但具有同樣的specification (pre-condition, post-condition, invariants)
功能分組(Routine Grouping):
提供完備的細粒度操作,保證功能的完整性,不同場景下複用不同的操作( 及其組合)
表示獨立(Representation Independence):
可複用子產品的一般形式是使用戶端知道特定的操作但不清楚内部的具體實作。
共性抽取(Factoring Out Common Behaviors):
将共同的行為(共性)抽象出來,形成可複用實體
資料來源: 哈工大軟體構造課程