在這一年的開發(fā)過程中役衡,從什么都沒有到現(xiàn)在的穩(wěn)定迭代段化,其中經(jīng)歷了多次的重構(gòu)工作嘁捷,這里來聊聊其中的一些看法。
我們的模塊显熏,從開始的剛好能夠滿足需求雄嚣,到后面能夠勝任各種要求,再到最后喘蟆,簡單的調(diào)用就可以完美的勝任工作缓升。這是持續(xù)根據(jù)實際情況思考,經(jīng)過多次重構(gòu)而得到的結(jié)果蕴轨。
為什么要重構(gòu)
從出發(fā)點(diǎn)來看:
- 功能缺陷港谊,已經(jīng)很難修復(fù)或者修復(fù)導(dǎo)致代碼更加混亂,希望通過重構(gòu)能夠徹底的解決問題
- 功能越來越復(fù)雜橙弱,代碼越來越多歧寺,導(dǎo)致維護(hù)成本非常大
從最終點(diǎn)來看:
- 統(tǒng)一結(jié)構(gòu),將類似的東西統(tǒng)一膘螟,模塊化成福,避免重復(fù)代碼和相同的bug
- 細(xì)分功能碾局,將一個復(fù)雜的功能細(xì)分荆残,減少開發(fā)的復(fù)雜度,增加復(fù)用性
- 最終的目的都是為了使用者更加簡單可靠
最佳時機(jī)
這里我把重構(gòu)最適合的時機(jī)概括為兩種:
- 功能爆炸期净当,當(dāng)功能復(fù)雜化内斯,代碼單純的大量疊加時蕴潦,必然形成很多復(fù)雜邏輯,并且冗余的代碼
- 類爆炸期俘闯,當(dāng)類似的功能經(jīng)過一定的歸類潭苞,導(dǎo)致每種類型的子類型隨著項目進(jìn)行而急劇增加的時候
以我們的項目經(jīng)驗來看,在前幾期的時候真朗,由于時間緊張此疹,功能的大量累加,導(dǎo)致一個復(fù)雜點(diǎn)的頁面就有上千行的代碼遮婶,此時每次改動都會花費(fèi)大量時間蝗碎,而且有部分bug不能從根本上解決。這時候我們開始了第一次的大規(guī)模重構(gòu)旗扑,主要包含以下幾點(diǎn):
- 提出組件化框架蹦骑,拆分頁面代碼,并把之前的一些功能用組件化改寫
- 統(tǒng)一相似組件臀防,把視覺相似的組件進(jìn)行統(tǒng)一化眠菇,并且對代碼結(jié)構(gòu)進(jìn)行重新歸類
- 歸納部分相似功能,比如導(dǎo)航欄袱衷、頁面頭部的交互變化捎废,網(wǎng)絡(luò)層重新整理
經(jīng)過這次的整理拆分后,已經(jīng)是一個比較同一的整體了致燥,能夠很好的復(fù)用和修改缕坎。
但是經(jīng)過部多個版本之后,又出現(xiàn)了新的問題篡悟。每次對頁面和功能的特例化谜叹,導(dǎo)致相同資源的組件或者功能越來越多,導(dǎo)致每次使用的時候都不太清楚用哪個組件比較好搬葬。而且每個組件的接口也有略微的差異荷腊,并不能無縫的切換。以及一些原來就存在的急凰,還沒有經(jīng)過拆分的功能女仰。
這次主要做的主要是統(tǒng)一化工作,比如最簡單的點(diǎn)贊按鈕抡锈,在很多地方使用疾忍,同時因為歷史原因,很多圖標(biāo)并不是同一個資源床三,邏輯規(guī)則也并不統(tǒng)一一罩,接口也不統(tǒng)一。經(jīng)過對整個項目的觀察撇簿,發(fā)現(xiàn)其實目前項目中點(diǎn)贊按鈕只有大小兩種樣式聂渊,那么使用抽象工廠的方式進(jìn)行歸納差购,對外暴露的只有一個類型,那么這樣使用者就不需要知道其中具體有幾個組件了汉嗽。
public class PraiseButton {
+ (instanceType)buttonWithStyle:style;
}
private class _SmallPraiseButton: PraiseButton;
private class _BigPraiseButton: PraiseButton;
而其他組件和功能對同一個資源的描述目前也是比較分散欲逃,今后也會按照這樣的方式,按照資源類型進(jìn)行歸類與統(tǒng)一饼暑。
重構(gòu)目的
目前來說兩次重構(gòu)的目的是:
- 第一次
拆分功能稳析,讓每個模塊盡可能的簡單,可復(fù)用弓叛;減少復(fù)雜度迈着,減少隱藏的bug;能夠給團(tuán)隊其他成員使用邪码。
- 第二次
合并和歸納功能裕菠;統(tǒng)一合并相同資源、功能的接口闭专;減少對外暴露的實現(xiàn)細(xì)節(jié)奴潘;讓使用者面對的只有一個對象,使用更加簡單影钉;減少理解溝通成本画髓。
猶如讀書時候老師說的一件事,剛開始讀書的時候平委,書是薄的奈虾;讀的久了,書就變厚了廉赔;當(dāng)你已經(jīng)精通書中所有肉微,書又變薄了。