ホームページ >php教程 >php手册 >PHPの3層構造(その1) 簡単な3層構造

PHPの3層構造(その1) 簡単な3層構造

WBOY
WBOYオリジナル
2016-06-14 00:02:25949ブラウズ

簡単なメッセージ ボード コードを例に挙げて、コード 1 に示す最も単純な 3 層構造のコードを見てみましょう。

<div>
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000;">// 代码 1<br>//</span><span style="color: #008000;"> 外观层类</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> LWordHomePage {<br>    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 添加留言</span><span style="color: #008000;"><br></span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> append(</span><span style="color: #800080;">$newLWord</span><span style="color: #000000;">) {<br>        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 调用中间服务层</span><span style="color: #008000;"><br></span><span style="color: #000000;">        </span><span style="color: #800080;">$serv</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> LWordServiceCore();<br>        </span><span style="color: #800080;">$serv</span><span style="color: #000000;">-></span><span style="color: #000000;">append(</span><span style="color: #800080;">$newLWord</span><span style="color: #000000;">);<br>    }<br>};<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;"> 中间服务层</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> LWordServiceCore {<br>    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 添加留言</span><span style="color: #008000;"><br></span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> append(</span><span style="color: #800080;">$newLWord</span><span style="color: #000000;">) {<br>        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 调用数据访问层</span><span style="color: #008000;"><br></span><span style="color: #000000;">        </span><span style="color: #800080;">$dbTask</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> LWordDBTask();<br>        </span><span style="color: #800080;">$dbTask</span><span style="color: #000000;">-></span><span style="color: #000000;">append(</span><span style="color: #800080;">$newLWord</span><span style="color: #000000;">);<br>    }    <br>};<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;"> 数据访问层</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> LWordDBTask {<br>    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 添加留言</span><span style="color: #008000;"><br></span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> append(</span><span style="color: #800080;">$newLWord</span><span style="color: #000000;">) {<br>        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 数据层代码(省略)</span><span style="color: #008000;"><br></span><span style="color: #000000;">    }<br>};<br></span>
</div>

実行タイミング図 (図 1 を参照):

PHPの3層構造(その1) 簡単な3層構造

(図 1)、単純な 3 層構造のタイミング図

3 層構造の呼び出しシーケンスは、コードとタイミング図から直感的に理解できます。しかし、実際の開発では、この単純な 3 層構造ではニーズを満たすことができません。外観層と中間サービス層のコードから始めましょう。 外観レイヤー LWordHomePage クラスの new キーワードを直接使用して、中間サービス クラス LWordServiceCore はハードコーディング メソッドです。 実際のプロジェクト開発プロセスでは、外観層と中間サービス層が別の人によって開発される場合があります。つまり、機能モジュールは複数の人によって完成されます。外観層の LWordHomePage クラスの開発進捗は、LWordServiceCore クラスが完全に開発されるまで待つことができません (つまり、 外観層は、中間のサービス層が完全に開発されるまで待って開始することはできません)。このような連携は非常に非効率です。 プロジェクトを複数人で同時に開発できるようにするには、コード設計をカットする必要があります。アピアランス層の開発進捗に合わせて、一時的な中間サービスクラスを編成することも可能です。中間サービス層が完全に開発されたら、それを置き換えるだけです...図 2 に示すように:

PHPの3層構造(その1) 簡単な3層構造

(図 2)、外観レイヤーは異なるサービス間を切り替えます

明らかに、このような要件を達成するために、新しいキーワードを直接使用して外観レイヤーで LWordServiceCore クラスを作成して呼び出すのは非常に柔軟性がありません。臨機応変かつ自由に切り替えるのは難しい! !中間サービス層の一時的な実装として機能する TempService クラスを作成できます。また、TempService と LWordServiceCore という 2 つのクラスも分析する必要があります。どちらもメッセージを追加するための同じ追加関数を持っていますが、1 つは一時的なもので、もう 1 つは本物です。 TempService クラスと LWordServiceCore クラスは両方ともパブリック関数を持っているため、共通の親クラスが必要です。このパブリック上位クラスには他のメンバーや属性が存在しないことを考慮して、このパブリック上位クラスはインターフェイス、つまり ILWordService! として定義されます。 UML クラス図を図 3 に示します。


PHPの3層構造(その1) 簡単な3層構造

(図 3) ILWordService インターフェイスを定義して実装します

TempService または LWordServiceCore クラスのオブジェクトは、LWordHomePage クラス内で直接作成されません。作成プロセスはファクトリ クラス MyServiceFactory (シンプル ファクトリ モード) に渡されます。

このように、外観レイヤーの LWordHomePage クラスは、ILWordService インターフェイスと外観レイヤーのみを認識する必要があります。コードは、外観層と特定のサービス コードの優れた分離を達成するために、特定の中間サービス コードが何であるかに注意を払います。

これは何に相当しますか?ちょうど 2 人のハードウェア エンジニアのように、1 人はコンピュータ グラフィックス カードを製造し、もう 1 人はコンピュータのマザーボードを製造します。グラフィックス カードを製造するエンジニアは、グラフィックス カードをテスト回路に挿入して、グラフィックス カードが適切に動作するかどうかをテストできます。同様に、マザーボードを製造するエンジニアは、マザーボードを別のテスト回路に挿入して、マザーボードが適切に動作するかどうかをテストすることもできます。 2 人のエンジニアが作業を完了したら、作業結果を結び付けることができます。これは、ほぼ半分の時間を節約できる並行開発方法です。ソフトウェアエンジニアリングの観点から、インターフェースコードを設計する際には、生産効率を向上させるために複数人による同時開発をサポートする必要があるかどうかも考慮する必要があります。

UML クラス図 (図 3 を参照) に従って、コード 2 に示すように PHP コードを変更します。

<div>
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000;">// 代码2, 通过工厂创建留言服务并调用</span><br><span style="color: #008000;">// 外观层类</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> LWordHomePage {<br>    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 添加留言</span><span style="color: #008000;"><br></span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> append(</span><span style="color: #800080;">$newLWord</span><span style="color: #000000;">) {<br><span style="background-color: #e0e0e0;">        </span></span><span style="background-color: #e0e0e0;"><span style="color: #008000;">//</span><span style="color: #008000;"> 调用中间服务</span><span style="color: #008000;"><br></span><span style="color: #000000;">        </span><span style="color: #800080;">$serv</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> MyServiceFactory</span><span style="color: #000000;">::</span><span style="color: #000000;">create();<br>        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 注意此时是操作 ILWordService 接口, 而非 LWordService 类</span><span style="color: #008000;"><br></span><span style="color: #000000;">        </span><span style="color: #800080;">$serv</span><span style="color: #000000;">-></span><span style="color: #000000;">append(</span><span style="color: #800080;">$newLWord</span></span><span style="color: #000000;"><span style="background-color: #e0e0e0;">);</span><br>    }<br>};<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;"> 留言服务接口</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">interface</span><span style="color: #000000;"> ILWordService {<br>    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> append(</span><span style="color: #800080;">$newLWord</span><span style="color: #000000;">);<br>};<br><br></span><span style="background-color: #e0e0e0;"><span style="color: #008000;">//</span><span style="color: #008000;"> 服务工厂类</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> MyServiceFactory {<br>    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 创建留言服务</span><span style="color: #008000;"><br></span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> create() {<br>        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (</span><span style="color: #000000;">1</span><span style="color: #000000;">) {<br>            </span><span style="color: #008000;">//</span><span style="color: #008000;"> 返回中间服务层</span><span style="color: #008000;"><br></span><span style="color: #000000;">            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> LWordServiceCore();<br>        } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {<br>            </span><span style="color: #008000;">//</span><span style="color: #008000;"> 返回临时实现</span><span style="color: #008000;"><br></span><span style="color: #000000;">            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span></span><span style="color: #000000;"><span style="background-color: #e0e0e0;"> TempService();<br>        }<br>    }<br>}</span><br><br></span><span style="color: #008000;">//</span><span style="color: #008000;"> 临时服务类</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> TempService </span><span style="color: #0000ff;">implements</span><span style="color: #000000;"> ILWordService {<br>    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 添加留言</span><span style="color: #008000;"><br></span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> append(</span><span style="color: #800080;">$newLWord</span><span style="color: #000000;">) {<br>        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 临时代码(省略)</span><span style="color: #008000;"><br></span><span style="color: #000000;">    }<br>};<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;"> 中间服务层</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> LWordServiceCore </span><span style="color: #0000ff;">implements</span><span style="color: #000000;"> ILWordService {<br>    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 添加留言</span><span style="color: #008000;"><br></span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> append(</span><span style="color: #800080;">$newLWord</span><span style="color: #000000;">) {<br>        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 调用数据访问层</span><span style="color: #008000;"><br></span><span style="color: #000000;">        </span><span style="color: #800080;">$dbTask</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> LWordDBTask();    <br>        </span><span style="color: #800080;">$dbTask</span><span style="color: #000000;">-></span><span style="color: #000000;">append(</span><span style="color: #800080;">$newLWord</span><span style="color: #000000;">);<br>    }<br>};<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;"> 数据访问层</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> LWordDBTask {<br>    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 添加留言</span><span style="color: #008000;"><br></span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> append(</span><span style="color: #800080;">$newLWord</span><span style="color: #000000;">) {<br>        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 数据层代码(省略)</span><span style="color: #008000;"><br></span><span style="color: #000000;">    }<br>};<br></span>
</div>

タイミング図を図 4 に示します。

PHPの3層構造(その1) 簡単な3層構造

(図 4) ファクトリ クラスを使用してメッセージ サービスを作成します

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