你想要把某個演算法替換為另一個更清晰地演算法。將函數本體替換為另一個演算法。
string FoundPerson(string[] people) { for (int i = 0; i < people.Length; i++) { if (people[i].Equals("don")) { return "don"; } if (people[i].Equals("john")) { return "john"; } if (people[i].Equals("kent")) { return "kent"; } } return ""; } |
string FoundPerson(string[] people) { List<string> candidates = people.ToList<string>(); for (int i = 0; i < candidates.Count; i++) { if (candidates.Contains(people[i])) { return people[i]; } } return ""; } |
動機:解決問題有好幾種方法。演算法也是如此。如果你發現做一件事可以有更清晰地方式,就應該以較清晰地方式取代複雜的方式。“重構”可以把一些複雜東西分解為較簡單的小塊,但有時你就必須刪除整個演算法,代之以簡單的演算法。隨著對問題有了更多理解,你往往會發現,在原先的做法之外,有更簡單的解決方案,此時就需要改變原來的演算法。如果你開始使用程式庫,而其中提供的某些功能/特性與你自己的代碼重複,那麼你也需要改變原先的演算法。
有時候你會想要修改原先的演算法,讓它去做一件與原先略有差異的事。這時候你也可以先把原先的演算法替換為一個較易修改的演算法,這樣後續的修改會輕鬆許多。
使用這項重構之前,請先確定自己儘可能分解了原先函數。替換一個巨大而複雜的演算法是很困難的。只有先將它分解為較簡單的小型函數,然後你才能很有把握的進行演算法替換工作。
做法:1、準備好另一個演算法,讓它提供編譯。
2、針對現有測試,執行上述演算法。如果結果與原本結果相同,重構結束。
3、如果測試結果不同於原先,在測試和調試過程中,以舊演算法為比較參照標準。對應每個測試案例,分別以新舊2種演算法執行,並觀察2者結果是否相同。這可以協助你看到哪一個測試案例出現麻煩,以及出現了怎樣的麻煩。