說組件化的結(jié)構(gòu),是指整個項目工程使用組件化模式開發(fā)時,整個項目中包含的所有組件結(jié)構(gòu)。而不是指某一個組件工程的結(jié)構(gòu)。某一個組件工程的結(jié)構(gòu),理論上我們是不用關(guān)心的,但是為了代碼風(fēng)格統(tǒng)一,我們可以做一些要求。
組件顆粒度
那么,問題來了,一個項目應(yīng)該怎么拆分組件呢?拆分多少個組件合適呢?按照什么標(biāo)準(zhǔn)進行組件的拆分呢?
這個問題只是拋出來,我不作回答。因為這個涉及到組件劃分顆粒度的問題。這個顆粒度的把握,是需要沉淀的。對組件劃分的太細(xì)會導(dǎo)致項目過于分散,劃分粒度太大會引起項目組件臃腫。項目都是有一個發(fā)展過程的,組件也一樣。所以,不斷進行重構(gòu)是掌握這個組件細(xì)化程度的最好方式。
但是,工作還是要進行,那么項目開始時,必須要定一個顆粒度!我的原則是:
? 抽出業(yè)務(wù)之外,即:不依賴業(yè)務(wù)的UI或方法函數(shù),規(guī)劃出不同的組件;
? 按需求業(yè)務(wù),完成一個業(yè)務(wù)流程的,當(dāng)成一個組件開發(fā)。若業(yè)務(wù)流程冗長且有分支的,可從分支處拆分成多個組件開發(fā);
這只是雛形,還是需要組件重構(gòu)沉淀出更好的顆粒度劃分。
不管組件的顆粒度是大還是小,項目中組件必須是有層級結(jié)構(gòu)的。有層級就表示了會有依賴,所以說項目組件化也是無法避免依賴關(guān)系的。準(zhǔn)確來說是,項目組件化避免的是業(yè)務(wù)之間依賴,因為不同業(yè)務(wù)屬于同一層級。我們定義同一層級的組件之間是不可以存在依賴關(guān)系的。
那么,該如何定義組件的層級結(jié)構(gòu)呢?
我們是這樣定義的:
首先,組件庫分為五大部分:業(yè)務(wù)模塊層、中間件層、部件層、定制層、基礎(chǔ)層。
依賴關(guān)系是這樣的:
? 業(yè)務(wù)模塊層 → 中間件層
? 業(yè)務(wù)模塊層 → 部件層→ 定制層→ 基礎(chǔ)層
這樣的依賴關(guān)系呈現(xiàn),大家應(yīng)該明白越向下底層的組件應(yīng)該盡量少量的更改,因為你的任何一次更改都將會影響到很多業(yè)務(wù)組件或很多部件。
我從由低至高的層級關(guān)系進行解釋:
基礎(chǔ)層
可以這樣定義基礎(chǔ)層,這一層的組件擁有以下特點:
? 可以用于其他項目工程;
? 組件里的方法必須考慮周全;
? 不應(yīng)該任何的業(yè)務(wù)邏輯;
在我的架構(gòu)中,基礎(chǔ)層現(xiàn)在包括了 網(wǎng)絡(luò)庫、工具庫、語言國際化。關(guān)于網(wǎng)絡(luò)庫,采用的是離散式網(wǎng)絡(luò)請求,接口對象化之后給業(yè)務(wù)調(diào)用提供靈活性,工具庫包括對系統(tǒng)工具庫的淺層封裝、第三方平臺SDK、第三方工具庫;語言國際化庫,放在最底層,是因為任何UI相關(guān)的都會涉及到語言國際化的問題。語言國際化庫中,對外提供的方法是穩(wěn)定,但是其中的國際化字符的key value是一直在增加的,因為外部調(diào)用是沒發(fā)生變化的,所以這里的內(nèi)部變化對上層的組件不會有大的影響。當(dāng)然需要對語言國際化有很好很嚴(yán)謹(jǐn)?shù)墓芾頇C制,不然會內(nèi)部紊亂的。
定制層
顧名思義,定制層就是針對項目定制的組件層。準(zhǔn)確地說是,項目基礎(chǔ)定制層。
在我的架構(gòu)中,定制層目前包括 項目環(huán)境配置庫、****App****風(fēng)格****UI****庫。
項目環(huán)境配置庫,主要用于:1、配置項目不同開發(fā)環(huán)境的請求地址;2、配置第三方平臺AppKey;
App風(fēng)格UI庫,我認(rèn)為一般稍成熟的App,UI那邊都會有一套自己的UI風(fēng)格。比如說:幾種字體、幾種顏色、幾種按鈕、幾種標(biāo)簽、幾種cell。是的,App風(fēng)格UI庫就可以封裝這些東西,這個庫的使用率越高,你的App風(fēng)格就會越統(tǒng)一。
部件層
多業(yè)務(wù)會使用+ 相對固定的UI + 需要接口請求+ 不摻雜業(yè)務(wù)邏輯。是的,我們可以從這幾個維度去定義一個部件組件。比如:上傳圖片組件、選擇地域地址組件、支付組件、分享組件。
中間件
它的存在就是為了業(yè)務(wù)組件,它的作用:
1、解除所有業(yè)務(wù)組件之間可能存在的耦合;
2、將App生命周期事件分散到所有業(yè)務(wù)組件中處理;
業(yè)務(wù)層
這一層其實沒什么好說的。在組件化思維中,這一層主要要考慮的是如何使用中間件,需要中間件做什么。在做一個業(yè)務(wù)組件初期一般需要考慮四個問題:
1、這個組件是否需要傳參才能被創(chuàng)建;
2、這個組件是否需要告訴調(diào)用方某個值(比如說狀態(tài));
3、這個組件是否需要在發(fā)生什么事件或變化時,需要其他業(yè)務(wù)知曉的;
4、這個組件有幾個入口;
這四個問題的解決都是要通過中間件來解決的。是的,中間件可以解決掉!
總結(jié):開發(fā)者銘記三點
1 不可出現(xiàn)反向依賴,只能上層依賴下層,不可反之
2 所有上層組件都能對下層組件充分利用使用,達到最大化的代碼復(fù)用!
3 腦中始終需要有組件分層架構(gòu)圖,明確自己所做組件屬于哪一層