ホームページ php教程 php手册 PHP の 3 層構造 (その 2) PHP による AOP の実装 ページ 1/2

PHP の 3 層構造 (その 2) PHP による AOP の実装 ページ 1/2

Jun 13, 2016 pm 12:15 PM
aop http php 住所 成し遂げる 構造

この記事のソース コードのダウンロード アドレス: http://xiazai.jb51.net/201007/yuanma/TraceLWord.rar
開発環境は eclipse(pdt) です
中間サービス層に焦点を当てましょう。中間サービス層のコードは比較的単純で、データ アクセス層のコードを呼び出してメッセージをデータベースに保存するだけです。コード 1 に示すように:

コード をコピーします。 コードは次のとおりです:


// コード 1
//中間サービス層
class LWordServiceCoreimplements ILWordService {
//メッセージを追加します
public function append($newLWord) {
//データ アクセス層を呼び出します
$dbTask = new LWordDBTask() ;
$ dbTask->append($newLWord);
}
};


メッセージボードのデモを見て、企業の製品部門やマーケティング部門がさまざまな提案をする可能性があります。アイデアとニーズ。たとえば、メッセージを追加する前にユーザーの権限を確認したいと考えています。メッセージを残せるのは登録ユーザーだけです!コード 2 に示すように、コードを変更する必要があります。

コードをコピー コードは次のとおりです。


//コード 2、ログイン検証を追加します
// 中間サービス層
class LWordServiceCoreimplements ILWordService {
// メッセージを追加
public function append($newLWord) {
if (!($userLogin) ) {
// ユーザーにログインを要求します
}
// データ アクセス層を呼び出します
$dbTask = new LWordDBTask();
$dbTask->append($newLWord); ;
}
};


メッセージに汚い言葉が含まれている場合は、メッセージを追加する前にメッセージの内容を確認したいと考えています。コード 3 に示すように、コードの変更を続けます。

コードをコピー コードは次のとおりです。


//コード 3、誓いの言葉を追加 Filter
//中間サービス層
class LWordServiceCoreimplements ILWordService {
// メッセージを追加
public function append($newLWord) {
if (!($userLogin) )) {
// ユーザーにログインを促す
}
if (stristr($newLWord, "SB")) {
// 汚い言葉が含まれており、メッセージ送信失敗を促す
}
// データ アクセス層を呼び出します
$dbTask = new LWordDBTask();
$dbTask->append($newLWord);

;
製品部門も新しい要件を提案し、ポイントメカニズムを追加したいと考えています。具体的には、メッセージが成功するたびにユーザーに 5 ポイントが与えられます。コード 4 に示すように、コードの変更を続けます。



コードをコピー コードは次のとおりです。

//コード 4、メッセージを追加します。 Points メカニズム

// 中間サービス層
class LWordServiceCoreimplements ILWordService {
// メッセージを追加
public function append($newLWord) {
if (!($ userLogin)) {
// ユーザーにログインを求める
}
if (stristr($newLWord, "SB")) {
// 汚い言葉が含まれており、メッセージ送信失敗を促す
}
// データ アクセス Layer を呼び出します
$dbTask = new LWordDBTask();
$dbTask->append($newLWord);
// ユーザーに追加ポイントを与えます
$score = getUserScore($userName);
$score = $score 5;
}
};製品部門は、ユーザーが 1,000 ポイントを蓄積するたびにアップグレードされることを望んでいます。コード 5 に示すように、コードの変更を続けます。



コードをコピー


コードは次のとおりです。

//コード 5、ユーザーの追加 アップグレード ルール//中間サービス層class LWordServiceCoreimplements ILWordService { //メッセージを追加

public function append($newLWord) {

if (!($userLogin) )) {
// ユーザーにログインを要求します
}
if (stristr($newLWord, "fuck")) {
// 汚い言葉が含まれているため、メッセージの送信に失敗しました
}

// データ アクセス層を呼び出します
$dbTask = new LWordDBTask();
$dbTask->append($newLWord)
// ユーザーにポイントを追加します
$score = getUserScore($userName);
$score = $score 5;
saveUserScore($userName, $score);
// ユーザーをアップグレードします
if (($score % 1000) == 0) {
$ レベル = getUserName($userName);
saveUserLevel($userName, $level);



需要が増加するにつれて、中間サービス層のコードを常に変更する必要があります。しかし、要件が増えれば増えるほど、中間サービス層のコードがより多く、より大きくなるということは、難しくないはずです。結局のところ、3 層構造の開発モデルを使用しても、プロジェクトの難易度を効果的に下げることはできません。さらに、需要の変化に応じて中間サービス コードを変更した後は、新しいコードを効果的にテストするのではなく、すべてのコードを再テストする必要があります...

実際、この掲示板のコードを注意深く分析してみましょう。まず最初に提案したいのは、プライマリ ビジネス ロジックとセカンダリ ビジネス ロジックの概念です。何はともあれ、メッセージの内容をデータベースに保存することがビジネス ロジックの根幹です。これが主要なビジネス ロジックです。需要が増加したため、このセクションは変更されていません。データベースに保存する前の権限の確認と内容のチェック、データベースに保存した後にユーザーにポイントを追加してユーザーをアップグレードするなど、これらはすべて前処理と仕上げのタスクであり、すべて二次的なビジネス ロジックです。メインのビジネス ロジックはほとんど変わりませんが、二次的なビジネス ロジックは非常に頻繁に変更されます。コードの可読性と保守性を向上させるために、これらの二次的なビジネス ロジックを別の場所に配置し、メインのビジネス ロジックに干渉しないようにすることを検討できます。メインのビジネス ロジックは、実行すべきことに集中する必要があります。その他のことについては、メインのビジネス ロジックは気にしません。コード 6 に示すように、コードは次のように記述できます。

コードをコピー コードは次のとおりです。


// コード 6. メイン ビジネス ロジックとセカンダリ ビジネス ロジックを分離します
// 中間サービス層
class LWordServiceCoreimplements ILWordService {
// メッセージを追加
public function append($newLWord) {
// メッセージを追加する前に
beforeAppend($newLWord);
// データ アクセス層を呼び出します
$dbTask = new LWordDBTask();
$dbTask->append($newLWord); ;
/ / メッセージを追加した後、
behindAppend($newLWord);


許可判定コードとメッセージ内容のフィルタリング コードを配置できます。 beforeAppend 関数にユーザー ポイント コードが挿入され、behindAppend 関数に挿入され、メイン ビジネス ロジック コードからセカンダリ ビジネス ロジックがクリーンアップされます。メイン ビジネス ロジックは、Append の前に「オーバーチュア」関数があり、Append の後ろに「エピローグ」関数があることを知っていますが、メイン ビジネス ロジックは、オーバーチュア関数とエピローグ関数で具体的に何が行われるかを知りませんし、知る必要もありません。もちろん、実際のコーディング作業はそれほど単純ではありません。また、製品部門やマーケティング部門のニーズの変化も考慮する必要があるため、そのような変化に対応するにはプラグイン方式を導入するのが最善ですが、それに依存します。 beforeAppend と BehindAppend の 2 つの関数のみでこの目標を達成するのが最善の方法です。これは達成できません~


プラグイン メソッドを実装したい場合は、インターフェイスを作成できます。インターフェイスを使用する利点は、定義と実装を分離できること、もう 1 つはポリモーフィズムを実現できることです。メッセージ拡張インターフェイス ILWordExtension を作成します。これには、beforeAppend と BehindAppend の 2 つの関数があります。権限の検証、コンテンツ検査、ボーナス ポイントなどの機能は、ILWordExtension インターフェイスを実装する 3 つの実装クラスとみなすことができます。主要なビジネス ロジックは、2 番目のビジネス ロジックを完成させるために、これら 3 つの実装クラスを横断します。図 1 に示すように:
CheckPowerExtension 拡張クラスはユーザー権限の検証に使用され、CheckContentExtension 拡張クラスはメッセージ内容のチェックに使用され、AddScoreExtension 拡張クラスはユーザーへのポイントの追加とアップグレードに使用されます。回路図コードはコード 7 に示されています。

(図 1)、拡張インターフェイス


コードをコピーします コードは次のとおりです。 :


// コード 7、拡張インターフェイスを追加します
// 拡張インターフェイス
interface ILWordExtension {
// メッセージを追加する前に
public function beforeAppend($newLWord)
// メッセージを追加した後
public function BehindAppend($newLWord);

// 権限を確認します
class CheckPowerExtensionimplemented ILWordExtension {
// メッセージを追加する前
public function beforeAppend($newLWord) {
// ここでユーザー権限を決定します
}

// メッセージを追加した後
public function BehindAppend($newLWord) {
}
};

// メッセージ テキストをチェックします
class CheckContentExtensionimplements ILWordExtension {
// メッセージを追加する前に
public function beforeAppend($newLWord) {
if (stristr( $newLWord, "SB")) {
throw new Exception();
}
}

// メッセージ追加後
public function BehindAppend($newLWord) {
}
};

// ユーザー ポイント
class AddScoreExtensionimplements ILWordExtension {
// メッセージを追加する前
public function beforeAppend($newLWord) {
}

// メッセージを追加した後
public function BehindAppend($newLWord) {
// ここでユーザーにポイントを与えます
}
};中間サービス層
class LWordServiceCoreimplements ILWordService {
//メッセージを追加します
public function append($newLWord) {
//メッセージを追加する前
$this->beforeAppend($ newLWord);

// データ アクセス層を呼び出します
$dbTask = new LWordDBTask();
$dbTask->append($newLWord);メッセージの追加
$this-> ;behindAppend($newLWord);
}

// メッセージを追加する前
private function beforeAppend($newLWord) {
// Get拡張配列
$extArray = $this- >getExtArray();

foreach ($extArray as $ext) {
// 各拡張機能を走査し、その beforeAppend 関数を呼び出します
$ ext->beforeAppend($newLWord);
}
}

// メッセージ追加後
private function BehindAppend($newLWord) {
// 拡張機能配列を取得
$extArray = $this->getExtArray ();

foreach ($extArray as $ext) {
// 各拡張機能をトラバースし、その BehindAppend 関数を呼び出します
$ext-> ;behindAppend($newLWord);
}
}

// 拡張配列を取得します。
// この関数の戻り値は、実際には ILWordExtension インターフェイス配列
です。 getExtArray() {
return array(
// 権限をチェック
new CheckPowerExtension(),
// コンテンツをチェック
new CheckContentExtension(),
// ボーナス ポイント
new AddScoreExtension(),
);
}
}


新しい要件がある場合は、ILWordExtension 実装クラスを追加して getExtArray 関数に登録するだけです。 。その後、プログラムは組織化され、拡張可能になったと考えられます。


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

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles