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

其他分類

C# WinForms 比賽邏輯教程—第 18 課分解(Tim Corey)

Tim Corey
1h 15m 39s

在Tim Corey的C#應用程式從頭到尾系列的第18課中,重點轉移到C# WinForms (Windows Forms)應用程式內的邏輯驅動開發。與早期強調用戶介面、WinForms控制項和使用設計工具的視覺佈局課程不同,這節課是關於構建能夠在幕後運作正確的系統。

Tim多次解釋,這是進行真正開發工作的地方。 按鈕、文字框和常見控制項相對簡單,與設計必須在每種可能情境下都能運作的邏輯相比。 這節課是一個轉折點,應用程式開始感覺像一個真正的Windows桌面應用程式,而不僅僅是個範例。

整個課程都是使用Visual Studio進行教授,利用.NET Framework、類別庫和支持未來增長的WinForms專案類型。

從UI轉向設計邏輯

在課程的早期,Tim強調一個重要觀點:不要馬上開始編碼。 他解釋說,複雜邏輯永遠不要從表單的後台程式碼開始。相反,他暫停了Windows Forms應用程式,拿起紙筆,開始視覺化地設計錦標賽結構。

這是一個有意識的轉變,遠離設計工具、工具箱和屬性網格。 Tim強調,即使WinForms提供了一整套完整的UI工具,邏輯卻不能被拖拽或放置——它必須被設計。

他提到他已經多次重寫這種邏輯,強調修正錯誤和重新思考方法是開發的正常部分。

概念上理解錦標賽結構

Tim從系統設計的角度解釋了錦標賽究竟是什麼。他定義了:

  • 隊伍

  • 比賽配對

  • 配對條目

  • 輪次

  • 空白

每個比賽配對包含配對條目,而每個條目可能或不可能知道自己代表哪支隊伍。 這個概念在實施未來輪次時變得至關重要。

Tim用三支隊伍的簡單例子展示了為什麼錦標賽需要二的冪次。 因此,空白並不是一個特殊功能——它們是數學上的必要條件。

這段主要涉及的不是代碼,而是像開發者一樣思考,這是Tim在整個系列中一再強調的。

為什麼有些隊伍必須為空

此時,Tim切換到Visual Studio,打開解決方案瀏覽器,並進入數據庫專案。 他雙擊進入表格設計,並解釋了一個微妙但關鍵的要求:未來的回合無法提前知道隊伍。

由於這個原因,TeamCompetingId字段必須允許空值。

Tim打開屬性視窗,解釋SQL Server的安全警告,並展示如何暫時禁用禁止保存需要重新創建表的更改。 他謹慎地指出,這只有在表格是空的時候才是安全的。

這是一個在開發速度、數據完整性和現實世界限制之間取得平衡的經典例子。

保持表單整潔和專注

回到WinForms專案,Tim重申一個他在課程開始時就遵循的原則: 表單不應包含業務邏輯。

即使WinForms使直接在按鈕點擊事件中編寫邏輯變得容易,Tim解釋說,這樣做會損害:

  • 可維護性

  • 可重用性

  • 測試

  • 未來平台兼容性

相反,表單的職責僅限於:

  • 從UI收集輸入

  • 調用方法

  • 顯示結果

這種分離保持了Windows桌面應用程式的清潔和專業。

創建TournamentLogic類

Tim創建了一個新的類別庫,並引入了一個靜態的TournamentLogic類。 這個類不是UI,不是數據訪問,也不是模型——它存在純粹是為了實現邏輯。

他解釋說,這種設計選擇允許以後在以下方面重用相同的邏輯:

  • WPF

  • ASP.NET

  • 其他.NET桌面或網頁平台

這一時刻默默地展示了為什麼WinForms仍然有意義:正確使用時,這種老架構可以與現代架構整合得很乾淨。

公平洗牌球隊

Tim實作一個方法,以以下方式重新安排球隊次序:

OrderBy(x => Guid.NewGuid())

他承認這並不符合密碼學上的完美,但解釋說它是:

  • 簡單

  • 可讀性強

  • 支持的

  • 以後容易替換

這與課程中反覆出現的主題一致:先達成正確性,再進行優化。

他還解釋了為什麼原始列表不被修改,避免了無意的副作用——這是一個細微但重要的程式設計習慣。

計算總回合數

這一節花費的時間超過預期,Tim公開承認原因:邏輯很容易被誤解。

他展示了如何用循環計算回合,而不是依賴於模糊意圖的公式。 目標是清晰勝過巧妙。

Tim驗證了每個情況:

  • 2支隊伍 → 1回合

  • 3支隊伍 → 2回合

  • 4支隊伍 → 2回合

  • 8支隊伍 → 3回合

他反復鼓勵觀眾在相信邏輯之前暫停、測試和單獨驗證它。

確定空白隊伍數量

Tim刻意編寫手動邏輯來計算下個二次冪,而不是使用Math.Pow。 他解釋說,避免使用雙精度浮點數減少了錯誤,提高了可讀性。

這一節展示了經驗豐富的開發者通常會選擇乏味、明確的代碼,因為它更容易調試和維護。

創建第一回合

第一回合是獨一無二的,因為:

  • 已知球隊

  • 應用空白

  • 父比賽配對不存在

Tim仔細地走過如何創建比賽配對、比賽配對何時完成以及空白如何自動推進一支隊伍。

這個邏輯是一步一步地實現的,經常停下來解釋每一個決策的原因

構建後續回合

後續回合是以非常不同的方式創建的。 球隊未知,因此使用父比賽配對。

Tim解釋了怎麼樣將前一輪的比賽配對接到下一輪,在一場比賽進行之前就創建了一個完整的錦標賽樹。

這是整個應用程式中最重要的架構決策之一,並支持:

  • 分數跟踪

  • 獲勝者晉級

  • 未來自動化

最終審核與驗證

在課程的最後幾分鐘,Tim審核了整個流程:

  • 球隊已重新排列

  • 回合已計算

  • 空白已分配

  • 比賽配對已生成

  • 錦標賽結構已完成

他強調bug是預期的,邏輯隨著時間的推移變得更好,專業的開發者不斷回到早期的代碼以改進它。

結束思考

第18節不是關於WinForms控制項、拖放UI或華麗功能。 它是關於思考、設計和編寫能夠在真實使用中生存的代碼。

視頻的結束,應用程式已經從一個簡單的Windows Forms應用程式變成了一個結構化、可擴展的.NET桌面程式——一個如果需要,可以遠遠超過WinForms的程式。

這是學習停止學術化,開始專業化的地方。

Hero Worlddot related to C# WinForms 比賽邏輯教程—第 18 課分解(Tim Corey)
Hero Affiliate related to C# WinForms 比賽邏輯教程—第 18 課分解(Tim Corey)

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

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

鋼鐵支援團隊

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