元件,是軟體設計開發中實現可重用的重要手段。一個高度可重用性的元件,可以極大降低應用開發的難度,加快開發的速度,保障軟體的質量。
       但是,不是任何的軟體模組都可以叫做元件,也不是任何元件都能做到被後續開發過程高度重用。因此,這裡需要對元件加以定義。
        在我看來,元件是指以原始碼或者二進位制方式釋出,能夠在一個或多個業務/技術領域內,不做任何修改,被直接整合。元件具有如下特徵:
        1. 元件本身不能直接執行。因此元件不可能是個程式。
        2. 元件要被很多專案、產品重用。如果一個元件只能在非常特定的情況下才能被使用,
那麼它的應用範圍很小,不能被廣泛重用,因此不能叫作元件。
        3. 元件的原始碼或者二進位制不能被修改。如果一個應用要使用一個元件,發現需要修
改原始碼才能滿足應用的需要,這樣的東西就不能叫元件。
        4. 元件中不存在應用不需要的功能。因此,元件不是一個功能的超集,不是一個龐然
大物的大雜燴,而是基本上所有的功能介面都被應用頻繁使用。
        5. 元件自身的規模不能太大。類越多,方法越多,使用的第三方庫越多越大,可重用
性就越差。
       
        因此,最理想的元件就是一個類(或者提供給應用使用的,主要就是一個類),沒有任
何依賴的第三方庫,對介面的最佳抽象,直接導致了這個元件的最廣泛應用。
        我非常推薦使用一個類的元件,我稱之為OneClass Component。
        這樣的元件,可以真正做到高度可重用,成為解決問題的利器,應用的程式碼也非常簡單
清晰。但這樣的元件,也是最難設計的,原因如下:
        元件是要有效解決問題的。如果要用一個類來把問題有效解決,必然要對要解決的問題
有入木三分的深刻理解,然後抽取最直接有效的介面,用最簡練、最精悍、最強大的技術來實現,這樣一個類的介面方法才能很少,類實現的程式碼量才能控制在非常少的範圍內。因為元件的接口方法很少,應用使用起來非常容易,整合簡單,但元件功能卻非常強大。
         這樣的元件,是優秀的元件,第一流的元件。
         縱觀開源世界,這樣的元件非常少,因此常常被大家說起的各種知名元件,其實都根
本算不上元件。
         我們常常說“不要重複發明輪子”,但實際上,我們常常沒有合適的輪子可用。比如
在Java開發中,每次要使用一個小功能,都要引入一個開源元件,而這個元件又依賴一大堆的Jar包,都得引進來。開啟這個元件,發現到處是介面,一大堆的介面方法,我們實際中只用其中幾個方法。因此,這樣的東西拙劣笨拙之極,根本是對元件的褻瀆。
         第一流的元件,OneClass Componnet,它的設計也是最難的。這樣的元件,基本的設
計原則如下:
         1. 元件設計者不能對元件將來被使用的環境有過多假定,最好對使用環境沒有任何要
求。沒有任何假定,就是說元件可以應用在任何環境中,可以在WEB中,可以在Application中,可以在前臺頁面中,也可以在後臺守護程式中,等等。這樣,元件的應用範圍非常廣。元件設計者不要對元件的使用範圍進行限制。舉個例子來說明:很多元件設計者給元件設計一個配置檔案,使用者通過修改配置檔案來達到對元件配置的目的。那麼這種設計,就對元件的使用環境有了假定:那就是使用者一定是使用檔案方式來配置的。如果一個應用是用資料庫來進行配置的,或者用配置伺服器來進行配置的,那麼這個元件就無法使用。這樣就限制了元件的使用場景。這類問題顯得非常隱晦,但在實際中大量的設計者犯這類錯誤。
         2. 元件要解決的問題要非常具體明確。一個元件,就是要解決一個特定的問題,在這
個問題的領域中提供最佳的解決方法。一個元件,不能被設計成要解決很多問題,要包打天下。看看我們的現實世界中,大量的所謂元件,都是龐然大物,都被設計成要解決所有問題,包打天下。
         3. 元件的設計者,要站在元件使用者的角度來進行設計,把對元件的使用過程做到最
簡單。因此,介面的方法數量要少,介面方法的功能含義要一目瞭然,介面引數要少,含義要明確,介面返回的值,就是使用者直接需要的,無需進行二次運算、轉換等。該元件自己內部實現的,封裝起來,不需要元件使用者瞭解。僅需要使用者提供最少、最合理的輸入、最少的呼叫即可。
         4. 元件的內部實現,要充分考慮記憶體使用、資料結構、演算法效率、設計模式、多執行緒
同步、斷連後的自動重連、斷點續傳等問題,使用精湛的技術來實現,保證功能、效能、穩定性等多方面的優秀表現。
         應用以上原則,不斷重構,最後產生的元件,將是第一流的元件。