国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

大神總結(jié)的App重構(gòu)經(jīng)驗

2019-11-09 16:34:09
字體:
供稿:網(wǎng)友

最近跟一個朋友聊到關(guān)于App架構(gòu)的問題, 其中就聊到一個App, 開發(fā)了很長時間, 一開始沒有去想框架的事兒, 迭代過程中, 由于時間緊, 任務(wù)重, 人員更替等原因, 也沒能保證代碼質(zhì)量, 很多設(shè)計原則被拋之腦后, 代碼質(zhì)量逐步下降, 以致難于閱讀, 難于維護. 進而導(dǎo)致迭代困難, 而形成惡性循環(huán).

從而引申出如何重構(gòu)App代碼的話題, 談點個人理解:

什么情況下需要重構(gòu)

1, 結(jié)構(gòu)錯亂

代碼無法分出層次, 無法分清業(yè)務(wù)線.

各個業(yè)務(wù)模塊間/層次間的代碼互相夾雜.

由于多人協(xié)作導(dǎo)致的多種架構(gòu)(MVP/MVVM/MVC等)并存.

規(guī)范性問題, 導(dǎo)致各個模塊內(nèi)的代碼形式互相不一致, 風(fēng)格迥異.

2, 可讀性差

超長函數(shù), 超大類

代碼的格式不規(guī)范或不一致.

冗余代碼, 無用代碼, 重復(fù)代碼.

過于高明, 使用一些不常用的小技巧而且沒有相關(guān)注釋.

濫用繼承, 接口實現(xiàn)等, 導(dǎo)致難以跟蹤.

3, 不能很好的適應(yīng)產(chǎn)品的發(fā)展

維護困難, 前一發(fā)動全身.

不具備擴展靈活性, 無法很快引入系統(tǒng)版本更新時新特性.

不具備可變更性, 產(chǎn)品添加新功能或修改需求時需要修改大量的代碼.

重構(gòu)的目標

重構(gòu)的目的就是要提高代碼質(zhì)量, 而高質(zhì)量的代碼指標個人認為有如下幾點, 當然其實也是老生常談的幾點.

排名分先后:

1, 可讀性

規(guī)范一致性.

結(jié)構(gòu), 層次明了.

命名有含義, 注釋要清晰.

邏輯簡短, 沒有長篇大幅的代碼塊.

方法提取, 類繼承關(guān)系合理.

不濫用設(shè)計模式.

聰明是可讀性的敵人.

2, 可維護性

杜絕魔鬼數(shù)字/字符串/尺寸值/顏色值等

代碼復(fù)用, 以便維護.

不寫死, 預(yù)測可能的變化(但不要提前設(shè)計).

3, 可擴展性

良好的分層結(jié)構(gòu), MVx模式運用.

通過一些設(shè)計模式的使用來提高可擴展性.

開閉原則: 修改關(guān)閉, 擴展開放.

如何重構(gòu)

首先讓我們重溫下"重構(gòu)"的含義:

<<重構(gòu) --- 改善既有代碼的設(shè)計>> 這本大神作品強烈建議大家翻閱下~ 里面對重構(gòu)的定義, 以及如何從一個個小的Bad Smell開始重構(gòu)等都有詳細的描述.

那么作為一個進行已久的Android工程, 我們應(yīng)該如何重構(gòu)呢?其實這是一個對癥下藥的問題, 針對為什么要重構(gòu)提出的幾個代碼問題, 重構(gòu)也可以分成以下幾步:

1, 架構(gòu)選擇, 結(jié)構(gòu)調(diào)整

根據(jù)App的業(yè)務(wù)場景(展示型, 交互型, 后臺工具型...)選擇合適的架構(gòu).

并不是說一定要選用一個架構(gòu), 比如說后臺工具型的App, 可能界面不多, 也服務(wù)器的交互也少, 基本是由Service組成, 可能直接用Android原生的結(jié)構(gòu)就可以.

界面較多, 且與服務(wù)器交互較多的建議選用MVP架構(gòu). 可以通過P來做數(shù)據(jù)處理, 將數(shù)據(jù)源M與展示層V解耦, 便于替換數(shù)據(jù)源或是改變UI.

根據(jù)選用的架構(gòu)以及業(yè)務(wù)模塊分包

2, 技術(shù)/開源庫選定

ListView/RecyclerView的選擇, Fragment/Activity的選擇等.

根據(jù)業(yè)務(wù)特點和選擇的架構(gòu), 選用相關(guān)技術(shù)/開源庫支持或?qū)Ξ斍笆褂玫倪M行整理.

例如HTTP請求庫, 緩存庫, 圖片加載庫等等.

3, 確定規(guī)范

制定編碼規(guī)范, 可以根據(jù)Google推薦的java編碼規(guī)范, 適當定制.例如我的項目中的基本規(guī)范.

制定代碼提交規(guī)范, git flow管理流程規(guī)范等.

4, 自底而上, 由小至大

從底部開始, 也就是常說的Model層,數(shù)據(jù)層開始, 因為這部分相對獨立, 可以通過提供接口與UI層隔離.

不要一下就大面積重構(gòu), 需要逐個小的case進行重構(gòu)驗證, 保證當前運行.

5, 持續(xù)重構(gòu), 伴隨測試

持續(xù)進行小的重構(gòu), 每次重構(gòu)需要伴隨測試, 保證重構(gòu)結(jié)果.

提取方法, 去除重復(fù)代碼.

結(jié)構(gòu)調(diào)整.

融入面向?qū)ο?接口編程思想, 注意SOLID原則.

多用組合, 少用繼承

......

最好有單元測試支持.

6, 重構(gòu)而非重寫

不到萬不得已不要想重寫.

重寫會產(chǎn)生各種意想不到的問題, 諸如設(shè)計過度, 對于當前代碼把握不夠(例如現(xiàn)在看起來很不友好的代碼可能就是為了解決一個架構(gòu)無法解決的問題等).


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 韶关市| 陇西县| 磐安县| 梁河县| 景宁| 崇明县| 宁化县| 北宁市| 大关县| 鄂尔多斯市| 舟曲县| 怀来县| 容城县| 石泉县| 陇南市| 刚察县| 桐梓县| 盈江县| 天等县| 禹州市| 巴中市| 来凤县| 即墨市| 宜阳县| 昭苏县| 樟树市| 庆元县| 屏东县| 顺义区| 淮滨县| 北流市| 清涧县| 高尔夫| 衡东县| 株洲县| 都昌县| 海晏县| 桐柏县| 新乐市| 汤阴县| 敦煌市|