軟體複用介紹
軟體複用,即使用已存在的軟體部件(softwaare components)來實作或者更新軟體系統。軟體複用有兩種視角:一是創造,二是使用。創造即面向複用程式設計,開發可複用的軟體。使用即基于複用程式設計,利用已有的可複用軟體搭建應用系統。
複用是現代軟體編寫中最重要的概念之一。它具有很多優點,如:适應性,高可靠性,能夠降低成本和開發時間等優點。
可複用的元件應該使用清晰的定義、開放的方式、簡潔的接口以及簡潔明了的文檔。在設計時,也要為未來的更新留足餘地。
複用的代價是很高的,它包括了有組織性的、有技巧的設計,複用中出現的多種變化,以及支撐這些變化的工具的開銷與讓人們适應新工具與新變化的開銷。
同時,可複用的軟體一般也具有一定缺陷,它的性能會稍稍差一些,針對更加普适的場景,缺少足夠的針對性。
如何定義軟體的可複用性
可複用性通常涉及到軟體的建構、打包、分發、安裝、設定、應用、維護以及更新等問題。
一個具有高可複用性的軟體應該小而精、與現行的多種标準相相容、靈活可變、具有優良的可擴充性、使用泛型參數、具有子產品化、在變化中維護較好的局部性、具有良好的穩定性,并且能提供豐富的文檔以及幫助。
複用的層次
軟體複用具有多種層次,分别是:
代碼層面:包括實作的方法,對變量的定義等
子產品層面:最基本的就是類與接口
運作庫層面:各種API的設計與實作
架構層面:使用各種架構,例如:springboot等現行的流行架構
在這其中最主要的複用是在代碼層面,它與程式員息息相關,這是最底層的複用。
白盒複用:源代碼可見,可修改與擴充。它的可定制化程度高,需要對代碼進行更加深入的了解,對它的修改會增加軟體的複雜度。
黑盒複用:源代碼不可見,并且不能修改。我們可以調用API接口來使用内部的黑盒代碼,但是無法修改。
使用代碼複用,在大多數情況下,我們都需要對源代碼進行修改,以滿足新的應用需求。
子產品複用與類和接口有關,一個類是子產品複用的基本單元,我們可以不必知道其中的代碼,隻需使用jar包導入該類,隻需将其添加到classpath中,我們可以使用javap工具來得到一個類的公共方法的headers。 這些子產品經過了封裝,是以使用者在使用時需要查閱類設計者提供的相關文檔。
Java提供了一種名為繼承的代碼重用方式,一個類使用extends關鍵字,能夠繼承一個父類的屬性與行為,但子類能夠重寫父類中的方法。
委托就是一個對象對另一個對象所提供的功能有着依賴關系,例如Sorter分類器委托了一些功能給了Comparator比較器,即分類器的實作與使用需要依賴于比較器。
設計良好的委托可以實作複用
是以,分類器(Sorter)可以被不同的分類順序所複用,比較器(Comparator)可以被需要比較數字的代碼所複用。
複用也有兩種分類,分别是明确委托與隐性委托。明确委托是直接在代碼層面上傳遞相應的對象,而隐性委托則不直接寫出來,它與Java中的文法密切相關。
接口(英文:Interface),在JAVA程式設計語言中是一個抽象類型,是抽象方法的集合,接口通常以interface來聲明。一個類通過繼承接口的方式,進而來繼承接口的抽象方法。
接口并不是類,編寫接口的方式和類很相似,但是它們屬于不同的概念。類描述對象的屬性和方法。接口則包含類要實作的方法。
除非實作接口的類是抽象類,否則該類要定義接口中的所有方法。
接口無法被執行個體化,但是可以被實作。一個實作接口的類,必須實作接口内所描述的所有方法,否則就必須聲明為抽象類。另外,在 Java 中,接口類型可用來聲明一個變量,他們可以成為一個空指針,或是被綁定在一個以此接口實作的對象。
運作庫(library)即提供了可複用功能的類與方法的集合。許多API提供了這些類與方法,能讓我們更好地實作自己想要的功能。典型的有Java API
容易學。具有豐富的文檔,讓使用者第一次使用的時候不至于一頭霧水。
容易使用,使用方法符合直覺,符合普遍的程式設計習慣,讓使用者很難用錯(misuse)。
使用該API寫出的代碼可讀性強,并且易于維護。
API封裝得精良,使用者不需要知道底層實作細節便能輕松使用該API。
足夠滿足大部分的設計需求。
便于更新,且對API的更新不影響已存在的使用該API的代碼。
應用架構,即軟體的骨架,軟體的其他部件都依托于該骨架,它包括了類與類之間的關系,接口之間的依賴關系等等。使用了架構,我們僅需向該架構中寫入自己的特定代碼,大大降低了寫代碼的時間。
架構分為黑盒架構與白盒架構。黑盒架構需要通過實作特定接口或者使用委托(delegation)進行架構的擴充,白盒架構則需要我們深入代碼底層進行修改以實作架構的擴充。
Java中的常見架構有:Spring、Springboot。Spring架構是由于軟體開發的複雜性而建立的。Spring使用的是基本的JavaBean來完成以前隻可能由EJB完成的事情。然而,Spring的用途不僅僅限于伺服器端的開發。從簡單性、可測試性和松耦合性角度而言,絕大部分Java應用都可以從Spring中受益。Spring Boot是由Pivotal團隊提供的全新架構,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該架構使用了特定的方式來進行配置,進而使開發人員不再需要定義樣闆化的配置。通過這種方式,Spring Boot緻力于在蓬勃發展的快速應用開發領域(rapid application development)成為上司者。