透過將屬性轉換為集合來支援不變性
TL;DR:使用屬性集可以簡化程式碼並使狀態管理更容易
class Bill { amount: number; paid: boolean; constructor(amount: number) { this.amount = amount; this.paid = false; } pay() { if (!this.paid) { this.paid = true; } } } const bill = new Bill(100); console.log(bill.paid); // false bill.pay(); console.log(bill.paid); // true
// 1. Identify attributes representing states class Accountant { // 2. Replace the attributes with sets: one for each state unpaidBills: Set<Bill>; paidBills: Set<Bill>; constructor() { this.unpaidBills = new Set(); this.paidBills = new Set(); } addBill(bill: Bill) { this.unpaidBills.add(bill); } payBill(bill: Bill) { // 3. Adjust methods to move items // between sets instead of mutating attributes if (this.unpaidBills.has(bill)) { this.unpaidBills.delete(bill); this.paidBills.add(bill); } } } class Bill { amount: number; constructor(amount: number) { this.amount = amount; } } const bill = new Bill(100); const accountant = new Accountant(); accountant.addBill(bill); console.log(accountant.unpaidBills.has(bill)); // true accountant.payBill(bill); console.log(accountant.paidBills.has(bill)); // true
[X] 半自動
當您的屬性不依賴特定的索引行為時,此重構是安全的。
由於集合不維護元素順序,請檢查您的邏輯是否依賴順序。
實體本質上是不可變的。
使用集合可確保唯一性並簡化邏輯。
新增元素之前不再需要檢查重複項。
並集、交集和差集等操作變得簡單,使您的程式碼更易於維護和靈活。
集合不保留元素順序。
如果您的邏輯依賴於順序,則轉換為集合可能不合適,您應該使用有序集合或陣列
您可以提示您的 AI 助理為您進行此重構。
Without Proper Instructions | With Specific Instructions |
---|---|
ChatGPT | ChatGPT |
Claude | Claude |
Perplexity | Perplexity |
Copilot | Copilot |
Gemini | Gemini |
https://dev.to/mcsee/refactoring-001-remove-setters-26cg
圖片由 Angelo Giordano 在 Pixabay上
本文是重構系列的一部分。
以上是重構 - 將屬性轉換為集合的詳細內容。更多資訊請關注PHP中文網其他相關文章!