? ? 全無設(shè)計的代碼會將數(shù)據(jù)一股腦的扔到一個結(jié)構(gòu)或類中谣旁,最終導(dǎo)致上帝類床佳,超長的函數(shù)和超長的文件的出現(xiàn)。這樣的實現(xiàn)是難以擴展榄审,難以應(yīng)對變化的砌们。如果你的系統(tǒng)并不需要擴展,那怎么寫都行搁进。同時不需要擴展的系統(tǒng)一般意味著它基本沒有價值浪感。
分工帶來能力提升
? ? 分解系統(tǒng),使之有明確的分工和結(jié)構(gòu)饼问,看起來使系統(tǒng)變得復(fù)雜影兽,但這種復(fù)雜性是系統(tǒng)功能增強的必要的代價。人類社會和軟件架構(gòu)一樣莱革,復(fù)雜的社會結(jié)構(gòu)(政治經(jīng)濟法律)和愈加細化分工帶來生產(chǎn)力的大發(fā)展峻堰;拆分明晰/組合靈活/層次清楚的軟件結(jié)構(gòu)也能帶來軟件能力的大幅提升讹开,這種能力就是軟件更容易響應(yīng)變化(或者說降低變動成本)。
? ? 另一個角度看捐名,如果一個系統(tǒng)完成的功能足夠復(fù)雜旦万,那它的本質(zhì)復(fù)雜度就很高。這種本質(zhì)復(fù)雜度要通過某種明確的結(jié)構(gòu)展現(xiàn)出來镶蹋,才有可能被有效管理成艘。就好像人群,了解每個人的能力特長性格愛好等等信息贺归,給每個人建檔才能做到精細的組織管理淆两。當(dāng)然,你如果只是要這群人去挖白波運河(好比斯大林同志當(dāng)年干的)牧氮,那給每個人一個編號就夠了琼腔。
拆分的依據(jù)
? ? 系統(tǒng)拆分的拆分,首先應(yīng)該選擇一個明確的踱葛,預(yù)先定義的骨架結(jié)構(gòu)。預(yù)先定義是指骨架設(shè)計的原則應(yīng)該是討論明確成文的光坝,且骨架結(jié)構(gòu)不同維度上元素列表應(yīng)該在架構(gòu)層面被定義出來尸诽。基于這個結(jié)構(gòu)盯另,我們才能對系統(tǒng)中的數(shù)據(jù)和行為做一致性的拆分性含。一致性指 data/behavior之間的一致性,以及開發(fā)者之間理解的一致性鸳惯。
? ? 假設(shè)已經(jīng)設(shè)定系統(tǒng)有 <module>和<feature>兩個維度作為骨架結(jié)構(gòu)商蕴,并且已經(jīng)給出了<M>和<M>的list,那么data拆分的最大粒度就應(yīng)該是一個<m芝发,f>的交點绪商。
WHY FEATURE
? ? Feature是一個用戶視角的概念,用戶可以單獨使用或者購買某個feature辅鲸。系統(tǒng)開發(fā)早期格郁,我們往往希望按feature來拆分module,但最終一定會出現(xiàn)某些或者很多feature會波及多個module独悴。Feature之間沖突了例书。一個現(xiàn)實是,系統(tǒng)經(jīng)常被使用的feature可能只占整個feature集合的一小部分刻炒,二八原則在這里仍然成立决采。想想你怎么用微信或者vscode?feature集合一天天長大坟奥,帶來的問題很多树瞭,缺乏設(shè)計的代碼中拇厢,出現(xiàn)了大量重復(fù)和復(fù)雜的判斷條件,內(nèi)存開銷急劇增加移迫,系統(tǒng)性能逐漸惡化旺嬉。性能惡化對于pc和手機app可能還不是個致命問題,你不太關(guān)心今天的游戲和軟件能不能跑在五年前的機器上厨埋,但有些場景可能會是致命的問題邪媳,比如電信設(shè)備,比如機載車載系統(tǒng)荡陷。這些硬件的生命周期可能會在10年以上雨效。
數(shù)據(jù)和基礎(chǔ)行為的一致性
? ? feature可以被關(guān)掉,意味著它對應(yīng)的數(shù)據(jù)和行為都可以被有條件的忽略废赞。忽略的前提是徽龟,需要將它們拆分出來,并提供合適的訪問形式唉地。接口訪問是基礎(chǔ)据悔,不要暴露實現(xiàn)。更好的是封裝行為耘沼,數(shù)據(jù)通過行為展示其功用极颓。?
? ? 拆分后的data應(yīng)該只為一個<m,f>點服務(wù)群嗤,這是data使用的條件菠隆,feature關(guān)閉的時候依賴它的data就不應(yīng)該被訪問。Module存在公用數(shù)據(jù)狂秘,也存在大量有條件的數(shù)據(jù)骇径。一個基礎(chǔ)行為(bbhv)訪問若干data,這個bbhv可用的條件就是它涉及的所有data使用條件的并集者春。好的bbhv的拆分破衔,它的使用條件應(yīng)該足夠簡單,也盡量只為一個<m碧查,f>點服務(wù)运敢。一個bhv在不同feature中有不同的實現(xiàn),這時就需要借助abstract behavior機制了忠售。
總結(jié)
? ? 總結(jié)一下传惠,要管理復(fù)雜度提升擴展性就應(yīng)該對系統(tǒng)進行拆分,拆分之前要先給出骨架結(jié)構(gòu)稻扬。<M,F>是一種可行的結(jié)構(gòu)(完整的結(jié)構(gòu)模型另文描述)卦方。依據(jù)此結(jié)構(gòu)拆分的data和behavior使用條件應(yīng)滿足一致性。
? ?