通过将属性转换为集合来支持不变性
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中文网其他相关文章!