属性をセットに変換して不変性を優先する
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
アンジェロ・ジョルダーノによるPixabayの画像
この記事はリファクタリング シリーズの一部です。
以上がリファクタリング - 属性をセットに変換するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。