前言
組件化與模塊化已經深入體現到軟件開發當中,也是為了讓開發者更好的去解決軟件上的高耦合、低內聚、無重用的3大代碼問題。網上有很多相關內容的介紹文章,各個作者都有自己的一些想法或者總結,看得比較亂,在實踐過程中也存在不少疑惑,很多時候不知道選擇用組件還是模塊,或者有時候根本分不清自己這得是組件還是模塊。所以寫了下這篇文章,對組件化、模塊化、插件化進行一個詳細的講解,希望小伙伴都可以更了解這三者的區別。
單工程模式
再介紹組件化,模塊化、插件化之前,我們不得不說下單工程模式,移動開發誕生之初,我們開發移動項目,我相信大多用的是單工程單任務的開發模式,new Project——>分包——>寫起。大家應該都經歷過這個過程,寫起來也比較簡單,這種模式不涉及亂七八糟的處理方式, 上手快,開發快,足夠敏捷。這是因為Mobile Project 剛起步,項目都偏小,一些附加業務還沒綁到App上,而隨著后期手機應用的發展,項目越來越大,功能越來越多,隨之而產生了組件化和模塊化等概念。
后面Android Studio出來了,多出來了一個新的概念,Project, Module… 模塊;當時以包的形式分離的公共包common,現在成了AS中的Module。大家都知道,Module包含兩種格式: application,library。也就是說,一個Module就是一個小的項目,也是AS概念中的模塊。因此我們開始設計common模塊common_business模塊,甚至db模塊。模塊的好處是什么? 相比于包來講,模塊更靈活,耦合更低,隨意插拔,想引入哪個就引入哪個。根據不同的關注點,將一個項目的可以共享的部分抽取出來,形成獨立的Module,就是模塊化。模塊化不只包含公共部分,當然也可以是業務模塊。
組件化
基于組件的軟件工程 (CBSE) 也稱為基于組件的發展 (CBD),是軟件工程的一個分支,它強調在給定軟件系統中提供的廣泛功能方面的關注點分離。它是一種基于重用的方法,用于定義、實現和組合松散耦合的獨立組件到系統中。這種做法旨在為軟件本身和贊助此類軟件的組織在短期和長期帶來同樣廣泛的利益。
簡單來說就是:組件化就是基于可重用為目的的,將一個大的軟件系統按照分離關注點的形式,拆分多個獨立的組件,減少耦合。
就是“基礎庫”或者“基礎組件",意思是把代碼重復的部分提煉出一個個組件供給功能使用
使用:Dialog,各種自定義的UI控件、能在項目或者不同項目重復應用的代碼等等
目的:復用,解耦
依賴:組件之間低依賴,比較獨立
架構定位:縱向分層(位于架構底層,被其他層所依賴)
特點:從UI界面的角度進行劃分,前端的組件化,方便UI組件的重用
模塊化
模塊化編程是一種軟件設計技術,強調將程序的功能分離為獨立的可互換模塊,因此每個模塊都包含僅執行所需功能的一個方面所需的一切。
簡單來說就是:模塊化是將功能拆分,分成相互獨立的模塊,以便于每個模塊只包含與其自身功能相關的內容。
就是"業務框架"或者“業務模塊",也可以理解為“框架”,意思是把功能進行劃分,將同一類型的代碼整合在一起,所以模塊的功能相對復雜,但都同屬于一個業務
使用:按照項目功能需求劃分成不同類型的業務框架(例如:注冊、登錄、運動、商城等.....)
目的:隔離/封裝 (高內聚)
依賴:模塊之間有依賴的關系,可通過路由器進行模塊之間的耦合問題
架構定位:橫向分塊(位于架構業務框架層)
特點:從代碼邏輯的角度進行劃分,方便代碼分層開發,保證每個功能模塊的職能單一
插件化
插件化嚴格意義來講,其實也算是模塊化的觀念。將一個完整的工程,按業務劃分為不同的插件,都是分治法的一種體現。化整為零,相互配合。越小的模塊越容易維護,插件化按理也算是模塊化的一種體現,和組件化就不是一個概念了。
組件化的單位是組件(module)
插件化的單位是apk(一個完整的應用)
組件化實現的是解耦與加快編譯, 隔離不需要關注的部分
插件化實現的也是解耦與加快編譯,同時實現熱插拔也就是熱更新
組件化的靈活性在于按加載時機切換,分離出獨立的業務組件,比如微信的朋友圈
插件化的靈活性在于是加載apk, 完全可以動態下載,動態更新,比組件化更靈活
組件化能做的只是, 朋友圈已經有了,我想單獨調試,維護,和別人不耦合,但是和整個項目還是有關聯的
插件化可以說朋友圈就是一個app, 我需要整合了,把它整合進微信這個大的app里面
組本來就是一個系統,你把微信分為朋友圈,聊天, 通訊錄按意義上劃為獨立模塊,但并不是真正意義上的獨立模塊
插本來就是不同的apk, 你把微信的朋友圈,聊天,通訊錄單獨做一個完全獨立的app, 需要微信的時候插在一起,就是一個大型的app了
插件化的加載是動態的,這點很重要,也是靈活的根源。
總結
組件化是基于重用,減少耦合;
模塊化是根據功能模塊的不同而拆分的;
插件化是將一個完整的工程,按業務劃分為不同的插件。
其實組件相當于庫,把一些能在項目里或者不同類型項目中可復用的代碼進行工具性的封裝。
而模塊相應于業務邏輯模塊,把同一類型項目里的功能邏輯進行進行需求性的封裝。
其實從定義中可以看出,“組件” 更注重于代碼的“復用”。 “模塊” 更注重與一塊業務能力的完整性。
組件、模塊其實是從不同的角度來劃分一個app。 組件更多的是從自下而上的視角,按照技術實現的思維劃分實現代碼,并將這些代碼組裝成一個app。 模塊更多的是從自上而下的視角,按照業務劃分實現代碼。
組件化、模塊化的目的都是針對復雜app,降低其復雜性,提升開發效率和質量。只是劃分的角度略有不同。