跳過到頁腳內容
Iron Academy Logo
C# 應用程式
C# 應用程式

其他分類

C# WinForms 重構—與 Tim Corey 一同深入探討

Tim Corey
1h 10m 16s

重構是區分僅僅能工作的代碼與可維護、靈活和未來準備就緒的代碼的主題之一。 在"從頭到尾的C#應用程序"系列的第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,他指出,系統性地清理項目中的方法調用時,實時錯誤追踪是多麼有幫助。

識別界面邏輯做得過多

在15:24,Tim 強調了一個主要的設計問題:界面事件處理器中包含過多邏輯。 他滾動瀏覽一個按鈕單擊事件,解釋其中包含的代碼比一個事件所應該包含的還要多得多。 在 Windows Forms中,諸如按鈕單擊之類的用戶操作由事件處理程序處理,該處理程序定義了事件發生時要執行的具體操作。

Tim 解釋說,界面代碼應專注於用戶互動。 Windows Forms 使用事件驅動的編程模型,用戶操作會觸發由應用程序代碼處理的事件。 業務邏輯 - 如計分比賽和推進獲勝者 - 應該屬於類庫中。 這種分離允許同樣的邏輯在以後的網頁應用程序或WPF應用程序中重用。

將比賽邏輯提取到類庫中

從17:55開始,Tim 將比賽計分邏輯移動到比賽邏輯類中的一個新的公共方法中。 他將其命名為UpdateTournamentResults,並解釋為什麼它接受整個比賽模型,而不是僅僅一個比賽。

他將邏輯從窗體中複製出來,粘貼到類庫中,並調整以獨立於界面元素的方式工作。 這次重構確保比賽規則儲存在一個地方,可以在任何地方重用。

正確地為比賽配分和處理輪空

在21:37,Tim 重構了比賽得分的方式。 他沒有處理單個比賽,而是遍歷所有回合和所有比賽,建立需要得分的比賽列表。

他解釋了檢測完成的比賽和輪空周的邏輯。 Tim 指出輪空周之前是以"不入流"的方式處理的,通過賦予假分數。 重構使他能夠顯式和乾淨地處理輪空周。

將配分邏輯提取到私人方法中

在28:17,Tim 將配分邏輯提取到一個私人方法中。 他解釋說較小、針對性強的方法使代碼更易於理解和維護。

他還重新命名了方法,以更好地反映其作用,例如將配分邏輯改為明確"標記比賽中的勝者"。

可配置的勝者決定

從29:58開始,Tim 重構了勝者決定邏輯,以便它能夠處理高分獲勝和低分獲勝的場景。 他引入了一個新的應用程序設置,並解釋為什麼配置比硬編碼規則更好。

Tim 討論了替換設計,包括將該值存儲在比賽模型中,但解釋了為什麼該更改超出本課範圍。

推進獲勝者和保存結果

在45:40,Tim 繼續推進獲勝者進入下一回合。 他解釋了獲勝者如何被分配到父比賽,以及在正確的時間保存數據的重要性。

稍後在52:10左右,他展示了一種精簡的ForEach方法來更新比賽,解釋它如何功能上等同於傳統循環但更加緊湊。

修復由重構引入的錯誤

在58:33,Tim 發現數據庫中的數據不正確,並將問題追溯到比賽保存之前的調用邏輯。 他解釋如何重構有時會暴露隱藏的bug而不是創建新的。

通過將更新邏輯移到正確的位置,即在持久化之後,Tim 解決了這個問題並重新測試了應用程序。

對重構的最後思考

在1:09:00,Tim 總結了重構在本課中取得的成就。 他解釋重構不僅僅是讓代碼更乾淨,也關於處理邊界情況、修正設計缺陷,以及為未來的更改做準備。

他強調重構是一個持續的過程,並暗示下一課將專注於錯誤處理。

結尾備註

這節課程展示了重構正如在實際項目中發生的一樣:漸進式,有時候雜亂,但最終是有價值的。 通過遵循Tim Corey 的逐步方法,您獲得了一個實用的藍圖,用於改進WinForms應用程序而不破壞功能,並且無需猜測下一步該做什麼。

Hero Worlddot related to C# WinForms 重構—與 Tim Corey 一同深入探討
Hero Affiliate related to C# WinForms 重構—與 Tim Corey 一同深入探討

通過分享您所愛的東西賺得更多

您是否在為使用.NET、C#、Java、Python或Node.js的開發者創建內容?將您的專業知識轉化為額外收入!

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我