コード 1 に示すように:
コード をコピーします。 コードは次のとおりです:
// コード 1
//外観層クラス
class LWordHomePage {
//メッセージを追加します
public function append($newLWord) {
//中間サービス層を呼び出します
$serv = new LWordServiceCore()
$serv- >append($newLWord);
}
}
// 中間サービス層
class LWordServiceCore {
// メッセージを追加
public function append( $newLWord) {
// データ アクセス層を呼び出します
$dbTask = new LWordDBTask();
$dbTask->append($newLWord);
}; >// データ アクセス層
class LWordDBTask {
//メッセージ追加
public function append($newLWord) {
//データ層コード (省略)
}
};
図 1 に示す実行タイミング図:
(図 1)、単純な 3 層構造のタイミング図
3 層構造の呼び出しシーケンスは、コードとタイミング図から直感的に理解できます。しかし、実際の開発では、この単純な 3 層構造ではニーズを満たすことができません。外観層と中間サービス層のコードから始めましょう。
外観レイヤーLWordHomePage クラスの new キーワードを直接使用して、中間サービス クラス LWordServiceCore はハードコーディング メソッドです。 実際のプロジェクト開発プロセスでは、外観層と中間サービス層が別の人によって開発される場合があります。つまり、機能モジュールは複数の人によって完成されます。外観層の LWordHomePage クラスの開発進捗は、LWordServiceCore クラスが完全に開発されるまで待つことができません (つまり、 外観層は、中間のサービス層が完全に開発されるまで待って開始することはできません)。このような連携は非常に非効率です。 プロジェクトを複数人で同時に開発できるようにするには、コード設計をカットする必要があります。アピアランス層の開発進捗に合わせて、一時的な中間サービスクラスを編成することも可能です。中間サービス層が完全に開発されたら、それを置き換えるだけです...図 2 に示すように:
(図 2)、外観レイヤーは異なるサービス間を切り替えます
明らかに、このような要件を達成するために、新しいキーワードを直接使用して外観レイヤーで LWordServiceCore クラスを作成して呼び出すのは非常に柔軟性がありません。臨機応変かつ自由に切り替えるのは難しい! !中間サービス層の一時的な実装として機能する TempService クラスを作成できます。また、TempService と LWordServiceCore という 2 つのクラスも分析する必要があります。どちらもメッセージを追加するための同じ追加関数を持っていますが、1 つは一時的なもので、もう 1 つは本物です。 TempService クラスと LWordServiceCore クラスは両方ともパブリック関数を持っているため、共通の親クラスが必要です。このパブリック上位クラスには他のメンバーや属性が存在しないことを考慮して、このパブリック上位クラスはインターフェイス、つまり ILWordService! として定義されます。 UML クラス図を図 3 に示します。
TempService または LWordServiceCore クラスのオブジェクトは、LWordHomePage クラス内で直接作成されません。作成プロセスはファクトリ クラス MyServiceFactory (シンプル ファクトリ モード) に渡されます。
このように、外観レイヤーの
LWordHomePage クラスは、ILWordService インターフェイスと外観レイヤーのみを認識する必要があります。コードは、外観層と特定のサービス コードの優れた分離を達成するために、特定の中間サービス コードが何であるかに注意を払います。 これは何に相当しますか?ちょうど 2 人のハードウェア エンジニアのように、1 人はコンピュータ グラフィックス カードを製造し、もう 1 人はコンピュータのマザーボードを製造します。グラフィックス カードを製造するエンジニアは、グラフィックス カードをテスト回路に挿入して、グラフィックス カードが適切に動作するかどうかをテストできます。同様に、マザーボードを製造するエンジニアは、マザーボードを別のテスト回路に挿入して、マザーボードが適切に動作するかどうかをテストすることもできます。 2 人のエンジニアが作業を完了したら、作業結果を結び付けることができます。これは、ほぼ半分の時間を節約できる並行開発方法です。ソフトウェアエンジニアリングの観点から、インターフェースコードを設計する際には、生産効率を向上させるために複数人による同時開発をサポートする必要があるかどうかも考慮する必要があります。
UML クラス図 (図 3 を参照) に従って、コード 2 に示すように PHP コードを変更します。
コードをコピーします
コードは次のとおりです:
// コード 2、ファクトリを通じてメッセージ サービスを作成し、
// 外観レイヤー クラス
class LWordHomePage {
// メッセージを追加
public function append($newLWord) {
// 中間サービスを呼び出します
$serv = MyServiceFactory::create();
// これは LWordService クラスではなく、ILWordService インターフェイスを操作していることに注意してください
$serv->append( $newLWord );
}
};
// メッセージ サービス インターフェイス
interface ILWordService {
public function append($newLWord); 🎜> //サービスファクトリークラス
class MyServiceFactory {
// メッセージの作成 service
public static function create() {
if (1) {
// 中間サービス層に戻る
return new LWordServiceCore();
} else {
// 一時的な実装を返します
return new TempService();
}
} // 一時サービス Class
class TempServiceimplements ILWordService {
//メッセージ追加
public function append($newLWord) {
//一時コード(省略)
}
};
// 中間サービス層
class LWordServiceCoreimplements ILWordService {
// メッセージを追加
public function append($newLWord) {
// データ アクセス層を呼び出す
$ dbTask = new LWordDBTask ();
$dbTask->append($newLWord)
};
クラス LWordDBTask {
// メッセージを追加
public function append($newLWord) {
// データ層コード (省略)
}
};
タイミング図を図 4 に示します。