C# WinForms重構-更深入的了解Tim Corey
[[academy-video-youtube({"vid": "UPKphrPJZxE", "start_time": "0", "title": "C# App Start To Finish Lesson 24 - Refactoring", "creator": "Tim Corey", "length": "1h 10m 16s"})]]
重構是將僅僅能運行的程式碼與具備可維護性、靈活性和未來準備性程式碼區分開來的主題之一。 在"C# App From Start to Finish"系列的第24課中,Tim Corey詳細演示了一個在WinForms應用程式中的實用重構過程。 Tim不是講解理論,而是重構已有的專案,說明為何需要改變以及如何安全地進行改變。
在這篇文章中,我們將深入了解C# WinForms重構,嚴格遵循Tim在影片中的說明。
此課中重構的意義
在0:02,Tim介紹了第24課,並解釋重構意味著重新整理程式碼,使其執行同樣的工作,但方式更好。 他指出應用程式已經能運行,但包含"雜亂"和不符合標準的地方。 根據Tim的說法,現在是清理的最佳時機,否則專案將繼續增長。
他強調,重構不是新增功能,而是改善結構、可讀性和長期可維護性,同時保持行為不變。
清除介面中不必要的返回值
從0:31開始,Tim深入首次重構:修正介面方法簽名。 他解釋在專案初期,方法不必要地返回模型。 由於物件已經是通過引用傳遞的,再次返回同一模型沒有實際意義。
Tim演示將這些方法更改為void,這立即破壞了實現。 他解釋為什麼會發生這種情況:當介面更改時,所有實現類必須確切匹配新的簽名。 他演示了如何修復SQL連接器和文字連接器以符合更新後的介面。
在2:33,Tim暫停以展示如果您讓Visual Studio自動實現介面會發生什麼。 他解釋為什麼會出現重複的函式名稱並澄清僅靠返回型別不足以區分方法簽名。
修正由重構引起的構建錯誤
在4:00,Tim構建了解決方案並故意演示出現的錯誤。 他解釋這些錯誤是意料之中的,並且有幫助。 例如,先前預期返回模型的程式碼現在失效了,因為該方法返回void。
Tim通過移除不必要的賦值來修正此問題,並重建了解決方案。 他強調重構通常會導致短期破壞,但每個錯誤都直接指向需要改進的程式碼。
將檔名常量移至GlobalConfig
從5:25開始,Tim重構文字連接器中檔名的處理方式。 以前,檔案路徑被儲存為類內的私有字串常量。 Tim解釋,這些不再需要,因為檔名已經存在於GlobalConfig中。
他用GlobalConfig.PeopleFile、GlobalConfig.PrizesFile和類似的屬性替換了本地常量。 Tim解釋此改變集中配置,確保整個應用程式使用一致的檔案路徑。
他也強調了一個重要點:避免同時重構太多東西。 當他注意到可以進行的其他改進時,他明確表示會稍後再回來做這些。
重構文字連接器處理器
在7:44,Tim刪除了文字連接器處理器中多個方法的檔名參數,繼續重構。 由於檔名現在在GlobalConfig中,傳遞它們是多餘的。
Tim仔細更新了方法簽名,將參數替換為GlobalConfig引用,並依賴於Visual Studio的錯誤列表來指導他。 他解釋在重構期間同時看到許多錯誤是正常的,不需驚慌。
在13:16,他指出即時錯誤追蹤在系統地清理專案中的函式調用時如何有幫助。
識別UI邏輯過多的問題
在15:24,Tim強調了一個重大設計問題:UI事件處理器中存在過多邏輯。 他滾動瀏覽按鈕點擊事件,解釋其中的程式碼遠超出事件應該包含的範圍。 在Windows窗體中,像按鈕點擊這樣的使用者操作由事件處理器處理,這些處理器定義了事件發生時要執行的具體動作。
Tim解釋UI程式碼應僅專注於使用者互動。 Windows窗體使用事件驅動的程式設計模型,使用者操作會觸發由應用程式程式碼處理的事件。 商務邏輯--如計分比賽和推進獲勝者--應在類程式庫中。 這樣的分離允許相同的邏輯之後在網頁應用程式或WPF應用程式中重新使用。
將比賽邏輯提取至類程式庫
從17:55開始,Tim將比賽計分邏輯移到比賽邏輯類中的一個新的公共方法中。 他將它命名為UpdateTournamentResults並解釋為什麼接受整個比賽模型而不僅僅是一場比賽。
他從表單中複製邏輯,將其粘貼進類程式庫中,並調整使其獨立運作於UI元素。 這種重構確保比賽規則存在於一個地方,可以在任何地方重用。
正確計分比賽和處理輪空
在21:37,Tim重構了如何計分比賽。 他不是處理單場比賽,而是遍歷所有回合和所有比賽,建立需要計分的比賽列表。
他解釋用於檢測已完成比賽和空輪的邏輯。 Tim指出,空輪以前被"黑客式"地處理,通過分配虛假的分數。 重構允許他明確且乾淨地處理空輪。
將計分提取為私有方法
在28:17,Tim將計分邏輯提取到一個私有方法中。 他解釋專注而小型的方法使程式碼更容易理解和維護。
他還重命名方法以更好地反映其作用,例如將計分邏輯更改為明確"在比賽中標記獲勝者"的描述。
可配置的勝者確定
從29:58開始,Tim重構了勝者確定邏輯,使其能夠處理高比分獲勝和低比分獲勝的場景。 他引入了一個新的應用程式設置,解釋為什麼配置比硬編碼的規則更好。
Tim討論替代設計,包括將此值儲存在比賽模型中,但解釋更改此內容不在本課的範疇內。
推進獲勝者並儲存結果
在45:40,Tim繼續將獲勝者推進到下一輪。 他解釋獲勝者如何與父比賽匹配以及為什麼在正確時間儲存資料至關重要。
隨後,大約在52:10,他展示了一種簡潔的ForEach方法來更新比賽,解釋它在功能上等同於傳統迴圈,但更緊湊。
修復重構引入的錯誤
在58:33,Tim發現資料庫中資料不正確,並將問題追溯到比賽儲存之前的呼叫邏輯。 他解釋重構有時會暴露隱藏的錯誤,而不是創造新的錯誤。
通過將更新邏輯移至正確位置--在資料保護之後--Tim解決了問題並重新測試了應用程式。
對重構的最終思考
在1:09:00,Tim總結了這節課的重構成就。 他解釋重構不僅僅是程式碼更乾淨--還包括處理邊緣案例、修正設計缺陷並為未來變更做好準備。
他強調重構是一個持續的過程,並暗示下一堂課將重點關注錯誤處理。
結語
這個課程展示了真實專案中是如何進行重構:漸進的,有時略顯混亂,但最終是有益的。 通過遵循Tim Corey的逐步方法,您可以獲得一個實用的藍圖來改進WinForms應用程式,而不會破壞功能--而且不需要猜測下一步應該做什麼。

