リファクタリング - 属性をセットに変換する

Barbara Streisand
リリース: 2024-10-20 11:33:02
オリジナル
608 人が閲覧しました

属性をセットに変換して不変性を優先する

TL;DR: 属性にセットを使用すると、コードが簡素化され、状態管理が容易になります

対処された問題

  • 可変性
  • 複雑さ
  • 属性が汚染される
  • セッター

関連コードの匂い

ステップ

  1. 状態を表す属性を特定する
  2. 属性をセットに置き換えます: 各状態に 1 つ
  3. 属性を変更するのではなく、セット間で項目を移動するようにメソッドを調整します

サンプルコード

前に

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リファクタリング

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 サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!