前言
背景
云盤產(chǎn)品端蛆,文件模塊的業(yè)務(wù)功能相對復(fù)雜,包含文件的顯示酥泛、排序今豆、篩選嫌拣、加密隱藏、批量移動(dòng)復(fù)制等功能晚凿。項(xiàng)目代碼可以追溯到14年以前亭罪,中間也有N多人的接手,目前還是存在非常多問題歼秽,維護(hù)及擴(kuò)展也是相對比較吃力应役。
最近由于產(chǎn)品功能正在策劃,大約有一周時(shí)間可以對項(xiàng)目進(jìn)行優(yōu)化燥筷。故決定對文件模塊進(jìn)行梳理重構(gòu)箩祥。在開始之前,這里先拋出幾個(gè)問題肆氓,相信大部分的同學(xué)也可能有類型的疑問袍祖,在文末的終結(jié)也會(huì)談一下自己的看法。
- 業(yè)務(wù)需求頻繁谢揪,開發(fā)功能都來不及蕉陋,哪里有時(shí)間進(jìn)行代碼重構(gòu)
- 公司并不看重代碼質(zhì)量,首先要滿足功能開發(fā)拨扶。重構(gòu)這個(gè)事情凳鬓,做了也不一定被認(rèn)同。等一下重構(gòu)后患民,產(chǎn)生新的問題缩举,后果更嚴(yán)重
- 這代碼改起來真是蛋疼,好幾個(gè)類功能都一樣匹颤,新增或者修改都需要改幾個(gè)地方仅孩。但是沒辦法,為了趕時(shí)間印蓖,暫時(shí)先這么干吧
- 想重構(gòu)辽慕,但是卻不知道如何下手。有時(shí)候有點(diǎn)空閑的時(shí)間另伍,又感覺不夠鼻百。所以一直沒有動(dòng)
文件模塊情況
簡單類關(guān)系圖
這里簡單介紹一些文件模塊目前的一些問題。先看一些類的關(guān)系圖摆尝。
類說明
類 | 說明 |
---|---|
MyFileFragment | 顯示文件及文件操作的Fragment |
FileMainActivity | 文件主頁面,依賴MyFileFragment |
BaseList2Activity | 文件列表基類因悲,顯示文件 |
MyFileActivity | 作用和MyFileFragment相同堕汞,全局很多跳轉(zhuǎn)到文件頁面都是使用該類,繼承了BaseList2Activity |
DiskMusicActivity | 音樂模塊,從網(wǎng)盤導(dǎo)入音樂文件晃琳,是一個(gè)提供音樂文件選擇頁面讯检,繼承了MyFileActivity |
AddAttachmentActivity | 聊天模塊琐鲁,從網(wǎng)盤選擇圖片,是一個(gè)提供圖片文件選擇頁面人灼,繼承了MyFileActivity |
DiskSearchActivity | 文件搜索頁面围段,繼承了MyFileActivity |
FileListBaseFragment | 文件展示頁面,與BaseList2Activity類似 |
FileChooseActivity | 網(wǎng)盤文件選擇頁面投放,是一個(gè)提供選擇文件頁面奈泪,依賴FileListBaseFragment |
主要存在問題
在項(xiàng)目的開發(fā)維護(hù)工程中,主要存在的地方如下:
1灸芳、存在多個(gè)功能相似的頁面涝桅,例如MyFileFragment及MyFileActivity,功能高度相同烙样。全局跳轉(zhuǎn)到文件頁面使用了MyFileActivity冯遂,文件主入口使用了FileMainActivity。由于歷史原因谒获,一直維護(hù)著2個(gè)類蛤肌,新增功能和修改功能都要維護(hù)2個(gè)地方
2、文件列表顯示存在多個(gè)類批狱,BaseList2Activity裸准、FileListBaseFragment、MyFileFragment
3精耐、文件選擇也有多個(gè)頁面狼速,音樂選擇一個(gè)DiskMusicActivity、圖片選擇一個(gè)AddAttachmentActivity卦停、還有附件選擇一個(gè)FileChooseActivity
經(jīng)常出現(xiàn)產(chǎn)品加一個(gè)功能向胡,要幾個(gè)類修改,并且有時(shí)候修Bug容易遺漏地方惊完。
重構(gòu)
思路
在準(zhǔn)備開始動(dòng)手重構(gòu)之前僵芹,先梳理了一下思路。
1小槐、先搞清楚目前存在問題拇派,哪里不爽。分析解決問題的方案
2凿跳、盡量不要?jiǎng)拥皆械臉I(yè)務(wù)邏輯件豌,著重于結(jié)構(gòu)的升級
3、分解重構(gòu)執(zhí)行步驟控嗜,盡量細(xì)化成小任務(wù)茧彤,每個(gè)任務(wù)不相互影響。由于時(shí)間有限疆栏,爭取每完成一個(gè)小步驟的重構(gòu)曾掂,都能達(dá)到上線的狀態(tài)
執(zhí)行
根據(jù)目前存在的問題及重構(gòu)思路惫谤。本次重構(gòu)主要解決3個(gè)大問題。
1珠洗、在項(xiàng)目中要干掉MyFileActivity溜歪,統(tǒng)一使用MyFileFragment。不要再同時(shí)維護(hù)2個(gè)相同的功能的類
2许蓖、統(tǒng)一文件列表的顯示蝴猪,避免出現(xiàn)多個(gè)顯示文件的類
3、全局應(yīng)該統(tǒng)一一個(gè)文件選擇的頁面蛔糯。避免出現(xiàn)選擇音樂一個(gè)界面拯腮、選擇圖片一個(gè)界面、選擇附件又一個(gè)界面
階段一
階段一主要有優(yōu)化處理1蚁飒、2點(diǎn)动壤。這里先上一下簡單類結(jié)構(gòu)關(guān)系圖
1、將MyFileActivity移除淮逻,新增BridgeFileActivity(繼承了FileMainActivity)琼懊,替代MyFileActivity。將全局文件跳轉(zhuǎn)統(tǒng)一替換到BridgeFileActivity爬早,BridgeFileActivity最終依賴了MyFileFragment哼丈。這樣將文件主要操作的代碼統(tǒng)一在了MyFileFragment,避免維護(hù)多個(gè)相同功能的類筛严。
2醉旦、將文件的基礎(chǔ)顯示都FileListBaseFragment中,MyFileFragment繼承于它桨啃。MyFileFragment擴(kuò)展文件的操作功能车胡。如刪除、復(fù)制照瘾、移動(dòng)匈棘、加密等功能
3、由于MyFileActivity的移除析命,原繼承于它的DiskMusicActivity主卫、DiskSearchActivity等都需要進(jìn)行改造。重新定義DiskMusicFragment鹃愤、DiskSearchFragment繼承于MyFileFragment簇搅。將原來的Activity依賴于新定義的Fragment。
至此完成第一階段软吐,對原業(yè)務(wù)都未進(jìn)行修改馍资。只是將跳轉(zhuǎn)入口進(jìn)行替換。成功移除了MyFileActivity关噪。解決上述問題1鸟蟹、2。
階段二
階段二主要優(yōu)化第三點(diǎn)使兔,并且重新命名類名建钥。同樣先上下簡單類結(jié)構(gòu)關(guān)系圖
1、對FileChooseActivity進(jìn)行擴(kuò)展虐沥,使用Builder模式進(jìn)行配置熊经,支持文件類型的篩選顯示。廢除DiskMusicActivity欲险、AddAttachmentActivity镐依。
音樂篩選頁面代碼跳轉(zhuǎn):
FileChooseActivity.IntentBuilder builder = new FileChooseActivity.IntentBuilder(this);
builder.setChoiceMode(ChoiceMode.MULTI)
.setEventBusFlag(Signature.signature(this))
.setShowLocalFileList(false)
.setYywSelectType(FileChoiceParams.MUSIC)
.setSupportCheckAll(true)
.launch();
圖片篩選頁面代碼跳轉(zhuǎn):
FileChooseActivity.IntentBuilder builder = new FileChooseActivity.IntentBuilder(this);
builder.setChoiceMode(ChoiceMode.MULTI)
.setEventBusFlag(Signature.signature(this))
.setShowLocalFileList(false)
.setMaxLimit(15)
.setYywSelectType(FileChoiceParams.PIC)
.setSupportCheckAll(false)
.launch();
總結(jié)
回到一開始拋出的問題,這里做一下自己的總結(jié)思考天试。
1槐壳、業(yè)務(wù)需求多,時(shí)間趕這是常態(tài)喜每,時(shí)間要靠自己規(guī)劃及提高效率擠出來务唐。在開發(fā)的時(shí)候也要充分考慮,不能盲目追求功能實(shí)現(xiàn)带兜。 一般項(xiàng)目上線后枫笛,新功能策劃都有一段空白期,善于利用
2刚照、不管公司重不重視代碼重構(gòu)刑巧。首先多思考、優(yōu)化重構(gòu)无畔,對自己也是一種提升啊楚。相信在重構(gòu)的過程,自己也可以有所收獲
3檩互、項(xiàng)目存在種種的歷史遺留問題特幔,有時(shí)候重構(gòu)與不重構(gòu)就是一個(gè)長痛和短痛的取舍。自己負(fù)責(zé)的模塊代碼不優(yōu)化闸昨,加需求蚯斯,改Bug,最終坑的還是自己
4饵较、項(xiàng)目重構(gòu)是不斷演化的過程拍嵌,沒有一蹴而就。