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

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

WBOY
WBOYオリジナル
2016-06-13 12:15:211114ブラウズ

この記事のソース コードのダウンロード アドレス: 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 までご連絡ください。