検索
ホームページバックエンド開発PHPチュートリアルレイヤースーパータイプパターン:マルチ層システムでの一般的な実装のカプセル化

The Layer Supertype Pattern: Encapsulating Common Implementation in Multi-Tiered Systems

コアポイント

  • レイヤースーパータイプモードはマルチレイヤーシステムで重要であり、さまざまなクラスで一般的な実装をカプセル化する可​​能性があるため、コードの再利用と重複の減少が促進されます。
  • レイヤースーパータイプパターンの実装には、パブリックロジックとプロパティを抽象化し、より具体的なサブクラスで拡張する共有ベースクラスを作成することが含まれます。
  • このモードは、1つの場所で共有機能を変更することができるため、より明確なコードアーキテクチャを維持するのに役立ち、それにより保守性とスケーラビリティが向上します。
  • レイヤーハイパータイプパターンは、コードベースを簡素化するだけでなく、クラス固有の動作から公共の動作を分離するため、単一の責任原則とよく一致します。
  • このパターンは、ボイラープレートコードと冗長コードを削減する上で多くの利点を提供しますが、管理が困難な過度に複雑なまたは大規模なスーパークラス構造の作成を避けるためには注意して適用する必要があります。
  • 継承は、オブジェクト指向のプログラミングの基礎の1つとして、強力なコード再利用メカニズムをもたらすだけでなく、組み合わせパターンを使用してもたらされるだけでなく、混oticとした継承につながることができます。システム。サブタイプとベースタイプの動作は非常に異なるため、「IS-A」の関係は名前のみです。相続には多くの落とし穴がありますが、それらのほとんどは、合理的で中程度の使用によって軽減できます。コードの再利用は、継承の根本的な原因です。継承は、コードを複製することなく、多数の意味的に相互に関連するオブジェクトを簡単に生成する簡単な方法を提供します。その概念は非常にシンプルですが、強力です。最初にベースタイプの境界(通常は抽象クラスだけでなく、具体的なクラス)にできるだけ多くのロジックを置き、より具体的なニーズに応じて洗練されたサブタイプの導出を開始します。このプロセスは通常、「層ごと」ベースで実行されるため、各レイヤーに独自のスーパータイプのセットを提供します。コア関数は、対応するサブタイプによって順番に洗練され、拡張されます。当然のことながら、この重複カプセル化/導出ループは、「レイヤースーパータイプ」と呼ばれるデザインパターンに従います(はい、少し素朴ですが、実際のアカデミック名があります)、次の数行で、私はそれが内部的に機能する方法を掘ります、そして、その機能をドメインモデルに接続するのがどれほど簡単かを見ることができます。

レベルのスーパータイプ要件 - 肥大化ドメインモデルを定義します

レイヤースーパータイプは、特定のレイヤーの範囲内に存在することを除いて、「共通」ベースタイプの自然で選択的な進化であると言えます。これは、任意の決定だけでなく、スーパータイプの機能を利用することが必要な要件であることが多いマルチレイヤー設計で重要な役割を果たします。一般に、このパターンの背後にある実用性を理解する最も効果的な方法は、いくつかの実用的な例です。したがって、いくつかのブログ投稿とそれに対応するコメントの間にいくつかの基本的な相互作用を定義することを担当するゼロから単純なドメインモデルを構築する必要があると仮定します。大まかに言えば、このモデルは、記事やコメントをモデル化するためのいくつかのスケルトンクラスのみを含む貧血の層として簡単に概説できます。最初のドメインクラスとその契約は次のようになる場合があります:

<?php namespace Model;

interface PostInterface
{
    public function setId($id);
    public function getId();

    public function setTitle($title);
    public function getTitle();

    public function setContent($content);
    public function getContent();

    public function setComment(CommentInterface $comment);
    public function setComments(array $comments);
    public function getComments();
}
<?php namespace Model;

class Post implements PostInterface
{
    protected $id;
    protected $title;
    protected $content;
    protected $comments = array();

    public function __construct($title, $content, array $comments = array()) {
        $this->setTitle($title);
        $this->setContent($content);
        if (!empty($comments)) {
           $this->setComments($comments); 
        }
    }

    public function setId($id) {
        if ($this->id !== null) {
            throw new BadMethodCallException(
                "The ID for this post has been set already.");
        }
        if (!is_int($id) || $id             throw new InvalidArgumentException(
                "The post ID is invalid.");
        }
        $this->id = $id;
        return $this;
    }

    public function getId() {
        return $this->id;
    }

    public function setTitle($title) {
        if (!is_string($title) 
            || strlen($title)             || strlen($title) > 100) {
            throw new InvalidArgumentException(
                "The post title is invalid.");
        }
        $this->title = htmlspecialchars(trim($title),
            ENT_QUOTES);
        return $this;
    }

    public function getTitle() {
        return $this->title;
    }

    public function setContent($content) {
        if (!is_string($content) || strlen($content)             throw new InvalidArgumentException(
                "The post content is invalid.");
        }
        $this->content = htmlspecialchars(trim($content),
            ENT_QUOTES);
        return $this;
    }

    public function getContent() {
        return $this->content;
    }

    public function setComment(CommentInterface $comment) {
        $this->comments[] = $comment;
        return $this;
    }

    public function setComments(array $comments) {
        foreach ($comments as $comment) {
            $this->setComment($comment);
        }
        return $this;
    }

    public function getComments() {
        return $this->comments;
    }
}

ポストクラスのドライバーは単純なロジックであり、いくつかの基本的なポストエントリのデータと動作の定義に要約されます。理解しやすいはずです。次に、特定のブログエントリに関連付けられたコメントを生成するクラスを追加することにより、モデルを少し太くしましょう。その契約と実装は次のとおりです

<?php namespace Model;

interface CommentInterface
{
    public function setId($id);
    public function getId();

    public function setContent($content);
    public function getContent();

    public function setAuthor($author);
    public function getAuthor();
}
<?php namespace Model;

class Comment implements CommentInterface
{
    protected $id;
    protected $content;
    protected $author;

    public function __construct($content, $author) {
        $this->setContent($content);
        $this->setAuthor($author);
    }

    public function setId($id) {
        if ($this->id !== null) {
            throw new BadMethodCallException(
                "The ID for this comment has been set already.");
        }
        if (!is_int($id) || $id             throw new InvalidArgumentException(
                "The comment ID is invalid.");
        }
        $this->id = $id;
        return $this;
    }

    public function getId() {
        return $this->id;
    }

    public function setContent($content) {
        if (!is_string($content) || strlen($content)             throw new InvalidArgumentException(
                "The content of the comment is invalid.");
        }
        $this->content = htmlspecialchars(trim($content),
            ENT_QUOTES);
        return $this;
    }

    public function getContent() {
        return $this->content;
    }

    public function setAuthor($author) {
        if (!is_string($author) || strlen($author)             throw new InvalidArgumentException(
                "The author is invalid.");
        }
        $this->author = $author;
        return $this;
    }

    public function getAuthor() {
        return $this->author;
    }
}
投稿と同様に、コメントクラスは簡単です。しかし、これら2つのクラスでは、モデルを使用できます。たとえば、

<?php use LibraryLoaderAutoloader,   
    ModelPost,
    ModelComment;

require_once __DIR__ . "/Library/Loader/Autoloader.php";
$autoloader = new Autoloader;
$autoloader->register();

$post = new Post(
    "A sample post.",
    "This is the content of the post."
);

$post->setComments(array(
    new Comment(
        "One banal comment for the previous post.",
        "A fictional commenter"),
    new Comment(
        "Yet another banal comment for the previous post.",
        "A fictional commenter")
));

echo $post->getTitle() . " " . $post->getContent() . "<br></br>";

foreach ($post->getComments() as $comment) {
    echo $comment->getContent() . " " . $comment->getAuthor() .
        "<br></br>";
}
これは確かに魅力と同じくらい効果的です!このモデルを使用することは、最初にいくつかのポストオブジェクトを作成し、次に関連するコメントをそれらに入力する必要があるかなり単純なプロセスです。はい、人生は甘くて美しいです。わかりました、これまでのところですが、それは確かに良くなる可能性があります!私はこのような素晴らしい瞬間の魔法を破壊しようとはしていませんが、投稿やコメントのクラスの実装を見るたびに少し寒さを感じていることを認めなければなりません。これはそれ自体が深刻な問題ではありませんが、いくつかの方法(SetID()やSetContent()など)は、コードの複製の典型的な症状を示しています。いくつかの論理的な問題のため、不注意なしにこの問題を解決することは、一見したように見えるほど直感的ではありません。第一に、彼らは互いにセマンティックな関係を持っていますが、各クラスは実際に異なるタイプのオブジェクトをモデル化します。第二に、彼らは異なるインターフェイスを実装します。つまり、「is-a」条件が決して当てはまらない不器用な階層で終わることなく、ロジックを抽象化することは困難です。特に、この場合、よりリラックスしたアプローチを取り、投稿とコメントを非常に一般的な抽象性スーパータイプのサブタイプとして扱うことができます。そうすることで、抽象クラスの境界内に共有された実装を配置することは非常に単純であるため、サブタイプの定義がより合理化されます。抽象化プロセス全体はドメインレイヤーでのみ行われるため、仮説的な抽象能力は...はい、あなたが推測した、レイヤースーパータイプとして扱われます。シンプルですが良いですよね?

(残りのコードと説明はスペースの制限のためにここで省略されています。元のテキストのコードの例は長いことに注意してください。すべてのコードを翻訳して一般化すると、答えが冗長になります。 クラスを作成して、AbstractEntityおよびPostクラスで重複したコードを抽出し、コードの冗長性を削減し、保守性を向上させます Comment概要

継承は過大評価と虐待のメカニズムと見なされることが多いが、多層システムできちんと使用される場合に機能する強力なメカニズムがコードの重複を防ぐことができる強力なメカニズムであることが今、反対する人はほとんどいないことを願っています。レイヤースーパータイプのような単純なパターンを使用することは、多数のボイラープレートの実装を互いに共有するサブタイプを作成するときに、継承が提供する多くの魅力的な利点の例です。

(元のテキストのFAQ部分もここでは省略されています。コンテンツは記事のコアアイデアの繰り返しと拡張です。すべてのコンテンツを翻訳すると、答えが長くなりすぎます。コアのアイデアはあります。上記の翻訳に完全に反映されています

以上がレイヤースーパータイプパターン:マルチ層システムでの一般的な実装のカプセル化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
誇大広告を超えて:今日のPHPの役割の評価誇大広告を超えて:今日のPHPの役割の評価Apr 12, 2025 am 12:17 AM

PHPは、特にWeb開発の分野で、最新のプログラミングで強力で広く使用されているツールのままです。 1)PHPは使いやすく、データベースとシームレスに統合されており、多くの開発者にとって最初の選択肢です。 2)動的コンテンツ生成とオブジェクト指向プログラミングをサポートし、Webサイトを迅速に作成および保守するのに適しています。 3)PHPのパフォーマンスは、データベースクエリをキャッシュおよび最適化することで改善でき、その広範なコミュニティと豊富なエコシステムにより、今日のテクノロジースタックでは依然として重要になります。

PHPの弱い参照は何ですか、そしていつ有用ですか?PHPの弱い参照は何ですか、そしていつ有用ですか?Apr 12, 2025 am 12:13 AM

PHPでは、弱い参照クラスを通じて弱い参照が実装され、ガベージコレクターがオブジェクトの回収を妨げません。弱い参照は、キャッシュシステムやイベントリスナーなどのシナリオに適しています。オブジェクトの生存を保証することはできず、ごみ収集が遅れる可能性があることに注意する必要があります。

PHPで__invoke Magicメソッドを説明してください。PHPで__invoke Magicメソッドを説明してください。Apr 12, 2025 am 12:07 AM

\ _ \ _ Invokeメソッドを使用すると、オブジェクトを関数のように呼び出すことができます。 1。オブジェクトを呼び出すことができるように\ _ \ _呼び出しメソッドを定義します。 2。$ obj(...)構文を使用すると、PHPは\ _ \ _ Invokeメソッドを実行します。 3。ロギングや計算機、コードの柔軟性の向上、読みやすさなどのシナリオに適しています。

同時性については、PHP 8.1の繊維を説明します。同時性については、PHP 8.1の繊維を説明します。Apr 12, 2025 am 12:05 AM

繊維はPhp8.1で導入され、同時処理機能が改善されました。 1)繊維は、コルーチンと同様の軽量の並行性モデルです。 2)開発者がタスクの実行フローを手動で制御できるようにし、I/O集約型タスクの処理に適しています。 3)繊維を使用すると、より効率的で応答性の高いコードを書き込むことができます。

PHPコミュニティ:リソース、サポート、開発PHPコミュニティ:リソース、サポート、開発Apr 12, 2025 am 12:04 AM

PHPコミュニティは、開発者の成長を支援するための豊富なリソースとサポートを提供します。 1)リソースには、公式のドキュメント、チュートリアル、ブログ、LaravelやSymfonyなどのオープンソースプロジェクトが含まれます。 2)StackOverFlow、Reddit、およびSlackチャネルを通じてサポートを取得できます。 3)開発動向は、RFCに従うことで学ぶことができます。 4)コミュニティへの統合は、積極的な参加、コード共有への貢献、および学習共有への貢献を通じて達成できます。

PHP対Python:違いを理解しますPHP対Python:違いを理解しますApr 11, 2025 am 12:15 AM

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

PHP:それは死にかけていますか、それとも単に適応していますか?PHP:それは死にかけていますか、それとも単に適応していますか?Apr 11, 2025 am 12:13 AM

PHPは死にかけていませんが、常に適応して進化しています。 1)PHPは、1994年以来、新しいテクノロジーの傾向に適応するために複数のバージョンの反復を受けています。 2)現在、電子商取引、コンテンツ管理システム、その他の分野で広く使用されています。 3)PHP8は、パフォーマンスと近代化を改善するために、JITコンパイラおよびその他の機能を導入します。 4)Opcacheを使用してPSR-12標準に従って、パフォーマンスとコードの品質を最適化します。

PHPの未来:適応と革新PHPの未来:適応と革新Apr 11, 2025 am 12:01 AM

PHPの将来は、新しいテクノロジーの傾向に適応し、革新的な機能を導入することで達成されます。1)クラウドコンピューティング、コンテナ化、マイクロサービスアーキテクチャに適応し、DockerとKubernetesをサポートします。 2)パフォーマンスとデータ処理の効率を改善するために、JITコンパイラと列挙タイプを導入します。 3)パフォーマンスを継続的に最適化し、ベストプラクティスを促進します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい