當一組參數老是一起穿梭於各函式之間,就把它們打包成一個專屬物件。這揭示了它們的關係、縮短了函式簽章,也為更深入、更好維護的改動鋪路。
🧠 Why It's a Problem
一群總是結伴出現的參數,其實在暗示一個尚未命名的概念。把它們組成一個結構,設計的抽象層次就提升了,對領域的理解也跟著簡化。
- 參數成群:多個參數被一起傳給多個函式。
- 資料封裝:把相關欄位封裝成單一、連貫的結構。
- 簡化簽章:縮短冗長的參數列表以提升清晰度。
- 為未來做準備:日後要擴充或加驗證都有了落腳點。
WARNING
對於瑣碎或一次性的呼叫,參數物件反而會增加不必要的複雜度。這個手法的價值在於同一組參數「反覆」出現。
⚖️ Refactoring
機械步驟:① 建立一個結構來承載那組參數 → ② 用 Change Function Declaration 把新物件加進參數列 → ③ 逐一更新呼叫端,改傳這個物件 → ④ 把函式內對個別參數的存取換成從物件取欄位 → ⑤ 測試。
前 — 相關欄位散成一串參數
function processData(name, age, email) {
console.log(`Name: ${name}, Age: ${age}, Email: ${email}`);
}
processData('Alice', 30, 'alice@example.com');name / age / email 明明描述同一個人,卻被拆成三個各自為政的參數。
後 — 打包成一個連貫物件
class PersonData {
constructor(name, age, email) {
this.name = name;
this.age = age;
this.email = email;
}
}
function processData(person) {
console.log(`Name: ${person.name}, Age: ${person.age}, Email: ${person.email}`);
}
const alice = new PersonData('Alice', 30, 'alice@example.com');
processData(alice);簽章縮短了,「人」這個概念被顯式命名;日後要加欄位或驗證,都有 PersonData 這個家可放。
NOTE
這個新物件常常會慢慢長出屬於它自己的行為——那正是 Extract Class 的起點:資料聚在一起後,相關方法也搬進來。
🔑 Takeaways
- Introduce Parameter Object 把成群結隊的參數收攏成一個有名字的結構。
- 觸發訊號:同一組參數反覆傳給多個函式。
- 好處:揭示關係、縮短簽章、給未來的擴充與驗證一個落腳點。
- 瑣碎、一次性的呼叫別硬套,會增加無謂複雜度。
- 物件長出行為後,往 Extract Class 演進。
No notes yet — jot your takeaways or Q&A here.