“再一次問好。”

“你好!”

“今天我要給大家講講重構。重構就是在不改變項目功能的情況下改變項目中的代碼。”

“但這怎麼可能?”

“好吧,在最簡單的情況下,我們可以重命名變量和/或方法。畢竟,更改變量的名稱不會使程序運行不同,不是嗎?”

“當然不是。”

“你也可以將大型方法分解成幾個較小的方法。

“您可以將重複的代碼片段提取到一個單獨的方法中。

“一些函數可以聲明為靜態的,然後移到實用程序類中。”

“但這是對重構的狹義解釋。”

“重構有時意味著在不添加新功能的情況下重寫(改進)項目的架構。這是廣義上的重構。”

“IntelliJ IDEA 成為最流行的集成開發環境 (IDE),特別是因為它率先引入了非常強大的重構工具。”

“這些法器是什麼?”

魔術 #1:更改方法的名稱。

“想像一下,您的代碼有一個從 100-500 個不同地方調用的方法。您決定將其名稱更改為更容易理解的名稱。假設它是 run(),而您希望它是 runDownloadTaskAsync()。多快你能做到嗎?

“嗯,首先你需要改變方法的名稱,然後找到程序中所有調用該方法的地方,並在那裡也改變名稱。”

“你怎麼找到那些地方?”

“我只需運行該程序,IntelliJ IDEA 就會向我展示調用不存在的方法的所有位置。”

“好吧。但是現在假設每個方法都有一個解釋性註釋 (JavaDoc) 來解釋該方法的作用——並且舊的方法名稱寫在那裡。”

“我也會改變評論。”

“但也可能有一些變量的名稱與方法的名稱相關聯。最好也更改它們:”

Task task = manager.run();
Task asyncTask = manager.runDownloadTaskAsync();

“是的,最好也更改那些變量的名稱。不會有什麼壞處。”

“嗯,所有這些都可以使用 IntelliJ IDEA 在幾秒鐘內完成!”

“您將光標放在方法名稱上(或用鼠標單擊它),然後按Shift+F6並開始鍵入所需的方法名稱。”

“這是一個編輯方法名稱的示例。”

“開始編輯:”

想法:重構 - 1

“指定一個新名稱:”

想法:重構 - 2

“只要輸入一個新名稱,回車,就可以了。這個方法在項目中被調用的任何地方都會被重命名。”

“IntelliJ IDEA 通常還會詢問您是否要在註釋中重命名變量名和方法名。只需單擊“是”,它就會改變一切。”

“更何況,如果項目在本次重構操作之前編譯通過,那麼重構之後也能保證編譯成功。”

“聽起來很有希望。”

“順便說一句,您可以用同樣的方式更改變量名稱。單擊一個名稱後,只需按Shift+F6——然後您可以輸入一個新名稱,IntelliJ 將在任何使用的地方更改變量名稱。

“如果變量是類中的一個字段並且有一個 getter 和一個 setter,那麼 getter 和 setter 的名稱也會更改以匹配變量的新名稱。”

“我嘗試使用變量。一切都像你說的那樣工作,Ellie。重構太棒了!”

“你認為重構就是全部嗎?重構是一個如此廣泛的話題——我們甚至還沒有觸及表面。”

“哇。還有什麼?”

魔術 #2:提取變量。

“有時某些表達式在代碼中經常重複,以至於您需要將它們移到一個單獨的變量中。例如:”

代碼
public void printInfo(User user)
{
 System.out.println(user.getProfile().getName());
 System.out.println(user.getProfile().getAddress().getState());
 System.out.println(user.getProfile().getAddress().getCity());
 System.out.println(user.getProfile().getAddress().getStreet());
 System.out.println(user.getProfile().getAddress().getHomeNumber());
}
你希望它看起來如何:
public void printInfo(User user)
{
 Address address = user.getProfile().getAddress();

 System.out.println(user.getProfile().getName());
 System.out.println(address.getState());
 System.out.println(address.getCity());
 System.out.println(address.getStreet());
 System.out.println(address.getHomeNumber());
}

“啊。”

“而且代碼可能會復雜得多,有很多重複的部分。”

“程序員不會故意那樣寫。但你經常需要向方法中添加一些東西,然後再添加其他東西——隨著時間的推移,重複的次數會飆升。”

“通過創建一個單獨的變量,我們可以給它一個合適的名稱並提高代碼的可讀性。”

“例如,在上面的例子中,也許我們不是在談論家庭地址。也許我們在談論緊急聯繫人的地址。然後你可以調用這個變量 emergencyContactAddress,而不僅僅是地址。然後,一個程序員第一次看到這段代碼就會明白這裡發生了什麼。”

“是的,我同意。添加這樣的變量是有道理的。”

“你是怎麼做到的?”

“將一個表達式移動到一個單獨的變量中非常簡單。”

第一步:用鼠標選擇表達式。

想法:重構 - 3

第 2 步:按 Ctrl+Alt+V

想法:重構 - 4

“打開一個窗口,IntelliJ IDEA 會詢問我們是要僅替換選定的表達式還是替換錶達式的所有實例(出現 4 次)?”

“選擇第二個選項來替換所有出現(替換所有 4 次出現)”

第 3 步:按回車鍵。

想法:重構 - 5

“IntelliJ IDEA 會提示您輸入一個變量名。它也會對名稱提出自己的建議。不錯,嗯?”

“嗯嗯,對了,我們還打算給變量命名為‘地址’,它是怎麼知道的?”

“通過在表達式中使用最後一個方法的名稱,它返回一個地址。因此,變量很可能將用於存儲地址。”

“結果真的很好。太棒了,艾莉。”

魔術 #3:將代碼提取到一個單獨的方法中。

“但我們本可以做其他事情。我們可以聲明一個新方法,例如printAddress (),然後將所有這些代碼移入其中。”

“我們試試吧。”

第 1 步:選擇使用地址變量的 4 行代碼:

想法:重構 - 6

第 2 步:按 Ctrl+Alt+M

想法:重構 - 7

“IntelliJ IDEA 確定該方法需要哪些變量,並建議它應該是什麼樣子。“唯一剩下的就是為該方法輸入一個名稱。

第 3 步:輸入 printAddress 作為方法名稱,然後按 Enter 鍵。

想法:重構 - 8

“你覺得如何?”

“太棒了。IntelliJ IDEA 不僅將代碼提取到一個單獨的方法中,還添加了所有必需的變量。而且,它猜對了所有名稱。”