ホームページ > バックエンド開発 > PHPチュートリアル > PHP の 3 層構造 (パート 2) AOP の PHP 実装 1/2 ページ_PHP チュートリアル

PHP の 3 層構造 (パート 2) AOP の PHP 実装 1/2 ページ_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:36:29
オリジナル
887 人が閲覧しました

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

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

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


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


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


メッセージに汚い言葉が含まれている場合は、メッセージを追加することはありません。保存されました。コード 3 に示すように、コードの変更を続けます。


コードをコピーします
コードは次のとおりです: // コード 3、汚い言葉のフィルタリングを追加します // 中間サービス層
class LWordServiceCore を実装しますILWordService {
// メッセージを追加します
public function append($newLWord) {
if (!($userLogin)) {
// ユーザーにログインを要求します
}
if (stristr($newLWord, "SB")) {
// 汚い言葉が含まれています。メッセージの送信が失敗しました
}
// データ アクセス層を呼び出します
$dbTask = new LWordDBTask();
}
};

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



コードをコピーします

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



コードをコピーします

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


// コード 5、ユーザー アップグレード ルールを追加します
// 中間サービス層
class LWordServiceCore を実装しますILWordService {
// Add メッセージを残す
public function append($newLWord) { if (!($userLogin)) { // ユーザーにログインを促す} if (stristr($newLWord, "fuck") ) {
// 汚い言葉が含まれています。メッセージを残すように求められます。送信に失敗しました
}

// データ アクセス層を呼び出します
$dbTask = new LWordDBTask();
$dbTask->append($newLWord); / ユーザーに追加ポイントを付与します
$score = getUserScore($userName);
saveUserScore($userName, $score);
// ユーザーをアップグレードします
if (($score % 1000); == 0) {
$level = 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 つの実装クラスとみなすことができます。主要なビジネス ロジックは、これら 3 つの実装クラスを横断して、二次的なビジネス ロジックを完成させます。図 1 に示すように:
CheckPowerExtension 拡張クラスはユーザー権限の検証に使用され、CheckContentExtension 拡張クラスはメッセージ内容のチェックに使用され、AddScoreExtension 拡張クラスはユーザーへのポイントの追加とアップグレードに使用されます。回路図コードはコード 7 に示されています:


(図 1)、拡張インターフェイスを追加します PHP の 3 層構造 (パート 2) AOP の PHP 実装 1/2 ページ_PHP チュートリアル

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

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

// 権限を確認します
class CheckPowerExtensionimplements 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) {
// 拡張子配列を取得
$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 インターフェイス配列です
private function getExtArray() {
return array(
// 権限を確認します
new CheckPowerExtension(),
// コンテンツを確認します
new CheckContentExtension (),
// ボーナス ポイント
new AddScoreExtension (),
);
}
};


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




http://www.bkjia.com/PHPjc/322084.html

www.bkjia.com
tru​​e

http://www.bkjia.com/PHPjc/322084.html技術記事この記事のソース コードのダウンロード アドレス: http://xiazai.jb51.net/201007/yuanma/TraceLWord.rar 開発環境は Eclipse (pdt) です。中間サービス層に注目してみましょう。中間サービス層コード...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート