国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ バックエンド開発 PHPチュートリアル PHPマスター| The Null Object Pattern - Polymorphism in Domain Models

PHPマスター| The Null Object Pattern - Polymorphism in Domain Models

Feb 25, 2025 pm 02:53 PM

PHP Master | The Null Object Pattern - Polymorphism in Domain Models

コアポイント

  • 空のオブジェクトパターンは、多型を使用して條件付きコードを削減し、コードをより簡(jiǎn)潔でメンテナンスにしやすくするデザインパターンです。実際のオブジェクトを置き換えることができる非機(jī)能的オブジェクトを提供し、ヌル値チェックの必要性を排除します。
  • 空のオブジェクトモードは、ファクトリーモードの作成と戻りのファクトリーモードや、実行時(shí)にオブジェクトの動(dòng)作を変更するポリシーモードなど、他の設(shè)計(jì)モードと組み合わせて使用??できます。
  • 空のオブジェクトパターンの潛在的な欠點(diǎn)は、不要なオブジェクトの作成につながり、メモリの使用量を増やす可能性があることです。また、追加のクラスとインターフェイスが必要であるため、コードをより複雑にする場(chǎng)合があります。
  • 空のオブジェクトパターンを?qū)g裝するには、実際のオブジェクトと同じインターフェイスを?qū)g裝する空のオブジェクトクラスを作成する必要があります。この空のオブジェクトは、インターフェイス內(nèi)のすべてのメソッドのデフォルトの実裝を提供し、実際のオブジェクトを置き換えることができます。これにより、コードがより堅(jiān)牢でエラーが発生しやすくなります。

仕様に完全に準(zhǔn)拠していませんが、直交性は「優(yōu)れたデザイン」の原則に基づいたソフトウェアシステムの本質(zhì)であり、モジュールが互いに分離され、システムが少なくなると言えます。硬くて脆弱な問(wèn)題が発生しやすい。もちろん、実際にこのプロセスを?qū)g行するよりも、直交システムの利點(diǎn)について話す方が簡(jiǎn)単です。それでも、システム內(nèi)で高度に分離されたコンポーネントを達(dá)成することは決してユートピアの概念ではありません。多型などのさまざまなプログラミングの概念により、柔軟なプログラムの設(shè)計(jì)により、その部分は実行時(shí)に切り替えることができ、その依存関係は具體的な実裝ではなく抽象的な形式で表現(xiàn)できます。 「インターフェイス指向プログラミング」の古いモットーは、インフラストラクチャまたはアプリケーションロジックを?qū)g裝しているかどうかにかかわらず、時(shí)間とともに広く採(cǎi)用されてきたと思います。ただし、ドメインモデルの領(lǐng)域に足を踏み入れると、狀況は非常に異なります。率直に言って、これは予測(cè)可能なシナリオです。結(jié)局のところ、相互に関連したオブジェクトのネットワーク(明確に定義されたビジネスルールによって制限されているデータと動(dòng)作を持つ)は、なぜ多型である必要があるのでしょうか?それ自體はあまり意味がありません。ただし、この規(guī)則にはいくつかの例外があり、最終的にはこの狀況に適用される可能性があります。最初の例外は、仮想プロキシの使用です。これは、実際のドメインオブジェクト実裝と同じインターフェイスです。別の例外は、いわゆる「ヌルケース」です。これは、操作が十分に満たされたエンティティを埋める代わりにnull値を割り當(dāng)てるか、戻ることになる可能性がある特別なケースです。従來(lái)の非政治的アプローチでは、モデルのユーザーはこれらの「有害な」ヌル値をチェックし、條件を優(yōu)雅に処理し、コード全體に條件付きステートメントが爆発する必要があります。幸いなことに、この一見(jiàn)紛らわしい狀況は、問(wèn)題のオブジェクトと同じインターフェイスを?qū)g裝するドメインオブジェクトのマルチブランチ実裝を作成するだけで簡(jiǎn)単に解決できます。操作の実行中にugいnull値を繰り返し確認(rèn)します。當(dāng)然のことながら、このアプローチは、多型の利點(diǎn)を極端にもたらす空のオブジェクトと呼ばれる設(shè)計(jì)パターンです。この記事では、いくつかのケースでこのパターンの利點(diǎn)を示し、それらがどのように多型の方法に密接に結(jié)びついているかを示します。

非政治的條件を扱う

予想されるように、空のオブジェクトパターンの利點(diǎn)を示すときに試す方法はいくつかあります。私が見(jiàn)つけた特に簡(jiǎn)単なアプローチは、汎用ファインダーからnull値を返すことになる可能性のあるデータマッパーを?qū)g裝することです。 1つのユーザーエンティティのみで構(gòu)成されるスケルトンドメインモデルを正常に作成したとします。インターフェイスとそのクラスは次のとおりです

<?php namespace Model;

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

    public function setName($name);
    public function getName();

    public function setEmail($email);
    public function getEmail();
}
<?php namespace Model;

class User implements UserInterface
{
    private $id;
    private $name;
    private $email;

    public function __construct($name, $email) {
        $this->setName($name);
        $this->setEmail($email);
    }

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

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

    public function setName($name) {
        if (strlen($name)  30) {
            throw new InvalidArgumentException(
                "The user name is invalid.");
        }
        $this->name = $name;
        return $this;
    }

    public function getName() {
        return $this->name;
    }

    public function setEmail($email) {
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            throw new InvalidArgumentException(
                "The user email is invalid.");
        }
        $this->email = $email;
        return $this;
    }

    public function getEmail() {
        return $this->email;
    }
}
ユーザークラスは、一部のユーザーデータと動(dòng)作を定義するためにいくつかのミューテーター/アクセサーズを?qū)g裝するリアクティブな構(gòu)造です。この構(gòu)築されたドメインクラスを使用すると、さらに一歩進(jìn)んで、ドメインモデルとデータアクセスレイヤーを相互に分離する基本的なデータマッパーを定義できます。

<?php namespace ModelMapper;
use LibraryDatabaseDatabaseAdapterInterface,
    ModelUser;

class UserMapper implements UserMapperInterface
{   
    private $adapter;

    public function __construct(DatabaseAdapterInterface $adapter) {
        $this->adapter = $adapter;
    }

    public function fetchById($id) {
        $this->adapter->select("users", array("id" => $id));
        if (!$row = $this->adapter->fetch()) {
            return null;
        }
        return $this->createUser($row);
    }

    private function createUser(array $row) {
        $user = new User($row["name"], $row["email"]);
        $user->setId($row["id"]);
        return $user;
    }
}
最初に表示されるはずのことは、MapperのFetchByID()メソッドがブロック內(nèi)のいたずらであることです。これは、データベース內(nèi)のユーザーが指定されたIDと一致しない場(chǎng)合にnullを効果的に返すためです。明らかな理由で、この不器用な條件により、クライアントコードは、マッパーのファインダーを呼び出すたびにヌル値を確認(rèn)するために一生懸命働かなければなりません。

<?php use LibraryLoaderAutoloader,
    LibraryDatabasePdoAdapter,
    ModelMapperUserMapper;

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

$adapter = new PdoAdapter("mysql:dbname=test", "myusername", "mypassword");

$userMapper = new UserMapper($adapter);

$user = $userMapper->fetchById(1);

if ($user !== null) {
    echo $user->getName() . " " . $user->getEmail();
}
一見(jiàn)すると、問(wèn)題はありません。1つの場(chǎng)所で確認(rèn)してください。しかし、同じ線が複數(shù)のページコントローラーまたはサービスレイヤーに表示される場(chǎng)合、レンガの壁にぶつかりますか?あなたがそれを?qū)g現(xiàn)する前に、マッパーによって返された一見(jiàn)無(wú)邪気なヌルは、多くの反復(fù)條件を生み出します。

クライアントコードから條件ステートメントを削除します

しかし、これは、空のオブジェクトパターンが多型が神の恵みである理由を示す場(chǎng)合に正確にあるため、心配する必要はありません。これらの迷惑な條件付きステートメントを完全に取り除きたい場(chǎng)合は、以前のユーザークラスの多型バージョンを?qū)g裝できます。

<?php namespace Model;

class NullUser implements UserInterface
{
    public function setId($id) { }
    public function getId() { }

    public function setName($name) { }
    public function getName() { }

    public function setEmail($email) { }
    public function getEmail() { }
}
完全なエンティティクラスがあらゆる種類の裝飾をパッケージ化することを期待している場(chǎng)合、おそらく非常に失望するでしょう。エンティティの「null」バージョンは対応するインターフェイスに準(zhǔn)拠していますが、この方法は空のラッパーであり、実際の実裝はありません。 Nulluserクラスの存在は明らかに私たちに賞賛に値するものをもたらすものではありませんが、それは私たちがすべての以前の條件付きステートメントをゴミ箱に投げることを可能にする簡(jiǎn)潔な構(gòu)造です。それがどのように実裝されているかを見(jiàn)たいですか?まず、いくつかの事前処理を行い、データマッパーを再構(gòu)築して、ファインダーが空の値ではなく空のユーザーオブジェクトを返すようにする必要があります。

MapperのcreateUser()メソッドは、Finderに渡されたIDが有効なユーザーを返さないときに空のユーザーを作成する責(zé)任があるため、小さな狀態(tài)を隠します。それでも、この微妙なコストは、クライアントコードの作業(yè)を多くの繰り返しチェックを行うだけでなく、空のユーザーに対処しなければならないときに文句を言うことのないゆるい消費(fèi)者にも変えます。
<?php namespace ModelMapper;
use LibraryDatabaseDatabaseAdapterInterface,
    ModelUser,
    ModelNullUser;

class UserMapper implements UserMapperInterface
{   
    private $adapter;

    public function __construct(DatabaseAdapterInterface $adapter) {
        $this->adapter = $adapter;
    }

    public function fetchById($id) {
        $this->adapter->select("users", array("id" => $id));
        return $this->createUser($this->adapter->fetch());
    }

    private function createUser($row) {
        if (!$row) {
            return new NullUser;
        }
        $user = new User($row["name"], $row["email"]);
        $user->setId($row["id"]);
        return $user; 
    }
}
<?php namespace Model;

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

    public function setName($name);
    public function getName();

    public function setEmail($email);
    public function getEmail();
}

この多型アプローチの主な欠點(diǎn)は、無(wú)効なエンティティを扱うときにクラッシュしないため、使用するアプリケーションが緩すぎることです。最悪の場(chǎng)合、ユーザーインターフェイスにはいくつかの空白の行のみが表示されますが、本當(dāng)にうるさいものは私たちをうんざりさせるものはありません。これは、初期のヌルーザークラスの現(xiàn)在の実裝をスキャンするときに特に明白です。それが実現(xiàn)可能であっても、推奨されるものは言うまでもなく、その多型を変更せずに空のオブジェクトのロジックをカプセル化することもできます??栅违芝弗Д趣稀ⅳい膜翁貏eなケースでのみクライアントコードにさらされるべきデフォルトデータと動(dòng)作をカプセル化するのに最適であるとさえ言えます。あなたが十分に野心的で、シンプルな空のユーザーオブジェクトでこのコンセプトを試したい場(chǎng)合、現(xiàn)在のNulluserクラスは次のようにリファクタリングできます:

<?php namespace Model;

class User implements UserInterface
{
    private $id;
    private $name;
    private $email;

    public function __construct($name, $email) {
        $this->setName($name);
        $this->setEmail($email);
    }

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

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

    public function setName($name) {
        if (strlen($name)  30) {
            throw new InvalidArgumentException(
                "The user name is invalid.");
        }
        $this->name = $name;
        return $this;
    }

    public function getName() {
        return $this->name;
    }

    public function setEmail($email) {
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            throw new InvalidArgumentException(
                "The user email is invalid.");
        }
        $this->email = $email;
        return $this;
    }

    public function getEmail() {
        return $this->email;
    }
}

nulluserの拡張バージョンは、靜かな前任者よりもわずかに表現(xiàn)力があります。ゲッターは、無(wú)効なユーザーを要求するときにいくつかのデフォルトメッセージを返すための基本的な実裝を提供するためです。些細(xì)なことですが、この変更は、クライアントコードが空のユーザーを処理する方法にプラスの影響を與えます。今回は、少なくとも存在しないユーザーをストレージから抽出しようとすると問(wèn)題が発生することを少なくとも知っているからです。これは良いブレークスルーであり、実際には空ではない空のオブジェクトを?qū)g裝する方法を示すだけでなく、特定のニーズに基づいて関連するオブジェクト內(nèi)でロジックを移動(dòng)するのがどれほど簡(jiǎn)単かを示します。

結(jié)論

空のオブジェクトを?qū)g裝することは、特にPHPではOOP(多型など)のコア概念が大幅に過(guò)小評(píng)価されていることが厄介であると言う人もいるかもしれません。彼らはある程度正しいです。それにもかかわらず、信頼できるプログラミングの原則と設(shè)計(jì)パターンの徐々に採(cǎi)用されたもの、言語(yǔ)オブジェクトモデルが到達(dá)した成熟度のレベルは、著実に前進(jìn)し、複雑で非現(xiàn)実的な概念と見(jiàn)なされた「高級(jí)品」の一部を使用し始めることです。少し前に必要なすべての根拠を提供します。 nullオブジェクトパターンはこのカテゴリに分類されますが、その実裝は非常にシンプルでエレガントであるため、クライアントコードで重複したnullチェックをクリアするときに魅力的ではないことは困難です。 Fotoliaの寫真

(スペースの制限のため、元のテキストのFAQ部分はここで省略されています。)

以上がPHPマスター| The Null Object Pattern - Polymorphism in Domain Modelsの詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見(jiàn)つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無(wú)料で

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP変數(shù)スコープは説明されています PHP変數(shù)スコープは説明されています Jul 17, 2025 am 04:16 AM

PHP変數(shù)スコープの一般的な問(wèn)題とソリューションには次のものが含まれます。1。グローバル変數(shù)は関數(shù)內(nèi)でアクセスできず、グローバルキーワードまたはパラメーターを使用して渡す必要があります。 2。靜的変數(shù)は靜的で宣言され、1回のみ初期化され、値は複數(shù)の呼び出し間で維持されます。 3. $ _GETや$ _POSTなどのハイパーグローバル変數(shù)は、任意の範(fàn)囲で直接使用できますが、安全なフィルタリングに注意を払う必要があります。 4.匿名関數(shù)は、使用キーワードを使用して親スコープ変數(shù)を?qū)毪工氡匾ⅳ辍⑼獠繅鋽?shù)を変更する場(chǎng)合は、參照を渡す必要があります。これらのルールを習(xí)得すると、エラーを回避し、コードの安定性が向上するのに役立ちます。

ファイルアップロードをPHPで安全に処理する方法は? ファイルアップロードをPHPで安全に処理する方法は? Jul 08, 2025 am 02:37 AM

PHPファイルのアップロードを安全に処理するには、ソースとタイプを確認(rèn)し、ファイル名とパスを制御し、サーバー制限を設(shè)定し、メディアファイルを2回プロセスする必要があります。 1.トークンを介してCSRFを防ぐためにアップロードソースを確認(rèn)し、ホワイトリストコントロールを使用してFINFO_FILEを介して実際のMIMEタイプを検出します。 2。ファイルをランダムな文字列に変更し、検出タイプに従って非WEBディレクトリに保存する拡張機(jī)能を決定します。 3。PHP構(gòu)成は、アップロードサイズを制限し、一時(shí)的なディレクトリnginx/apacheはアップロードディレクトリへのアクセスを禁止します。 4. GDライブラリは寫真を再利用して、潛在的な悪意のあるデータをクリアします。

PHPでコードをコメントします PHPでコードをコメントします Jul 18, 2025 am 04:57 AM

PHPコメントコードには3つの一般的な方法があります。1。//#を使用して1行のコードをブロックすると、//を使用することをお?jiǎng)幛幛筏蓼埂?2。使用/.../複數(shù)の行でコードブロックをラップするには、ネストすることはできませんが交差することができます。 3. / if(){}を使用するなどの組み合わせスキルコメントロジックブロックを制御するか、エディターショートカットキーで効率を改善するには、シンボルを閉じることに注意を払い、使用時(shí)にネストを避ける必要があります。

発電機(jī)はPHPでどのように機(jī)能しますか? 発電機(jī)はPHPでどのように機(jī)能しますか? Jul 11, 2025 am 03:12 AM

ageneratorinphpisamemory-efficientwaytoateate-overdeatatasetasetasetasetsinging valueseintimeintimeturningthemallatonce.1.generatorsususedeywordproducevaluesedemand、memoryusage.2を還元すること。2

PHPコメントを書くためのヒント PHPコメントを書くためのヒント Jul 18, 2025 am 04:51 AM

PHPコメントを書くための鍵は、目的と仕様を明確にすることです。コメントは、「何が行われたのか」ではなく「なぜ」を説明する必要があり、冗長(zhǎng)性や単純さを避けてください。 1.読みやすさとツールの互換性を向上させるために、クラスおよびメソッドの説明にdocblock(/*/)などの統(tǒng)合形式を使用します。 2。JSジャンプを手動(dòng)で出力する必要がある理由など、ロジックの背後にある理由を強(qiáng)調(diào)します。 3.複雑なコードの前に概要説明を追加し、手順でプロセスを説明し、全體的なアイデアを理解するのに役立ちます。 4. TodoとFixmeを合理的に使用して、To Doアイテムと問(wèn)題をマークして、その後の追跡とコラボレーションを促進(jìn)します。優(yōu)れた注釈は、通信コストを削減し、コードメンテナンスの効率を向上させることができます。

PHPの學(xué)習(xí):初心者向けガイド PHPの學(xué)習(xí):初心者向けガイド Jul 18, 2025 am 04:54 AM

tolearnphpefctivially、startbysettingupalocalserverenvironmentusingtoolslikexamppandacodeeditorlikevscode.1)instalxamppforapa Che、mysql、andphp.2)useocodeeditorforsyntaxsupport.3)testyoursetup withasimplephpfile.next、Learnpbasicsincludingvariables、ech

PHPのインデックスごとに文字列內(nèi)の文字にアクセスする方法 PHPのインデックスごとに文字列內(nèi)の文字にアクセスする方法 Jul 12, 2025 am 03:15 AM

PHPでは、四角い括弧または巻き毛裝具を使用して文字列固有のインデックス文字を取得できますが、正方形のブラケットをお?jiǎng)幛幛筏蓼?。インデックス?から始まり、範(fàn)囲外のアクセスはnull値を返し、値を割り當(dāng)てることができません。 MB_SUBSTRは、マルチバイト文字を処理するために必要です。例:$ str = "hello"; echo $ str [0];出力h; MB_Substr($ str、1,1)などの漢字は、正しい結(jié)果を得る必要があります。実際のアプリケーションでは、ループする前に文字列の長(zhǎng)さをチェックする必要があり、ダイナミック文字列を有効性のために検証する必要があり、多言語(yǔ)プロジェクトはマルチバイトセキュリティ関數(shù)を均一に使用することをお?jiǎng)幛幛筏蓼埂?/p>

クイックPHPインストールチュートリアル クイックPHPインストールチュートリアル Jul 18, 2025 am 04:52 AM

to installphpquickly、usexampponwindowsorhomebrewonmacos.1.onwindows、downloadandinstallxampp、selectcomponents、startapache、andplacefilesinhtdocs.2

See all articles