引入參數物件 (Introduce Parameter Object)

★★★★Draft

FromRefactoring

📚 From the Books

引入參數物件 (Introduce Parameter Object)Refactoring Moves

當一組參數老是一起穿梭於各函式之間,就把它們打包成一個專屬物件。這揭示了它們的關係、縮短了函式簽章,也為更深入、更好維護的改動鋪路。

🧠 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

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading