ホームページ  >  記事  >  バックエンド開発  >  PHP デザイン パターン: よくある誤解と罠

PHP デザイン パターン: よくある誤解と罠

WBOY
WBOYオリジナル
2024-06-03 18:57:00467ブラウズ

PHP のデザイン パターンには利点もありますが、盲目的な使用、単一責任原則の違反、継承と委任の混同、ファクトリ メソッド パターンの乱用、SOLID 原則の誤った実装など、使用時に誤解や落とし穴もあります。 。責任連鎖パターンを通じて総額計算の責任を分離するなど、設計パターンを適切に適用すると、コードのモジュール性と保守性が向上します。

PHP デザイン パターン: よくある誤解と罠

PHP デザイン パターン: よくある誤解と罠

デザイン パターンは、コードを再利用し、重複コードを減らし、開発効率を向上させるための貴重なツールです。ただし、PHP でデザイン パターンを使用する場合、よくある誤解や落とし穴もいくつかあります。

誤解 1: デザイン パターンを盲目的に使用する

すべての状況がデザイン パターンの使用に適しているわけではありません。設計パターンを時期尚早に使用したり過剰に使用したりすると、不必要な複雑さとオーバーヘッドが発生する可能性があります。デザインパターンを選択するときは、その適合性とコードへの影響を慎重に考慮する必要があります。

誤解 2: 単一責任原則 (SRP) の誤解

SRP は、クラスの変更理由は 1 つだけであるべきであることを意味します。 SRP に違反すると、コードが疎結合になり、保守が困難になります。構成の再利用、集約、依存関係の注入などの設計パターンを使用すると、SRP を強制するのに役立ちます。誤解 3: 継承と委任の混同

継承は、新しいクラスを作成し、そのプロパティを既存のクラスから継承する方法です。委任を使用すると、あるクラスが別のクラスに委任して特定のタスクを実行できます。継承と委任を混同すると、コードのスケーラビリティと保守性の問題が発生する可能性があります。

誤解 4: ファクトリ メソッド パターンの悪用

ファクトリ メソッド パターンはオブジェクトの作成と管理に役立ちますが、過度に使用すると、神聖なオブジェクト (シングルトン) や依存性注入コンテナ (DI) コンテナが作成される可能性があります。ファクトリ メソッド パターンは、特定のタイプのオブジェクトを作成する必要がある場合にのみ、慎重に使用してください。

誤解 5: 間違った SOLID 実装

SOLID (単一責任、オープン/クローズ、リスコフ置換、インターフェース分離、依存関係反転) 原則は、優れた保守可能なコードを設計するための指針を提供します。ただし、SOLID 原則が適切に適用されていない場合、スケーラビリティの問題が発生したり、コード内の構造が理解しにくくなる可能性があります。

実際のケース:

Cart クラスがユーザーのショッピング カート内のアイテムの管理を担当するショッピング カート システムを考えてみましょう。ショッピングカート内の商品に基づいて合計金額を計算したいと考えています。

バグ実装: Cart 类负责管理用户购物车的物品。我们想根据购物车的物品计算总金额。

错误实施:

class Cart {
  private $items;

  public function __construct() {
    $this->items = [];
  }

  public function addItem(Item $item) {
    $this->items[] = $item;
  }

  public function calculateTotalAmount() {
    $total = 0;
    foreach ($this->items as $item) {
      $total += $item->getPrice();
    }
    return $total;
  }
}

这个实现违反了 SRP,因为 Cart 类既负责存储物品又负责计算总金额。

改进的实现:

我们可以使用职责链模式来分离计算总金额的职责:

interface TotalCalculator {
  public function calculateTotal(array $items);
}

class ItemTotalCalculator implements TotalCalculator {
  public function calculateTotal(array $items) {
    $total = 0;
    foreach ($items as $item) {
      $total += $item->getPrice();
    }
    return $total;
  }
}

class Cart {
  private $items;
  private $totalCalculator;

  public function __construct(TotalCalculator $totalCalculator) {
    $this->items = [];
    $this->totalCalculator = $totalCalculator;
  }

  public function addItem(Item $item) {
    $this->items[] = $item;
  }

  public function calculateTotalAmount() {
    return $this->totalCalculator->calculateTotal($this->items);
  }
}

通过职责链模式,我们分离了计算总金额的职责,使 Cart

rrreee🎜 Cart クラスがアイテムの保存と合計金額の計算の両方を担当するため、この実装は SRP に違反します。 🎜🎜🎜実装の改善:🎜🎜🎜責任連鎖パターンを使用して、総額計算の責任を分離できます:🎜rrreee🎜責任連鎖パターンを使用すると、総額計算の責任を分離し、Cart コードはよりモジュール化されており、保守しやすくなっています。 🎜

以上がPHP デザイン パターン: よくある誤解と罠の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。