簡述
要開發一個成功的系統,外掛程式是必經之路。 對於小朋友來說,積木是木頭塑料,用這些小積木可以拼成房子、動物。 對於建築工人來說,積木是零磚碎瓦,用這些小積木可以構建高樓大廈。 對於程式員來說,積木可以看做是外掛程式(更進階一點),用這些小積木可以搭建大系統。
很多人認為外掛程式化很複雜,便將其拒之門外。實際上,從架構的使用角度來看,還是蠻簡單的。最難的,其實並不在於架構本身,而在於改變現有開發模式。有一種習慣叫做“墨守成規”,嗯,沒錯。。。對於程式猿/媛來說,處於這樣的狀態,和編碼機器有什麼區別。
簡述 為什麼要引入外掛程式 何為外掛程式 外掛程式化的使命 外掛程式化的原理 外掛程式架構的要素
著作權:一去丶二三裡,轉載請註明出處:http://blog.csdn.net/liang19890820 為什麼要引入外掛程式
在軟體開發過程中,有一項極具挑戰性的任務:構建可滿足客戶未來需求的產品。
尤其是軟體進入擴充/維護階段,更是如此。但是,在這個階段,往往會出現很多糟糕的情況: 軟體設計不合理 沒有相應的文檔 團隊成員離職(或調離至其他項目組) ……
這時,如果一個新的開發人員參與到產品的改進中,那麼恭喜。不僅在擴充功能時感到特別吃力,而且還存在破壞現有功能的風險。當然,如果能找到初創團隊成員進行協助,那麼將很幸福。。。
另外,為現有產品添加新功能的開發成本非常高。因為整個系統需要再次測試,並作為另一個版本發布。
為瞭解決這些問題,外掛程式出現了。 何為外掛程式
摘自維基百科:
外掛程式(Plugin)是一種電腦程式,通過和應用程式(例如:網頁瀏覽器,電子郵件用戶端)的互動,用來替應用程式增加一些所需要的特定的功能。最常見的有遊戲、網頁瀏覽器的外掛程式和媒體播放器的外掛程式。 外掛程式化的使命
外掛程式通常被部署為動態庫,動態庫讓外掛程式有許多優點: 熱插拔(重新載入新的實現,而無需關閉系統) 將原始碼從應用程式中分離出來 便於內部開發人員添加功能 使得第三方開發人員對應用程式安全地擴充(附加功能,而不修改核心系統)
然而,有時靜態庫是外掛程式的最佳選擇: 對於一些根本不支援動態庫的系統(許多嵌入式系統) 由於安全性問題,不允許載入外部代碼 核心系統需要積極式載入一些外掛程式,將其靜態連結到可執行程式(防止使用者意外刪除)
當然,一個好的外掛程式系統應該既支援動態外掛程式,又支援靜態外掛程式。這樣以來,便可以在具有不同約束的不同環境中部署同一套外掛程式系統。 外掛程式化的原理
原則:面向介面編程,而非面向實現編程。
外掛程式都是關於介面的,以外掛程式為基礎的系統,其基本概念是:系統可以載入外掛程式,但它不知道任何東西,並且通過一組定義良好的介面和協議與它們進行通訊。
在 利用外掛程式擴充Qt應用程式 中,可以看出這一點:
class IPerson{public: virtual ~IPerson() {} virtual QString name() = 0; // 人有名字 virtual void eat() = 0; // 人需要吃東西 virtual void sleep() = 0; // 人需要睡覺 virtual void doSomething() = 0; // 人還需要幹其他事};
外掛程式的目標是實現 IPerson,業務層的目標是調用 IPerson,業務層不知道 IPerson 具體是如何?的,而實現者也無需關心業務層是如何調用的。 外掛程式架構的要素
要實現一個外掛程式架構,需要考慮以下要素:
如何註冊外掛程式
如何調用外掛程式
如何測試外掛程式
架構要支援自動化測試:包括單元測試,整合測試。
外掛程式的生命週期管理
外掛程式的生命週期由外掛程式架構控制,需要考慮以下問題: 外掛程式的生命週期如何轉換。 一旦外掛程式的生命週期發生轉變,引用此外掛程式的類是否能得到通知。
外掛程式的管理和維護
對於外掛程式架構而言,這屬於基礎功能。主要包括: 為外掛程式提供名稱、版本、狀態等資訊,並可以擷取外掛程式列表,記錄外掛程式的處理日誌等。 提供外掛程式載入、啟動、停止、卸載等功能。
外掛程式的組裝(附加考評要素)
外掛程式的組裝是指可以靈活的將多個外掛程式組裝為一條鏈,然後鏈式的調用。
外掛程式的出錯處理
當外掛程式在處理過程中發生錯誤時,最理想的結果是外掛程式的調用停止,並記錄相關的日誌,另外的外掛程式對此情況做出錯誤修正處理(注意: 不能影響外掛程式架構和其他外掛程式的正常運轉)。