<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>註解規範 on Tarragon</title><link>https://tarrragon.github.io/blog/tags/%E8%A8%BB%E8%A7%A3%E8%A6%8F%E7%AF%84/</link><description>Recent content in 註解規範 on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Wed, 04 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/%E8%A8%BB%E8%A7%A3%E8%A6%8F%E7%AF%84/index.xml" rel="self" type="application/rss+xml"/><item><title>程式碼註解撰寫方法論</title><link>https://tarrragon.github.io/blog/record/%E7%A8%8B%E5%BC%8F%E7%A2%BC%E8%A8%BB%E8%A7%A3%E6%92%B0%E5%AF%AB%E6%96%B9%E6%B3%95%E8%AB%96/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/record/%E7%A8%8B%E5%BC%8F%E7%A2%BC%E8%A8%BB%E8%A7%A3%E6%92%B0%E5%AF%AB%E6%96%B9%E6%B3%95%E8%AB%96/</guid><description>&lt;p>接手一段六個月前的程式碼，看到 &lt;code>processBook()&lt;/code>，旁邊的註解寫著「處理書籍相關邏輯」。完全沒有幫助——只是重述函式名稱，沒說背後有什麼業務限制、改了會影響哪裡、當初為什麼這樣設計。&lt;/p>
&lt;p>這讓我們重新思考：註解到底是為了誰而寫的？&lt;/p></description><content:encoded><![CDATA[<p>接手一段六個月前的程式碼，看到 <code>processBook()</code>，旁邊的註解寫著「處理書籍相關邏輯」。完全沒有幫助——只是重述函式名稱，沒說背後有什麼業務限制、改了會影響哪裡、當初為什麼這樣設計。</p>
<p>這讓我們重新思考：註解到底是為了誰而寫的？</p>
<h2 id="註解的本質">註解的本質</h2>
<p>程式碼註解不是程式的解釋員。它的存在是為了保護原始設計意圖，提供無法從程式碼本身推斷出來的訊息。</p>
<p><strong>不應該做的</strong>：解釋程式在做什麼（好的程式碼應該自己說話）、描述函式使用方法（那是文件的工作）、充當 TODO 清單。</p>
<p><strong>應該做的</strong>：作為需求保護器，防止維護時破壞原始需求；記錄設計意圖，保存業務邏輯的考量；提供維護指引，明確標示約束條件；建立程式碼與需求規格的連結。</p>
<h2 id="第一原則程式碼本身必須自說明">第一原則：程式碼本身必須自說明</h2>
<p>如果程式碼需要靠註解才能被理解，首先應該改善的是程式碼，不是補更多解釋。</p>
<p><code>process(Book book)</code> 需要一行「檢查書籍狀態並更新進度」的註解，但如果直接命名為 <code>updateReadingProgressWhenStatusChanges(Book book)</code>，解釋性的註解就不需要了。此時真正值得寫下來的，是這個函式背後的業務需求和約束條件：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dart" data-lang="dart"><span class="line"><span class="ln">1</span><span class="cl"><span class="kt">void</span> <span class="n">updateReadingProgressWhenStatusChanges</span><span class="p">(</span><span class="n">Book</span> <span class="n">book</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">  <span class="c1">// 需求：UC-005 閱讀進度管理
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="c1"></span>  <span class="c1">// 當使用者標記書籍為「閱讀中」時，自動設定進度為 0%
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1"></span>  <span class="c1">// 當使用者標記為「已完成」時，自動設定進度為 100%
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="c1"></span>  <span class="c1">// 約束：不可覆蓋使用者手動設定的進度值
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="c1"></span><span class="p">}</span></span></span></code></pre></div><p>變數也一樣：<code>final data = book.getInfo()</code> 毫無意義，<code>final enrichedBookMetadata = book.getMetadataWithEnrichment()</code> 就完全自說明了。</p>
<p>驗證標準：移除所有註解後，如果仍能理解程式邏輯，程式碼達標。需要猜測變數含義就重新命名，無法確定函式目的就拆分函式。</p>
<h2 id="第二原則註解記錄的是需求脈絡">第二原則：註解記錄的是需求脈絡</h2>
<p>程式碼自說明，不代表不需要註解——需要的是不同種類的註解。</p>
<p>每個業務邏輯函式都應該追溯到明確的需求來源：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dart" data-lang="dart"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1">/// 需求：UC-003.2 書籍分類管理
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1">/// 使用者可以為書籍設定多個標籤進行分類
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="c1">/// 約束：標籤名稱不可重複，最多 10 個標籤
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1"></span><span class="kt">void</span> <span class="n">addTagToBook</span><span class="p">(</span><span class="n">BookId</span> <span class="n">bookId</span><span class="p">,</span> <span class="n">Tag</span> <span class="n">tag</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">  <span class="c1">// 實作...
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="c1"></span><span class="p">}</span></span></span></code></pre></div><p>這條註解告訴維護者：這個函式的存在依據是 UC-003.2，不可以被打破的規則是標籤不可重複且最多十個。</p>
<p>書籍狀態的轉換順序是業務規則，不是技術細節，也應該記錄：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dart" data-lang="dart"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1">/// 需求：BR-001 書籍狀態轉換規則
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1">/// 書籍狀態變更順序：初始 → 資訊補充中 → 資訊補充完成 → 可用
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="c1">/// 約束：不可跳過中間狀態，不可逆向轉換
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1">/// 例外：管理員可以直接設定為任何狀態
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="c1"></span><span class="n">BookStatus</span> <span class="n">transitionBookStatus</span><span class="p">(</span><span class="n">BookStatus</span> <span class="n">current</span><span class="p">,</span> <span class="n">BookStatus</span> <span class="n">target</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">  <span class="c1">// 實作...
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="c1"></span><span class="p">}</span></span></span></code></pre></div><p>設計決策也要記錄。為什麼選懶載入加分頁？因為有效能需求：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dart" data-lang="dart"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1">/// 需求：NFR-002 效能需求
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1">/// 書庫載入時間不可超過 2 秒
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="c1">/// 設計決策：採用懶載入 + 分頁載入策略
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1">/// 影響：首次載入只載入 20 本書，滾動時動態載入
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="c1"></span><span class="n">List</span><span class="o">&lt;</span><span class="n">Book</span><span class="o">&gt;</span> <span class="n">loadLibraryWithPagination</span><span class="p">(</span><span class="kt">int</span> <span class="n">page</span><span class="p">,</span> <span class="kt">int</span> <span class="n">pageSize</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">  <span class="c1">// 實作...
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="c1"></span><span class="p">}</span></span></span></code></pre></div><p>一個完整的業務邏輯註解必須包含：需求來源（UC 或 BR 編號）、業務描述、約束條件、以及修改此邏輯會影響哪些功能。</p>
<h2 id="第三原則維護指引必須明確">第三原則：維護指引必須明確</h2>
<p>好的維護指引讓維護者修改程式碼之前就知道會影響哪裡。不應該隨意修改的邏輯，要主動發出警告：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dart" data-lang="dart"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1">/// 需求：UC-001.3 書籍唯一性檢查
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1">/// 同一書庫內不可有相同 ISBN 的書籍
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="c1">/// 警告：此邏輯關聯到資料一致性，修改前必須檢查：
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1">/// - 書籍匯入流程 (ImportBookService)
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="c1">/// - 書籍合併功能 (BookMergeService)
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="c1">/// - 資料庫索引設計 (book_isbn_unique_index)
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="c1"></span><span class="kt">bool</span> <span class="n">isDuplicateBook</span><span class="p">(</span><span class="kt">String</span> <span class="n">isbn</span><span class="p">,</span> <span class="n">LibraryId</span> <span class="n">libraryId</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl">  <span class="c1">// 實作...
</span></span></span><span class="line"><span class="ln">9</span><span class="cl"><span class="c1"></span><span class="p">}</span></span></span></code></pre></div><p>預期會被擴展的邏輯，要提供擴展指引：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dart" data-lang="dart"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1">/// 需求：UC-004 書籍搜尋功能
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1">/// 支援書名、作者、標籤的模糊搜尋
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="c1">/// 擴展指引：新增搜尋條件時必須：
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1">/// 1. 更新 SearchCriteria 值物件
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="c1">/// 2. 修改索引策略以維持效能
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="c1">/// 3. 更新搜尋測試案例涵蓋新條件
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="c1"></span><span class="n">List</span><span class="o">&lt;</span><span class="n">Book</span><span class="o">&gt;</span> <span class="n">searchBooks</span><span class="p">(</span><span class="n">SearchCriteria</span> <span class="n">criteria</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl">  <span class="c1">// 實作...
</span></span></span><span class="line"><span class="ln">9</span><span class="cl"><span class="c1"></span><span class="p">}</span></span></span></code></pre></div><p>模組間的耦合關係也需要標示：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dart" data-lang="dart"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">/// 需求：UC-006 借閱管理
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="c1">/// 計算書籍歸還到期日
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="c1">/// 相依性警告：此邏輯與以下模組緊密耦合
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="c1">/// - LoanReminderService（提醒計算）
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="c1">/// - OverdueBookDetector（逾期偵測）
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="c1">/// - LibraryStatistics（統計計算）
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="c1">/// 修改歸還期限計算會影響上述所有模組
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="c1"></span><span class="n">DateTime</span> <span class="n">calculateDueDate</span><span class="p">(</span><span class="n">DateTime</span> <span class="n">loanDate</span><span class="p">,</span> <span class="kt">int</span> <span class="n">loanPeriodDays</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="c1">// 實作...
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="c1"></span><span class="p">}</span></span></span></code></pre></div><h2 id="第四原則結構一致的標準格式">第四原則：結構一致的標準格式</h2>
<p>把上面的原則整合成一個標準格式：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dart" data-lang="dart"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1">/// 需求：[需求編號] [簡短描述]
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1">/// [詳細業務描述，說明使用者需求]
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="c1">/// 約束：[限制條件和邊界規則]
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1">/// [維護指引：修改須知、相依性警告、擴展要求]
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="c1"></span><span class="p">[</span><span class="err">函式簽名</span><span class="p">]</span></span></span></code></pre></div><p>複雜業務邏輯的範例：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dart" data-lang="dart"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">/// 需求：UC-007.1 閱讀統計分析
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="c1">/// 計算使用者的閱讀速度和預估剩餘時間
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="c1">/// 約束：只統計狀態為「閱讀中」的書籍，頁數必須大於 0
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="c1">/// 計算邏輯：(已讀頁數 / 實際閱讀時間) = 閱讀速度（頁/小時）
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="c1">/// 維護指引：修改計算公式會影響：
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="c1">/// - 閱讀目標設定功能
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="c1">/// - 個人化推薦系統
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="c1">/// - 學習分析報表
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="c1">/// 相依模組：ReadingProgressTracker, BookMetadata, UserPreferences
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="c1"></span><span class="n">ReadingSpeed</span> <span class="n">calculateReadingSpeed</span><span class="p">(</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">  <span class="n">ReadingProgress</span> <span class="n">progress</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">  <span class="n">BookMetadata</span> <span class="n">metadata</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">  <span class="n">Duration</span> <span class="n">actualReadingTime</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">  <span class="c1">// 實作...
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="c1"></span><span class="p">}</span></span></span></code></pre></div><h2 id="禁止的註解模式">禁止的註解模式</h2>
<p>最常見的錯誤是重述程式碼行為。「設定書籍標題」對應的程式碼是 <code>book.setTitle(newTitle)</code>，完全多餘。「使用 Map 快速查找避免 O(n) 複雜度」也一樣，有經驗的開發者看程式碼就知道。</p>
<p>UI 層特別容易出現這類問題。以 Widget 選取回饋設計為例，錯誤做法是列出技術細節：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dart" data-lang="dart"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">/// 反例：重複描述程式碼內容
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="c1">/// BookListItem - 書庫列表項目 Widget
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="c1">///
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="c1">/// 視覺設計：
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="c1">/// - 陰影刻痕變化（凸起→凹陷）
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="c1">/// - AnimatedContainer 200ms 過渡動畫
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="c1">///
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="c1">/// 觸覺回饋：
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="c1">/// - 選擇時：HapticFeedback.selectionClick()
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="c1">/// - 取消選擇：HapticFeedback.lightImpact()
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="c1"></span><span class="kd">class</span> <span class="nc">BookListItem</span> <span class="kd">extends</span> <span class="n">StatelessWidget</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">  <span class="c1">// ...
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="c1"></span><span class="p">}</span></span></span></code></pre></div><p>這些看程式碼就能看到。真正有價值的是背後的決策依據：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dart" data-lang="dart"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">/// 【需求來源】UC-05: 雙模式書庫展示切換 - 書籍選擇互動
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="c1">/// 【規格文件】docs/ui_design_specification.md#book-selection-feedback
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="c1">/// 【設計決策】採用方案C-1基礎版 - 極簡視覺回饋設計
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="c1">/// 【為什麼選擇陰影刻痕變化】
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="c1">/// - 不影響文字可讀性：避免背景色干擾閱讀體驗
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="c1">/// - 符合無障礙設計：不依賴顏色作為唯一視覺提示
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="c1">/// 【為什麼選擇差異化觸覺回饋】
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="c1">/// - 選中 vs 取消必須有不同的觸覺回饋類型
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="c1">/// - selectionClick 提供明確的「確認」感受
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="c1">/// - lightImpact 提供輕微的「狀態變更」提示
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="c1">/// 【修改約束】
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="c1">/// - 觸覺回饋時機不可調換（與使用者預期一致）
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="c1">/// - 陰影變化動畫時長需保持 &lt; 250ms（符合 Material Design 規範）
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="c1">/// 【維護警告】
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="c1">/// - 此 Widget 被 3 個書庫頁面使用
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="c1">/// - 修改視覺回饋會影響整體使用者體驗一致性
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="c1"></span><span class="kd">class</span> <span class="nc">BookListItem</span> <span class="kd">extends</span> <span class="n">StatelessWidget</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">  <span class="c1">// ...
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="c1"></span><span class="p">}</span></span></span></code></pre></div><p>模糊描述也不可取——「處理書籍相關邏輯」等於沒有描述。過時的 TODO 必須清除，否則會讓人以為某個功能還沒實作。</p>
<h2 id="第五原則事件驅動架構的特殊需求">第五原則：事件驅動架構的特殊需求</h2>
<p>在 UseCase 或 Domain 層，函式名稱包含 <code>handle*</code>、<code>on*</code>、<code>process*</code>、<code>emit*</code>、<code>dispatch*</code>，或回傳類型為 <code>Future&lt;&gt;</code>、<code>Stream&lt;&gt;</code> 的函式，都需要標示其在事件流中的角色：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dart" data-lang="dart"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">/// 【需求來源】UC-01: Chrome Extension 匯入書籍資料
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="c1">/// 【規格文件】docs/app-requirements-spec.md#chrome-extension-import
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="c1">/// 【設計方案】方案C-1基礎版 (v0.12.7 Phase 1)
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="c1">/// 【工作日誌】docs/work-logs/v0.12.7.md - 方案研究和設計決策
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="c1">/// 【事件類型】BookAdded 事件處理
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="c1">/// 【修改約束】修改時需確保事件流完整性，避免影響上游訂閱者
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="c1">/// 【維護警告】此函式被 3 個 UseCase 依賴，修改前需檢查影響範圍
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="c1"></span><span class="n">Future</span><span class="o">&lt;</span><span class="kt">void</span><span class="o">&gt;</span> <span class="n">handleBookAdded</span><span class="p">(</span><span class="n">BookAddedEvent</span> <span class="n">event</span><span class="p">)</span> <span class="kd">async</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="c1">// 實作...
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="c1"></span><span class="p">}</span></span></span></code></pre></div><p>以 <code>_</code> 開頭的私有輔助函式（<code>_isValid*</code>、<code>_format*</code>、<code>_convert*</code>、<code>_validate*</code> 等）不包含業務邏輯，豁免詳細業務註解。</p>
<h2 id="第六原則widget-獨立性的明確標示">第六原則：Widget 獨立性的明確標示</h2>
<p>非私有命名（不以 <code>_</code> 開頭）、繼承自 <code>StatefulWidget</code>、<code>ConsumerWidget</code>、<code>StreamBuilder</code> 或 <code>FutureBuilder</code> 的 Widget，具備獨立狀態，需要明確記錄需求來源和修改約束：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dart" data-lang="dart"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">/// 【需求來源】UC-05: 雙模式書庫展示切換
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="c1">/// 【規格文件】docs/ui_design_specification.md#book-list-item
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="c1">/// 【設計方案】方案C-1基礎版 - 陰影刻痕變化 + 觸覺回饋
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="c1">/// 【工作日誌】docs/work-logs/v0.12.7.md - UI 互動設計
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="c1">/// 【Widget 類型】獨立狀態管理 Widget
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="c1">/// 【修改約束】此 Widget 具備獨立狀態，下層刷新不觸發上層重建
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="c1">/// 【維護警告】修改前需確認子 Widget 依賴關係
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="c1"></span><span class="kd">class</span> <span class="nc">BookListItem</span> <span class="kd">extends</span> <span class="n">StatefulWidget</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="c1">// 實作...
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="c1"></span><span class="p">}</span></span></span></code></pre></div><p>私有的 <code>StatelessWidget</code>（如 <code>_BookTitleText</code>、<code>_ProgressBar</code>）和純展示型組件，只展示上層傳遞的資料，豁免詳細業務邏輯註解。</p>
<h2 id="第七原則工作日誌與規格文件的追溯鏈">第七原則：工作日誌與規格文件的追溯鏈</h2>
<p>設計決策涉及複雜研究或多方案比較時，幾行註解無法承載所有背景，需要建立追溯鏈：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dart" data-lang="dart"><span class="line"><span class="ln">1</span><span class="cl"><span class="o">///</span> <span class="err">【工作日誌】</span><span class="n">docs</span><span class="o">/</span><span class="n">work</span><span class="o">-</span><span class="n">logs</span><span class="o">/</span><span class="n">v0</span><span class="p">.</span><span class="m">12.7</span><span class="p">.</span><span class="n">md</span> <span class="o">-</span> <span class="err">方案</span><span class="n">C</span><span class="o">-</span><span class="m">1</span><span class="err">基礎版設計</span></span></span></code></pre></div><p>維護者能循著這條鏈找到完整的決策記錄。業務邏輯也可以指向規格文件章節：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dart" data-lang="dart"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1">/// 【規格文件】docs/app-requirements-spec.md#section-name
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1"></span><span class="o">///</span> <span class="err">【規格文件】</span><span class="n">docs</span><span class="o">/</span><span class="n">event</span><span class="o">-</span><span class="n">driven</span><span class="o">-</span><span class="n">architecture</span><span class="o">-</span><span class="n">design</span><span class="p">.</span><span class="n">md</span><span class="err">#</span><span class="n">event</span><span class="o">-</span><span class="n">flow</span></span></span></code></pre></div><p>這讓程式碼成為整個需求、設計、實作文件體系的一部分，而不是孤立的存在。</p>
<h2 id="品質驗證兩個測試">品質驗證：兩個測試</h2>
<p><strong>可執行性測試</strong>：維護者看到這條註解後，能理解業務需求嗎？修改約束明確嗎？需求來源可以追溯嗎？</p>
<p><strong>必要性測試</strong>：移除這條註解後，是否會遺失業務脈絡？如果移除後仍能理解程式邏輯，就要檢查它是否只是在重述程式碼。如果內容過時，直接刪除，不要保留會誤導維護者的假資訊。</p>
<h2 id="結論">結論</h2>
<p>好的程式碼是自說明的，但好的業務系統還需要一個跨越時間的溝通機制，讓六個月後接手的人能理解每個設計決策背後的原因，不會在不了解背景的情況下破壞原始設計。</p>
<p>這就是我們對程式碼註解的重新定位——需求的守護者。</p>
<p>這是需求保護機制，不是文書工作。</p>]]></content:encoded></item></channel></rss>