論述基礎與限制

本卡從一次單檔拆成八檔的重構與隨後的四輪審查抽出。六處實例、每一輪都有;單一批次,未量測不同體裁的發生率。

核心原則

散文裡的數字有兩種,處置不同。 純描述性的(「九個函式」「四百二十八行」)刪掉之後讀者理解不受影響,那一種是推理殘留、直接刪。承擔指涉功能的(「後三列」「三則」「共用兩節」)在告訴讀者去看哪幾個,刪掉之後指涉就斷了——這一種沒有「刪掉」這個出口,而它正是結構改動後失真的那一批。

這一類的產生源是結構改動。 寫下「後三列」的時候表就是三列。加一列、拆一檔、把一節搬走,數字當場過期,而做這些改動的人沒有理由回頭讀那一句。所以每一輪修法都在生產新的。

修法是改成不自帶計數,把數字改對只買到一輪。 改對的數字在下一次結構改動還會漂,而下一次同樣不會有人想起這一句。判別一個數字安不安全的問句是:這個數字由什麼決定。 由一個會被改動的集合的成員數決定,不安全;由一個不隨結構增刪的東西決定(模式數、階段數、概念數),安全。

實例:四輪裡的六處

一份文件從單檔拆成八檔,隨後四輪審查每一輪都抓到這一類:

原文改動之後的事實這個數字由什麼決定
六檔七檔拆出來的檔數
後三列表已六列表的列數
三條路徑上五條同節另兩處已改六條條目數
五條齊全檢查已增為六條條目數
三則四則範例則數
共用兩節四份共用檔的份數

最後一處值得單獨看:共用的檔案由兩份增為四份,而那句話裡不只數字錯了,量詞也錯了(節變成檔)。結構改動同時動了計數與計數的單位,而修的人容易只注意到其中一個。

「三則」那一處的修法示範了安全的改法:改成「四則涵蓋三個模式的四個關鍵步驟」之後仍然有數字,而那幾個數字綁在模式與步驟上,那兩個集合不隨後續增刪範例而變動。

修法

指涉表格成員的,改成指向表本身或直接具名。 「後三列」寫成「表格下半處理跨檔的那幾列」,或直接寫出那幾列的名字。

指涉份數的,改成描述涵蓋範圍。 讓數字綁在概念上,而概念數不隨成員增刪而變動。

每一輪結構改動之後,掃這一輪動過的那幾節的數詞。 掃描的觸發是改動,不是完稿——完稿時掃只涵蓋最後一輪寫進去的。

章節編號是同一類,而且是最容易漏的一種

判別問句還有一個更省力的版本:這個數字是我寫的,還是排版產生的。 排版產生的那些——章節編號、清單序號、節頭裡的層級號——同樣由一個會被改動的集合決定,同樣在結構改動後過期,而且沒有人會 review 它們,因為它們看起來像結構、不像內容。

一次拆分後的整體通讀給出這個形態的證據:抓到的合成缺陷全部是同一個形狀,都是拆分把編號與計數留在原地——節頭寫著某個編號而它底下的小節已經外移、編號跳到十二而前面只剩兩節、兩處「見某節」而該節已經搬走。同一批的處置是把全庫的章節編號整批移除而不是重編,理由與散文計數相同:重編過的號下次還會漂,而拆分之後編號本來就失去了它原本承載的順序意義。

留下編號的正當理由只有一個——它是被別人引用的錨。而那個理由本身有問題,因為引用錨要取語意標題、不取位置編號:引用端該引的是標題,於是編號的最後一個用途也不成立。那一批的 32 處移除逐處查過,沒有一處是因為被引用而留下的——順序是先把內部指涉從編號改成名稱,再把編號整批拿掉。

射程限於章節編號,借自上游權威的序數命名不在此列。 同一份文件裡「第 1 層 / 第 2 層 / 第 3 層」的數字承載的是上游規格自己的命名(載入順序),它是那份文件與官方對得上的詞,而不是位置索引。這一種與章節編號在掃描底下長得一模一樣,所以判別要在動手前多問一句:這個序數是本文件排出來的,還是外面既有的名字。 是外面的名字就照抄不動,理由與外部凍結的品牌名(SOLID 五原則、OWASP Top 10)相同——那個數字由發布方持有,不由本文件的結構決定。

偵測缺口

工具層的檢查掃的是標題裡的成員數(「六大原則」這一類),散文位置的抓不到,而散文位置的數量遠多於標題。目前這一類只有針對性複掃這一條路徑,掃描的單位是「這一輪動過的段落」。

跟其他原則的關係

  • 集合命名用角色、不內嵌數量 — 同一個機制的另一個載體。那裡在名稱上,名稱是被複製最多次的字串、缺陷隨引用繁殖,而它可以用工具掃;本卡在散文裡,不被複製而每一輪改動再生產一批,且掃不到。
  • 列舉與數字殘留在定義型文件會製造維護債務 — 本卡限定它的判斷標準射程。那一張問「拿掉之後讀者理解受不受影響」,受影響就留下;而承擔指涉功能的計數對這一問一律答「受影響」,於是留下之後沒有第二個出口。本卡補的正是那個出口:留下指涉、換掉計數。
  • 更新一個可數宣稱時,加法不算重算 — 修這一類時最常見的失誤。把「三」改成「四」是加法,而正確的動作是重新數一遍那個集合,再決定這個數字該不該留在句子裡。
  • 逐輪修法掛回原句,累積出來的腫脹只有跨輪比對看得見 — 同族:兩者都是每一輪修法都在生產新的問題,而單輪的 frame 看不到。
  • #343 拆分產生的缺陷落在檔與檔的交界:本卡的判別問句(這個數字由什麼決定)在那裡是六種拆分形態之一,而那張卡補的是位置——本卡管的這一類,連同另外五類,全部落在檔與檔之間的交界上,所以逐檔審查對它們一律恆真。那張卡也記下拆分的位置座標該怎麼寫(上一步與下一步,不寫總數)。

判讀徵兆

  • 一句話裡的數字指向另一個結構單位的成員數,而那個結構單位這一輪被動過。
  • 表格增減列之後,正文裡描述那張表的句子沒有進入這次的改動範圍。
  • 修法紀錄寫的是「把三改成四」。
  • 同一節裡的同一個計數在幾處出現,而只有其中一部分被改。