簡述
要開發乙個成功的系統,外掛程式是必經之路。
1.對於小朋友來說,積木是木頭塑料,用這些小積木可以拼成房子、動物。
2.對於建築工人來說,積木是零磚碎瓦,用這些小積木可以構建高樓大廈。
3.對於程式設計師來說,積木可以看做是外掛程式(更高階一點),用這些小積木可以搭建大系統。
很多人認為外掛程式化很複雜,便將其拒之門外。實際上,從框架的使用角度來看,還是蠻簡單的。最難的,其實並不在於框架本身,而在於改變現有開發模式。有一種習慣叫做「墨守成規」,嗯,沒錯。。。對於程式猿/媛來說,處於這樣的狀態,和編碼機器有什麼區別?
為什麼要引入外掛程式
在軟體開發過程中,有一項極具挑戰性的任務:構建可滿足客戶未來需求的產品。
尤其是軟體進入擴充套件/維護階段,更是如此。但是,在這個階段,往往會出現很多糟糕的情況:
1.軟體設計不合理
2.沒有相應的文件
3.團隊成員離職(或調離至其他專案組)
4.……
這時,如果乙個新的開發人員參與到產品的改進中,那麼恭喜!不僅在擴充套件功能時感到特別吃力,而且還存在破壞現有功能的風險。當然,如果能找到初創團隊成員進行協助,那麼將很幸福。。。
另外,為現有產品新增新功能的開發成本非常高。因為整個系統需要再次測試,並作為另乙個版本發布。
為了解決這些問題,外掛程式出現了!
何為外掛程式
摘自維基百科:
外掛程式化的使命
外掛程式通常被部署為動態庫,動態庫讓外掛程式有許多優點:
然而,有時靜態庫是外掛程式的最佳選擇:
1.對於一些根本不支援動態庫的系統(許多嵌入式系統)
2.由於安全性問題,不允許載入外部**
3.核心系統需要預先載入一些外掛程式,將其靜態鏈結到可執行程式(防止使用者意外刪除)
當然,乙個好的外掛程式系統應該既支援動態外掛程式,又支援靜態外掛程式。這樣以來,便可以在具有不同約束的不同環境中部署同一套外掛程式系統。
外掛程式化的原理
原則:面向介面程式設計,而非面向實現程式設計。
外掛程式都是關於介面的,以外掛程式為基礎的系統,其基本概念是:系統可以載入外掛程式,但它不知道任何東西,並且通過一組定義良好的介面和協議與它們進行通訊。
在 利用外掛程式擴充套件qt應用程式 中,可以看出這一點:
class iperson
virtual qstring name() = 0; // 人有名字
virtual void eat() = 0; // 人需要吃東西
virtual void sleep() = 0; // 人需要睡覺
virtual void dosomething() = 0; // 人還需要幹其他事
};
外掛程式的目標是實現 iperson,業務層的目標是呼叫 iperson,業務層不知道 iperson 具體是如何實現的,而實現者也無需關心業務層是如何呼叫的。
外掛程式框架的要素
要實現乙個外掛程式框架,需要考慮以下要素:
1.如何註冊外掛程式
2.如何呼叫外掛程式
3.如何測試外掛程式
框架要支援自動化測試:包括單元測試,整合測試。
5.外掛程式的生命週期管理
外掛程式的生命週期由外掛程式框架控制,需要考慮以下問題:
外掛程式的生命週期如何轉換?
一旦外掛程式的生命週期發生轉變,引用此外掛程式的類是否能得到通知。
6.外掛程式的管理和維護
對於外掛程式框架而言,這屬於基礎功能。主要包括:
為外掛程式提供名稱、版本、狀態等資訊,並可以獲取外掛程式列表,記錄外掛程式的處理日誌等。
提供外掛程式載入、啟動、停止、解除安裝等功能。
7.外掛程式的組裝(附加考評要素)
外掛程式的組裝是指可以靈活的將多個外掛程式組裝為一條鏈,然後鏈式的呼叫。
8.外掛程式的出錯處理
當外掛程式在處理過程中發生錯誤時,最理想的結果是外掛程式的呼叫停止,並記錄相關的日誌,另外的外掛程式對此情況做出糾錯處理(注意: 不能影響外掛程式框架和其他外掛程式的正常運轉)。
Qt之深入理解gesture
qgesturemanager qgesturemanager qobject parent qobject parent state notgesture m lastcustomgestureid 0 複製 上面的 很簡單這裡我只簡單說說,registergesturerecognizer就是用...
深入理解Qt訊號槽
訊號槽機制是觀察者模式的一種應用,達到訂閱 發布的效果。與之類似的有c 中的委託機制,只是寫法有所不同。訊號槽實現的主體是connect函式,常有兩種寫法 利用signal slot巨集和使用 類名 函式的結構 需要注意connect除了可以連線訊號和槽,還可以連線訊號與訊號 單個訊號與多個槽 多個...
深入理解系統呼叫
一.實驗要求 二.實驗環境搭建 1.安裝開發工具 sudo apt install build essential sudo apt install qemu install qemu sudo apt install libncurses5 dev bison ex libssl dev libe...