Structuring with SOLID(用 SOLID 原則做結構決策)

本 reference 為「文章 / 模組 / 系列的結構決策」情境:該不該拆篇、擴充點放哪裡、引用往哪個方向、讀者怎麼分流。

適用:單篇文章長出第二個責任時的拆分判斷;系列 / 文集成長時的擴充點設計;方法論層與案例層的依賴方向檢查;多讀者群的入口設計;對既有文集做結構 review。 不適用:文集的組織操作模板(三層結構、MOC 格式,見 SKILL.md 路由到 managing-article-collections);單篇內部的段落寫法(見 SKILL.md 路由到 writing-articles)。

自包含聲明:閱讀本文件不需要先讀其他 reference。SOLID 五原則的程式定義在文內就地給出、不預設讀者熟悉物件導向設計。


何時參閱本文件

觸發情境對應章節
一篇文章越寫越長、懷疑塞了兩個主題S 單一責任
每次加新內容都要回頭改多篇既有文章O 開放封閉
description / 索引條目跟內文對不上L 契約履行
文章要服務多種讀者、內容交錯I 讀者分流
方法論文件跟案例文件互相引用、方向混亂D 依賴方向
對整個文集做一輪結構 review結構檢查清單

為什麼結構決策需要獨立指引

文章體系跟程式體系承受同一組結構壓力:內容會變動、體系會擴充、讀者多樣、單位之間有依賴。單篇寫作的品質規則(原子化、意圖顯性、可查詢性)管的是單位內部;結構壓力發生在單位之間——哪篇承擔什麼、誰引用誰、新內容往哪放。SOLID 原則管理的正是「多單位系統的責任分配與依賴方向」、跟單位是函式還是文章無關、所以可以映射。

分工定位:原子化原則(一卡一概念)管原子層、本文件的 SOLID 映射管組合層。S 是兩層的接縫——「一卡一概念」跟「一篇一責任」是同一條原則在不同粒度的形式。

概念對應表:

程式概念文章對應物共同承受的壓力
模組一篇文章 / 一張卡都是一個責任單位
介面title、description、index 條目都是使用者看到的承諾
呼叫者讀者都從承諾進入、依賴行為符合承諾
依賴引用、前置知識都有方向、都會傳遞變動
重構改版、拆篇、搬段落都要在不破壞使用者的前提下進行

S 單一責任:一篇文章一個變動理由

程式定義:一個模組只有一個變動理由。寫作映射:一個寫作單位只承擔一個知識責任、只因一種讀者需求而修改。

判別測試

  • 變動理由測試——這篇文章會因為什麼事件需要更新?獨立事件超過一種、就是拆分候選。
  • 刪除測試——刪掉某段後核心論證仍完整、該段承擔的就是另一個責任、該路由出去。

:一篇個體案例分析內嵌了完整的跨個體比較(多維比較表 + 逐維差距拆解)。兩個責任互相擠壓——案例深度被比較表佔空間、比較內容被鎖在單一個體的敘事裡、加入第三個比較對象時不知道改哪篇。

:案例篇專注個體自身的分析、比較獨立成篇;案例篇留一句基準引用(「同業 X 的指標是 N、差距 M」)建立相對位置、完整比較用連結路由。拆分後案例篇騰出空間深化自身分析、比較篇可獨立擴充新對象。

邊界:一兩句的基準引用是案例分析的一部分、不觸發拆分;完整的多維比較表才是第二責任的訊號。

O 開放封閉:對擴充開放、對重寫封閉

程式定義:對擴充開放、對修改封閉。寫作映射:預期會成長的結構、設計成「新增用追加的、既有內容維持穩定」。

擴充點設計是這條原則的可操作形式:比較表的比較軸、索引的表格結構、系列的骨架是穩定結構、成長發生在往裡面加行加篇。

:比較內容散落在多篇個體文章裡、每篇各自解釋別人的模式。加入新比較對象時要改動每一篇。

:比較篇的比較軸(成本結構 / 集中度 / 策略 / 估值這類穩定維度)設計好之後、新對象加行即可、既有個體文章零改動。

邊界(最重要):O 管結構骨架、內容不在管轄範圍。把 O 推到內容層會變成「所有文章共用同一模板」——情境敘事、案例語言、失敗條件依各自情境重寫、守 O 的只有表格軸、索引結構、系列骨架這些擴充點。結構原則被拿來否定合理的情境差異時(「這篇的章節跟那篇長得不一樣」)、是誤用訊號。

L 契約履行:同類文章對讀者履行同一契約

程式定義(Liskov 替換):子型別可以替換父型別而不破壞呼叫者的預期。寫作映射在讀者預期層、有兩個檢查面:

  • 介面對實作:title、description、index hook 是介面、內文是實作。讀者依承諾進入、內文必須履行——description 承諾「批判性分析」、內文就要有批判檢驗。
  • 同類對同類:同一個索引分類下的文章對讀者履行同型的功能契約——讀者讀過一篇、對下一篇的功能預期(有定位、有判讀、有可遷移框架)應該成立。

:正文改版後建立了新的核心概念、title 跟索引條目保留舊 frame——介面跟實作脫鉤、讀者從索引進來拿到的內容跟承諾不符。另一種形態:description 摘要把本體的「條件允許(可延後但要記錄)」壓成「絕對禁止」、讀者依摘要行動就偏離本體。

:每輪內容修訂把 title / description / 索引條目列入同一次 review 的 surface 清單;摘要壓縮時可以丟細節、模態詞(可以 / 必須 / 禁止 / 建議)跟本體保持一致。

邊界:契約是功能層承諾、模板是結構層複製——L 要求前者。這也是五個映射裡最依賴類比延伸的一條:程式的替換性有型別系統驗證、讀者預期沒有、可操作的形式就是「介面承諾 vs 實作履行」的比對。

I 讀者分流:讀者不被迫消費無關內容

程式定義(介面隔離):client 不該被迫依賴用不到的方法。寫作映射:不同讀者群透過不同入口進入體系、每條入口只包含該讀者需要的內容。

實作在三個層次:

層次手段
模組層讀者路線表——同一批文章、對不同讀者群給不同的讀取序列
文章層視角分段——多視角並存時各自成段、讀者可跳過非自身視角
術語層術語卡外移——解釋放獨立卡片、需要的讀者點進去、熟悉的不被打斷

:一篇文章的目標讀者要用「和」連接(「給投資人和從業者和工程師」)、三種讀者需要的內容交錯出現、任何一種讀者都要掃過大量無關段落。

:入口層分流(模組索引給三條讀者路線)、或文章內視角分段(「投資人視角」「從業者視角」各自成段)。

文章的 I 比程式更嚴苛:程式的 caller 被迫依賴多餘介面、代價是編譯負擔;讀者被迫閱讀無關內容、代價是棄讀。

D 依賴方向:具體依賴抽象、抽象不依賴具體

程式定義(依賴反轉):高層模組跟低層模組都依賴抽象。寫作映射:具體層(案例文章)依賴抽象層(方法論、術語卡);抽象層引用具體只作為示例、不作為前提。

依賴方向決定變動傳遞方向:案例更新(資料換季)不迫使方法論改寫、方法論修正提示所有案例重檢——這個不對稱正是體系要的:抽象層穩定、具體層流動。

:方法論文件的判準用某個案例的特殊條件寫成(過度擬合)、讀者必須先讀過該案例才看得懂方法論;修改該案例時要回頭改方法論。

:方法論用自包含的通用示例說明判準、案例連結降級為選讀;案例文章引用方法論做分析框架、方法論不需要知道任何一篇案例的存在。層級規則顯式寫進體系規範(例如「能力層不反向依賴實作層」)、讓依賴方向是宣告過的 fact、不是每篇各自的判斷。


結構檢查清單

情境訊號原則行動
一篇文章有兩種獨立的更新理由S依變動理由拆篇、各自引用
完整的跨個體比較表出現在單一個體的文章裡S比較獨立成篇、個體篇留一句基準引用
每次加新內容都要改動多篇既有文章O找出擴充點(表格軸 / 索引結構)、重設計成加行加篇
description / index hook 跟內文的功能不一致L對齊介面與實作——改承諾或改內文、二選一
同分類文章功能參差、讀者預期無法遷移L對齊功能契約、結構仍依情境自由
目標讀者要用「和」連接、內容交錯無法跳讀I拆讀者路線、或文章內視角分段
讀方法論要先讀某案例才懂D方法論改自包含通用示例、案例降級為選讀連結
修案例要回頭改方法論D檢查方法論是否過度擬合該案例、特殊條件還原成通用判準

檢查時機:新文章動筆前(決定責任邊界跟依賴方向)、體系出現結構張力時(加新內容越來越貴是結構 review 的訊號)、對文集做多輪 review 時(結構軸作為獨立的檢查 frame、跟字句層 / 語意層的 frame 分輪執行)。

類比的邊界(誠實聲明)

  • 執行機制:程式違反 SOLID 由編譯器 / 測試暴露、文章違反由 review 暴露——本清單要掛進 review 流程才有效力、放著不會自己執行。
  • L 最弱:替換性在程式有型別系統驗證、在文章只有讀者預期——操作化成介面 / 實作比對就是它的極限。
  • 模板化風險:O 跟 L 被過度應用會收斂成「統一模板」。判別線:SOLID 管責任分配、依賴方向、擴充點(結構);敘事、案例語言、失敗條件描述(內容)依情境重寫、不受本清單管轄。

Version: 1.0.0 — 初版:SOLID 五原則的寫作映射(結構同構表、各原則的判別測試 / 錯對範例 / 邊界、結構檢查清單、類比邊界三聲明);從一次「個體案例 vs 跨個體比較」的實際拆分經驗抽出組合層方法、與原子化原則分層分工