本系列旨在從零構建完整 ASP.NET MVC 論壇應用,探討最佳實踐。首篇確立軟體品質定義、識別代碼壞味道、論證測試驅動開發 (TDD) 必要性,為後續架構決策奠定理論基石。
什麼是好軟體?
好軟體 = 易於修改的軟體。修改原因四類:新增功能、修復錯誤、效能優化、改進設計。設計不良的軟體讓人不敢動、難以擴展、最終被重寫。
五大代碼壞味道
| 壞味道 | 定義 | 對修改的阻礙 |
| 僵化性 | 一處修改引發連鎖多處修改 | 擴展功能成本指數級上升 |
| 脆弱性 | 一處修改導致無關處故障 | 不敢重構、測試覆蓋率難提升 |
| 不必要的複雜性 | 過度設計應對未來假設變化 | 增加認知負擔、實際價值低 |
| 不必要的重複 | 大量複製貼上代碼 | 修改需同步多處、極易遺漏 |
| 晦澀性 | 代碼難以理解意圖 | 新成員上手慢、溝通成本高 |
來源:Robert C. Martin & Micah Martin 《Agile Principles, Patterns, and Practices in C#》
核心設計原則應對壞味道
- SRP (單一職責原則):類別只有一個變化原因 → 消除僵化與耦合。
- OCP (開放封閉原則):對擴展開放、對修改封閉 → 透過抽象與多型應對變化。
- LSP (里氏替換原則):子類別可替換父類別 → 保證繼承體系正確性。
- ISP (介面隔離原則):依賴精簡介面 → 減少不必要的耦合。
- DIP (依賴反轉原則):高層模組不依賴低層模組,雙方依賴抽象 → 解耦、利於測試。
為什麼選擇 TDD (測試驅動開發)?
- 強制先思考介面設計:測試即活文檔,定義「做什麼」而非「怎麼做」。
- 即時回饋迴路:紅-綠-重構循環,保持代碼持續可用狀態。
- 重構安全網:測試覆蓋給予大膽重構勇氣,消除脆弱性。
- 活文檔:測試案例比註解更可靠、永不同步。
- 設計壓力:難測試的代碼通常設計不良 (違反 DIP、SRP),TDD 倒逼良好架構。
論壇應用核心領域模型初探
- User:身分認證、角色、權限、個人資料。
- Forum/Category:版塊分層、權限控制、統計資訊。
- Thread/Post:主題貼、回覆、巢狀引用、編輯歷史。
- Attachment:上傳檔案、圖片、大小限制、掃毒。
- Notification:站內信、Email、@提醒、訂閱。
技術棧規劃
- 框架:ASP.NET MVC 5 / ASP.NET Core (視系列進度遷移)
- ORM:Entity Framework Core (Code First)
- 測試:xUnit + Moq + FluentAssertions
- DI 容器:內建 / Autofac
- 前端:Razor + Vue.js (漸進式增強) / Blazor (後續評估)
- 部署:Docker + Kubernetes / Azure App Service
系列文章規劃
- 架構原則與 TDD 奠基 (本文)
- 領域模型與 Repository 實作
- 身分認證與授權體系 (Identity / JWT)
- 版塊/主題/回覆 CRUD 與權限
- 分頁、搜尋、標籤雲
- 即時通知 (SignalR)
- 檔案上傳與圖片處理
- 管理後台與審核流程
- 效能優化與快取策略
- 部署與 DevOps 流水線
總結
軟體開發非堆疊功能,而是持續對抗熵增。以 SOLID 原則為矛、TDD 為盾,在論壇這個經典而豐富的領域模型中,踐行「易於修改」的工程智慧。
- 上一篇文章: ASP.NET MVC 視圖片段快取(上):起步與核心概念
- 下一篇文章: ASP.NET 自訂控件開發 第六章:控件屬性持久化深度解析
Copyright ©
程式碼之家 All Rights Reserved