發(fā)布于:2021-02-05 15:10:27
0
116
0
帶有遺留代碼的新項(xiàng)目-真的嗎?
有一天,我得知我將從事一個(gè)新的Android項(xiàng)目。我充滿了熱情,對(duì)未來幾個(gè)月我的工作會(huì)是什么樣子感到興奮和好奇!后來,我了解到一些令我失望的事實(shí)。
原來,這個(gè)項(xiàng)目是由其他開發(fā)人員開發(fā)的,我不認(rèn)識(shí)他們,而且是用Java編寫的。一看代碼,我就知道我將要處理一個(gè)遺留代碼。
首先,我想,哦,不,說真的,我必須要做那件事嗎?!
但是喝了一杯平靜的茶后,我振作起來改變了主意。我開始把這種情況看作是一種挑戰(zhàn)。我告訴自己:來吧,伙計(jì),你可以馴服怪物。這可能是一次很好的冒險(xiǎn)!
如果遇到類似情況,請(qǐng)繼續(xù)閱讀。我希望您能找到一些對(duì)您有幫助的建議。
看一個(gè)Gradle文件
所以,你已經(jīng)有了Android項(xiàng)目的代碼庫,你就要開始工作了,但是你還不知道接下來會(huì)發(fā)生什么。開始發(fā)現(xiàn)項(xiàng)目的一個(gè)好方法是查看Gradle文件–構(gòu)建配置腳本,該腳本包含一系列有用的信息,為您提供了良好的項(xiàng)目概述。
?? 外部依賴項(xiàng)
有必要查看外部依賴項(xiàng)以及它們使用的版本。他們將告訴您使用了什么技術(shù)堆棧并且讓您熟悉將要處理的代碼中使用的概念。換句話說,它們將幫助您理解為什么代碼是這樣編寫的。
如果你對(duì)Android開發(fā)相當(dāng)陌生一些外部依賴性可能會(huì)讓你感到驚訝或者如果你以前沒有機(jī)會(huì)使用它們,對(duì)你來說可能是新的。例如,您可能會(huì)遇到RxJava 1,它在今年3月達(dá)到了其壽命終止(EOL),事件總線(不久前非常流行),甚至MaterialEditText庫自2016年以來就沒有維護(hù)過。或者被谷歌認(rèn)定為不推薦使用的GCM(googlecloudmessaging)。在某些情況下,遷移到新技術(shù)是必要的。
?? API級(jí)別要求
Gradle文件也是確保我們滿足googleplay的目標(biāo)API級(jí)別要求的好地方。googleplay要求應(yīng)用程序至少針對(duì)android8.0。因此,在下一個(gè)應(yīng)用程序發(fā)布之前,您可能需要對(duì)項(xiàng)目進(jìn)行一些更改。
尤其是,您必須確保您的UI流是否提供了授予運(yùn)行時(shí)權(quán)限的功能。在可能的情況下,你的應(yīng)用程序應(yīng)該準(zhǔn)備好處理拒絕權(quán)限請(qǐng)求。例如,如果用戶拒絕訪問設(shè)備GPS的請(qǐng)求,您的應(yīng)用程序應(yīng)該有另一種方式繼續(xù)。
??支持庫
下一個(gè)潛在問題來源可能是應(yīng)用程序中使用的可能過時(shí)的支持庫。所以,如果你想更新它,如果有些東西不能像你預(yù)期的那樣工作,不要驚訝。支持庫的修訂會(huì)很有幫助。
檢查清單文件
有必要查看清單文件并分析對(duì)我們來說很重要的信息。
?? 權(quán)限
清單文件為您提供有關(guān)應(yīng)用程序中使用的權(quán)限的信息。其中,您可以找到自動(dòng)授予的權(quán)限和使用應(yīng)用程序時(shí)需要授予的權(quán)限。第二個(gè)是運(yùn)行時(shí)權(quán)限——如何處理我在上面寫的權(quán)限。
?? 深度鏈接架構(gòu)
清單文件還包含深度鏈接模式。如果在應(yīng)用程序中有一個(gè)極好的機(jī)制來處理深度鏈接并啟動(dòng)與其相關(guān)的活動(dòng),那么就不必?fù)?dān)心了。否則,我們有必要知道哪些活動(dòng)需要小心。
如果缺少測(cè)試,則編寫測(cè)試
編寫代碼是我們的報(bào)酬,所以讓我們深入了解代碼的深度。當(dāng)我們處理遺留代碼時(shí),常見的任務(wù)之一是重構(gòu)代碼。但是如何確定如果我在一個(gè)地方改變了某個(gè)東西,它不會(huì)在另一個(gè)地方崩潰?
測(cè)試應(yīng)該保護(hù)您免受不確定性的影響,但是如果項(xiàng)目中沒有測(cè)試,我們應(yīng)該在開始進(jìn)行更改之前編寫測(cè)試。
在我的例子中,有很多未經(jīng)測(cè)試的代碼,而且-更重要的是-不穩(wěn)定的代碼。在本例中,其中一個(gè)有用的工具是PowerMock,它為您提供了模擬靜態(tài)方法、構(gòu)造函數(shù)、最終類和方法、私有方法、刪除靜態(tài)初始值設(shè)定項(xiàng)等的機(jī)制。他們可以幫你節(jié)省一些時(shí)間。
使用Kotlin重構(gòu)代碼
當(dāng)我們對(duì)類進(jìn)行測(cè)試時(shí),我們可以進(jìn)行重構(gòu)。首先,我認(rèn)為我的卷土重來,以Java編寫將是不明顯的。但我犯了愚蠢的錯(cuò)誤。例如,在類構(gòu)造函數(shù)之前,我忘記了分號(hào)和“new”。我意識(shí)到我有多想念Kotlin。
但是即使代碼是用Java編寫的,我們也不必放棄Kotlin奇特的特性。正如Kotlin語言的創(chuàng)建者所說,該語言可以與Java互操作。所以這意味著,您可以用Kotlin實(shí)現(xiàn)新的東西,這比用Java編寫的要簡(jiǎn)潔得多。
在重構(gòu)的情況下,Kotlin幫助很大。有些東西可能需要花更多的時(shí)間以Java風(fēng)格重寫它們。所以考慮將代碼提取到新的Kotlin類中,然后將其簡(jiǎn)化并在Java代碼中使用。
為什么理解遺留代碼如此重要?
有人可能會(huì)說:為什么Gradle和Manifest審查如此重要?我更喜歡在飛行中了解這個(gè)項(xiàng)目,而不是盯著那些文件浪費(fèi)時(shí)間。
嗯,我們的工作與業(yè)務(wù)密切相關(guān),我們的客戶想知道提供新功能需要多長(zhǎng)時(shí)間。有一個(gè)良好的項(xiàng)目概述和理解,提供準(zhǔn)確的時(shí)間估計(jì)是至關(guān)重要的,這反過來又可以防止將來出現(xiàn)并發(fā)癥。
結(jié)論
處理別人的代碼可能會(huì)讓人沮喪,但是在你開始詛咒它之前,試著理解為什么代碼是這樣寫的。乍一看,有些東西看起來完全不可讀,但潛入其中可以幫助你理解代碼并避免將來的麻煩。
我不能說使用遺留代碼是微不足道的。當(dāng)然,使用Android Jetpack更好,用Kotlin編寫整個(gè)代碼,不需要支持非常舊的Android系統(tǒng)版本。但是在我看來不能殺死你的東西會(huì)讓你更強(qiáng)大。
如果你遇到過類似的問題,并有一些建議,請(qǐng)留下評(píng)論。
作者介紹
熱門博客推薦