前回の ブログ では、フロントエンド コントローラー、ページ コントローラー、アプリケーション コントローラーの 3 つのプレゼンテーション層モードについて学びました。これらが外部世界とシステム内部の間の通信を慎重に調整すれば、作業は完了します。ビジネスロジック層のアプリケーションを扱う業務部分です。ビジネス ロジック層は外部の「ノイズ」から遠ざける必要があります。ビジネス ロジックはアプリケーション全体の基本的な目的であり、システムの他の部分がこの部分の役割を果たします。
ここでは、一般的に使用される 2 つのドメイン ロジック パターン、トランザクション スクリプト パターンとドメイン モデル パターンを示します。
1. トランザクション スクリプト
1.1 コンセプト
トランザクション スクリプト: プロセスを使用してビジネス ロジックを編成し、各プロセスはプレゼンテーション層からの 1 つのリクエストを処理します。ちょっと抽象的すぎるような気がします。ほとんどのビジネス アプリケーションは、一連のトランザクションとして見ることができます。トランザクションは、単にデータベース情報を表示するだけの場合もあれば、多くのチェックサム計算手順が含まれる場合もあります。トランザクション スクリプトは、このすべてのロジックを 1 つのプロセスに編成し、各トランザクションには独自の実行プロセスがあることを意味します。ただし、トランザクション間の共通のサブタスクは複数のサブルーチンに分解できることに注意してください。
1.2 トランザクション スクリプトを使用する理由
トランザクション スクリプト モードの利点は、必要な結果を迅速に取得できることです。各スクリプトは入力データを適切に処理し、データベースを操作して望ましい結果が得られるようにします。したがって、複雑な設計に多大な時間と労力を必要としない高速かつ効果的なメカニズムであり、期限が厳しい小規模プロジェクトに最適です。
1.3 トランザクション スクリプトの実装
私の仕事の経験に基づくと、以前の私も含め、多くのプログラマーが知らずにこのモデルを使用しています。
ここで、blogの公開とblogの削除というビジネスがあると仮定し、これら2つのビジネスをそれぞれ2つのトランザクションスクリプトとして扱います。
PHPコード
- //ここにpdoを使用することを前提としてデータ処理用の基本クラスを作成します
-
abstract class Base
function- __construct { $dsn = woobaseapplication:: getdsn(); self::
$DB - ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_Exception);
- 関数 doStatement() {
- SQL を実行 }
} - static $add_blog = "INSERT INTO blog (name) value( ?)「;
-
静的」
- $del_blog = 「ブログのどこから削除 (?)」
; -
//
ブログ- トランザクションスクリプトを追加 関数
addBlog(...) { - // パラメータを処理し、SQL を add_blog 形式で記述し、親クラス doStatement を呼び出して実行し、友人に通知し、一連のサブルーチンを実行します。 。 。
- }
- delBlog(...) {
- // パラメータの処理、del_blog の書式設定、sql の呼び出し実行する親クラス doStatement。
-
}
-
}
- ?>
この例は非常に単純ですが、その単純さのため、トランザクション スクリプトの利点を反映しているだけです。より複雑なアプリケーションを作成している場合、このアプローチではプロジェクトのスケーラビリティが低下します。これは、トランザクション スクリプトが必然的に相互に影響し、コードの重複が発生するためです。 -
2. ドメインモデル 2.1 概念 ドメインモデル: 言葉で明確に説明するのは難しいです。簡単に言うと、ドメイン モデルは、現実世界のプロジェクトのさまざまな参加者を象徴します。 「すべてのものはオブジェクト
である」という原則がここで最も鮮明に反映されています。他の場所では、- オブジェクトは常にさまざまな特定の責任を負いますが、ドメイン パターンでは、それらはプロパティと付属のエージェントのセットとして記述されることがよくあります。それらは、特定のことを行う特定のものです。 2.2 ドメイン モデルを使用する理由 実際のコードでは、多くのトランザクション スクリプト パターンが存在し、コードの重複が一般的な問題であることがわかります。異なるトランザクションが同じタスクを実行したい場合、複製が最も速い解決策のように見えますが、これによりコードの保守コストが大幅に増加します。リファクタリングによって解決できる場合もありますが、徐々にコピー&ペーストが開発において避けられない部分になる可能性があります。
2.3 ドメイン モデルの実装
比較するには、トランザクション モデルの例を引用し、ドメイン モデル クラスをリレーショナル データベースのテーブルに直接マッピングします (これにより、開発が容易になります)
Php コード
- //ここにpdoを使用することを前提としてデータ処理用の基底クラスを作成します
- abstract class Base {
- 関数 __construct () );
-
if (is_null($dsn
)) { -
:- $DB = newPDO($dsn); self::$DB
->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_- Exception }
- protected)
関数- doStatement() {
- } }
-
class D Blogmodel - Extends Base {
-
関数ブログを追加 (...) {}}}
-
-
abstract- class DomainObject {
- private
$id- ;
- function
__construct(- $id= null ) { function
getId() { -
返品$これ
-> ;id; - }
-
static
- function getCollection($type) {
- //操作対象の オブジェクトを取得します
DomainObject { -
- プライベート $name
- $feed
- 関数__con struct($id
=null, - $name=null) {
- $this->name = $name ) ;
-
- function addBlog(...){
- //フィードを呼び出して友達に通知を送信します
-
}
- 機能 setFeed(フィードコレクション $フィード
) { -
} - }
?> 2.4 概要- ドメインモデルが設計されているかどうかシンプルか複雑かは、ビジネス ロジックの複雑さによって決まります。ドメイン モデルを使用する利点は、モデルを設計するときに、システムが解決したい問題に集中できる一方、他の問題 (永続性やパフォーマンスなど) は他の層で解決できることです。
実装プロジェクトでは、ほとんどのプログラマーはドメイン モデルを設計するときに依然として注意の半分をデータベースに集中しています。ドメイン モデルをデータ層から分離するにはコストがかかります。データベース コードをモデルに直接入れたほうがよいでしょう (ただし、実際の SQL を処理するためにデータ エントリを使用することもできます)。比較的単純なモデルの場合、特にクラスがデータ テーブルに 1 対 1 で対応する場合、この方法は完全に実行可能であり、オブジェクトとデータベースを調整するための外部システムの作成にかかる時間を削減できます。 -
上記では、ビジネス ロジック層のトランザクション スクリプトとドメイン モデルを、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。