跳至頁尾內容
Iron Academy Logo
C#應用程式
C#應用程式

其他類別

C# WinForms競賽邏輯教程 — 全課程18拆解 (Tim Corey)

[[academy-video-youtube({"vid": "i5IAClElyBQ", "start_time": "0", "title": "C# App Start To Finish Lesson 18 - Create Tournament Form Part 4", "creator": "Tim Corey", "length": "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回顧了整個流程:

  • 隊伍被隨機化

  • 計算回合

  • 分配雙塔

  • 產生對陣

  • 比賽結構完整

他強調錯誤是意料之中的,邏輯隨著時間的推進會改進,而專業的開發者不斷回訪早期的程式碼以改善它。

結語

第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 的開發者建立內容?將您的專業知識轉化為額外收入!

Iron 支援團隊

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