前言
組件化與模塊化已經(jīng)深入體現(xiàn)到軟件開(kāi)發(fā)當(dāng)中宠进,也是為了讓開(kāi)發(fā)者更好的去解決軟件上的高耦合晕拆、低內(nèi)聚、無(wú)重用的3大代碼問(wèn)題材蹬。網(wǎng)上有很多相關(guān)內(nèi)容的介紹文章实幕,各個(gè)作者都有自己的一些想法或者總結(jié),看得比較亂堤器,在實(shí)踐過(guò)程中也存在不少疑惑昆庇,很多時(shí)候不知道選擇用組件還是模塊,或者有時(shí)候根本分不清自己這得是組件還是模塊闸溃。所以寫(xiě)了下這篇文章整吆,對(duì)組件化、模塊化辉川、插件化進(jìn)行一個(gè)詳細(xì)的講解掂为,希望小伙伴都可以更了解這三者的區(qū)別。
單工程模式
再介紹組件化员串,模塊化勇哗、插件化之前,我們不得不說(shuō)下單工程模式寸齐,移動(dòng)開(kāi)發(fā)誕生之初欲诺,我們開(kāi)發(fā)移動(dòng)項(xiàng)目抄谐,我相信大多用的是單工程單任務(wù)的開(kāi)發(fā)模式,new Project——>分包——>寫(xiě)起扰法。大家應(yīng)該都經(jīng)歷過(guò)這個(gè)過(guò)程蛹含,寫(xiě)起來(lái)也比較簡(jiǎn)單,這種模式不涉及亂七八糟的處理方式塞颁, 上手快浦箱,開(kāi)發(fā)快,足夠敏捷祠锣。這是因?yàn)镸obile Project 剛起步酷窥,項(xiàng)目都偏小,一些附加業(yè)務(wù)還沒(méi)綁到App上伴网,而隨著后期手機(jī)應(yīng)用的發(fā)展蓬推,項(xiàng)目越來(lái)越大,功能越來(lái)越多澡腾,隨之而產(chǎn)生了組件化和模塊化等概念沸伏。
后面Android Studio出來(lái)了,多出來(lái)了一個(gè)新的概念动分,Project, Module… 模塊毅糟;當(dāng)時(shí)以包的形式分離的公共包common,現(xiàn)在成了AS中的Module。大家都知道澜公,Module包含兩種格式: application留特,library。也就是說(shuō)玛瘸,一個(gè)Module就是一個(gè)小的項(xiàng)目蜕青,也是AS概念中的模塊。因此我們開(kāi)始設(shè)計(jì)common模塊common_business模塊糊渊,甚至db模塊右核。模塊的好處是什么? 相比于包來(lái)講渺绒,模塊更靈活贺喝,耦合更低,隨意插拔宗兼,想引入哪個(gè)就引入哪個(gè)躏鱼。根據(jù)不同的關(guān)注點(diǎn),將一個(gè)項(xiàng)目的可以共享的部分抽取出來(lái)殷绍,形成獨(dú)立的Module染苛,就是模塊化。模塊化不只包含公共部分,當(dāng)然也可以是業(yè)務(wù)模塊茶行。
組件化
基于組件的軟件工程 (CBSE) 也稱為基于組件的發(fā)展 (CBD)躯概,是軟件工程的一個(gè)分支,它強(qiáng)調(diào)在給定軟件系統(tǒng)中提供的廣泛功能方面的關(guān)注點(diǎn)分離畔师。它是一種基于重用的方法娶靡,用于定義、實(shí)現(xiàn)和組合松散耦合的獨(dú)立組件到系統(tǒng)中看锉。這種做法旨在為軟件本身和贊助此類軟件的組織在短期和長(zhǎng)期帶來(lái)同樣廣泛的利益姿锭。
簡(jiǎn)單來(lái)說(shuō)就是:組件化就是基于可重用為目的的,將一個(gè)大的軟件系統(tǒng)按照分離關(guān)注點(diǎn)的形式伯铣,拆分多個(gè)獨(dú)立的組件呻此,減少耦合。
就是“基礎(chǔ)庫(kù)”或者“基礎(chǔ)組件"懂傀,意思是把代碼重復(fù)的部分提煉出一個(gè)個(gè)組件供給功能使用
使用:Dialog趾诗,各種自定義的UI控件蜡感、能在項(xiàng)目或者不同項(xiàng)目重復(fù)應(yīng)用的代碼等等
目的:復(fù)用蹬蚁,解耦
依賴:組件之間低依賴,比較獨(dú)立
架構(gòu)定位:縱向分層(位于架構(gòu)底層郑兴,被其他層所依賴)
特點(diǎn):從UI界面的角度進(jìn)行劃分犀斋,前端的組件化,方便UI組件的重用
模塊化
模塊化編程是一種軟件設(shè)計(jì)技術(shù)情连,強(qiáng)調(diào)將程序的功能分離為獨(dú)立的可互換模塊叽粹,因此每個(gè)模塊都包含僅執(zhí)行所需功能的一個(gè)方面所需的一切。
簡(jiǎn)單來(lái)說(shuō)就是:模塊化是將功能拆分却舀,分成相互獨(dú)立的模塊虫几,以便于每個(gè)模塊只包含與其自身功能相關(guān)的內(nèi)容。
就是"業(yè)務(wù)框架"或者“業(yè)務(wù)模塊"挽拔,也可以理解為“框架”辆脸,意思是把功能進(jìn)行劃分,將同一類型的代碼整合在一起螃诅,所以模塊的功能相對(duì)復(fù)雜啡氢,但都同屬于一個(gè)業(yè)務(wù)
使用:按照項(xiàng)目功能需求劃分成不同類型的業(yè)務(wù)框架(例如:注冊(cè)、登錄术裸、運(yùn)動(dòng)倘是、商城等.....)
目的:隔離/封裝 (高內(nèi)聚)
依賴:模塊之間有依賴的關(guān)系,可通過(guò)路由器進(jìn)行模塊之間的耦合問(wèn)題
架構(gòu)定位:橫向分塊(位于架構(gòu)業(yè)務(wù)框架層)
特點(diǎn):從代碼邏輯的角度進(jìn)行劃分袭艺,方便代碼分層開(kāi)發(fā)搀崭,保證每個(gè)功能模塊的職能單一
插件化
插件化嚴(yán)格意義來(lái)講,其實(shí)也算是模塊化的觀念猾编。將一個(gè)完整的工程门坷,按業(yè)務(wù)劃分為不同的插件宣鄙,都是分治法的一種體現(xiàn)∧觯化整為零冻晤,相互配合。越小的模塊越容易維護(hù)绸吸,插件化按理也算是模塊化的一種體現(xiàn)鼻弧,和組件化就不是一個(gè)概念了。
組件化的單位是組件(module)
插件化的單位是apk(一個(gè)完整的應(yīng)用)
組件化實(shí)現(xiàn)的是解耦與加快編譯锦茁, 隔離不需要關(guān)注的部分
插件化實(shí)現(xiàn)的也是解耦與加快編譯攘轩,同時(shí)實(shí)現(xiàn)熱插拔也就是熱更新
組件化的靈活性在于按加載時(shí)機(jī)切換,分離出獨(dú)立的業(yè)務(wù)組件码俩,比如微信的朋友圈
插件化的靈活性在于是加載apk, 完全可以動(dòng)態(tài)下載度帮,動(dòng)態(tài)更新,比組件化更靈活
組件化能做的只是稿存, 朋友圈已經(jīng)有了笨篷,我想單獨(dú)調(diào)試,維護(hù)瓣履,和別人不耦合率翅,但是和整個(gè)項(xiàng)目還是有關(guān)聯(lián)的
插件化可以說(shuō)朋友圈就是一個(gè)app, 我需要整合了,把它整合進(jìn)微信這個(gè)大的app里面
組本來(lái)就是一個(gè)系統(tǒng)袖迎,你把微信分為朋友圈冕臭,聊天, 通訊錄按意義上劃為獨(dú)立模塊燕锥,但并不是真正意義上的獨(dú)立模塊
插本來(lái)就是不同的apk辜贵, 你把微信的朋友圈,聊天归形,通訊錄單獨(dú)做一個(gè)完全獨(dú)立的app, 需要微信的時(shí)候插在一起托慨,就是一個(gè)大型的app了
插件化的加載是動(dòng)態(tài)的,這點(diǎn)很重要连霉,也是靈活的根源榴芳。
總結(jié)
組件化是基于重用,減少耦合跺撼;
模塊化是根據(jù)功能模塊的不同而拆分的窟感;
插件化是將一個(gè)完整的工程,按業(yè)務(wù)劃分為不同的插件歉井。
其實(shí)組件相當(dāng)于庫(kù)柿祈,把一些能在項(xiàng)目里或者不同類型項(xiàng)目中可復(fù)用的代碼進(jìn)行工具性的封裝。
而模塊相應(yīng)于業(yè)務(wù)邏輯模塊,把同一類型項(xiàng)目里的功能邏輯進(jìn)行進(jìn)行需求性的封裝躏嚎。
其實(shí)從定義中可以看出蜜自,“組件” 更注重于代碼的“復(fù)用”。 “模塊” 更注重與一塊業(yè)務(wù)能力的完整性卢佣。
組件重荠、模塊其實(shí)是從不同的角度來(lái)劃分一個(gè)app。 組件更多的是從自下而上的視角虚茶,按照技術(shù)實(shí)現(xiàn)的思維劃分實(shí)現(xiàn)代碼戈鲁,并將這些代碼組裝成一個(gè)app。 模塊更多的是從自上而下的視角嘹叫,按照業(yè)務(wù)劃分實(shí)現(xiàn)代碼婆殿。
組件化、模塊化的目的都是針對(duì)復(fù)雜app罩扇,降低其復(fù)雜性婆芦,提升開(kāi)發(fā)效率和質(zhì)量。只是劃分的角度略有不同喂饥。