1、背景
在軟體開發中,如何做到低成本並能快速高質量交付,一直是各個軟體公司追求的目標。下面從純技術角度談談這個話題。
我們知道在物件導向設計中,是有一些設計原則要遵循的。例如要軟體設計目標:正確性,健壯性,高擴充套件,高復用,高效性。
假如我們交付5個產品中,每個產品**復用度達到90%和0%復用,我們分別計算成本,假設每個專案100w成本(計算公式先用最簡單,實際會有些差異)
0%復用的,總成本=100+100+100+100+100=500w
90%復用的,總成本=100+10+10+10+10=140w
從上述資料可以看到,復用度是影響成本乙個非常重要的因數。復用度越高,復用的專案數量越多,節約成本就越多,所以上述設計目標最終折射到商業行為中就是如何最大程度節約開發成本。
在上述指導思想下,我們公司開發產品,都是元件化開發,通過應用工廠把各個業務組裝起來。以元件(業務劃分的乙個單元)為顆粒進行復用。組裝過程中,其實就是對業務屬性和業務之間呼叫進行配置化。這樣帶來乙個新的問題:不同產品頁面呈現差異性不大,如何滿足同乙個業務不同呈現需求,同時又要復用同乙個業務元件,就是下面講述要解決的問題。
2、解決方案
2.1 方案設計
最直接的想法是,在業務元件中為不同的產品開發不同的介面。但是當這個業務元件被200產品復用,要開發200個頁面?這個業務元件專案組人力是有限的情況下,同時來20個優先順序很高的需求,這個元件專案團隊在人力估計就無法支援了。
我們面臨三個問題要解決:
1、最小成本開發自定義介面。
2、這個自定義介面可以由外面的團隊開發。
3、被復用的元件如發布新版本,不能影響其它團隊對其已經開發自定義介面。
解決思路就是:對原來的業務元件(宿主業務元件)進行mvp改造,把mp抽取出來進行復用,v只是很薄一層,純粹和介面呈現有關(和業務無關),可以由其它團隊(擴充套件業務元件)自定義開發v部分。宿主業務元件和擴充套件業務元件**無直接耦合,並且擴充套件業務元件能復用宿主業務元件中p部分。從這個思路出發,我們設計了如下的架構:
在這個架構中,宿主業務元件和擴充套件業務元件地位是平等的,都是能被元件管理器管理,宿主元件已經是mvp改造,擴充套件業務元件中自定義介面通過動態**機制復用宿主業務元件的業務邏輯。
2.2 類圖
2.3 實現
2.3.1 應用工廠機制簡述
由於自定義擴充套件頁面機制是在元件化上面實現,因此這邊大概介紹一下元件化相關知識。
元件化開發流程:
1、具體就是各個業務團隊把業務**按照一定規範封裝成業務元件。
2、並在乙個地方可以定義發布這個業務元件,包括屬性,提供頁面,事件等。
3、應用配置人員在應用編輯器(顆粒就是業務元件),配置業務元件屬性,以及頁面之間跳轉關係等。
4、打包應用。
2.3.1.1 時序圖元件化開發時序圖:
1、業務開發人員把自己業務包裝乙個業務元件,並經過qa測試和發布。
2、應用配置人員登入拼裝門戶後建立產品(如已經建立直接選定)。
3、開啟編輯器對應用進行編輯(新增業務元件,修改業務元件屬性,配置頁面路由等)
4、配置完成儲存,觸發構建(構建是統一構建伺服器)
5、打包完成,qa可以在拼裝門戶獲取包並測試,如測試通過就審核,通知產品經理發布。
應用工廠初始化時序圖
1、使用者開啟應用
3、協議初始化(我們支援混合開發,有原生協議,h5協議,rn協議)每個協議管理不同型別業務元件生命週期。
4、每種協議初始化會把相應型別業務元件初始化。
5、所有元件初始化完成,框架就會根據配置好的頁面路由,開啟介面。
啟動頁面跳轉時序圖
這個是開啟應用頁面時序圖:
1、開啟應用,根據應用配置(如安卓規定的配置首介面)開啟歡迎介面。
3、然後通過框架啟動頁面,框架根據頁面位址,呼叫相應的業務元件開啟頁面。
2.3.2 自定義擴充套件頁面實現
2.3.2.1 各個模組改造點
1、提供**幫助類
2、儲存宿主業務元件和擴充套件業務元件頁面擴充套件對映關係。
3、元件生命週期管理和頁面跳轉路由(這個不是當前敘述重點,這邊就不展開)
宿主業務元件要實現:
1、在其業務元件定義中申明該頁面支援擴充套件。
2、要擴充套件的頁面進行mvp改造。
5、公布自定義擴充套件頁面開發文件。
擴充套件業務元件要實現:
1、在其業務元件業務定義申明中,對宿主元件某個頁面擴充套件。
2、按宿主業務元件提供文件定義iview和ipresenter介面。
2.3.2.2 編輯器配置變更
在配置的時候配置指定擴充套件頁面。
1、假如目前有2個擴充套件業務元件對微博的預設介面做了擴充套件。
2、在編輯器的時候,要在微博業務元件預設介面選擇對其擴充套件的頁面。
2.3.2.2 頁面跳轉流程變更
上述是實際頁面路由過程
1、假設現在是開啟微博頁面
2、框架會呼叫微博業務元件入口類gopage方法,引數攜帶相關資訊。
3、微博業務元件通過框架方法獲取擴充套件頁面資訊。
4、如擴充套件業務元件是配置延遲初始化,這時候就把它初始化。
5、微博元件就根據擴充套件業務元件介面頁面資訊,啟動擴充套件頁面。
2.3.2.3 初始化例項變更
該時序圖描述頁面路由過程例項建立時序:
1、框架呼叫宿主業務元件開啟介面。
2、宿主業務元件根據傳入的引數去**幫助類獲取真實的頁面資訊。(有可能是擴充套件頁面)
3、**幫助類最終向擴充套件業務元件獲取真實頁面資訊
4、宿主業務元件獲取真實的頁面資訊。
5、宿主業務元件呼叫系統方法建立頁面。
6、頁面被建立的時候,呼叫框架**幫助類獲取presenter例項控制代碼。(自己頁面例項作為乙個引數)
7、**幫助類呼叫宿主業務元件建立presenter例項。
8、presenter在建立過程,根據傳入頁面物件呼叫**幫助類建立iview介面例項。
9、擴充套件頁面獲取到ipresenter例項以後就可以呼叫它處理業務。
2.4 注意事項
1、宿主提供說明文件,直接提供介面定義並去掉包名,這樣擴充套件元件可以直接用,不容易出錯。2、宿主在對介面維護,只能增加,不能修改和刪除原有已經公布出去的介面。3、宿主在原有介面增加方法,對擴充套件無影響,擴充套件元件要視情況決定是否要補齊功能。
自定義擴充套件點
外掛程式開發久了,難免遇到需要自定義擴充套件點的需求,那麼如何自定義擴充套件點呢?以編寫乙個快捷選單項為例,說明如下 假設終端使用者可通過如下配置來擴充套件快捷選單項 com.kdevn.test.mypopupmenus label mynewaction class com.kdevn.test...
QML自定義元件實現(擴充套件外掛程式)
qml 的元件 控制項 已經有很多了,在安裝目錄的qml下。例如 c qt qt5.12.0 5.12.0 mingw73 64 qml或者 c qt qt5.12.0 5.12.0 msvc2015 64 qml 最常用的是 qtquick和qtquick2.那麼,如何自定義新增的庫呢?比如想自己...
自定義擴充套件Repeater控制項
repeater控制項主要用於顯示資料,因為具有良好的擴充套件性和自由性,被大量使用顯示資料。1 自定義控制項的建立和使用 本次主要講訴繼承現有的控制項,非完全自定義的控制項。該種控制項的建立和使用分為3個步驟,第一步 自定義類,繼承現有的控制項 第二步 在網頁上註冊 第三步 使用。1 自定義類 2...