0

アプリケーションのオンライン状態に応じて、mysql db または xml ファイルにデータを書き込むことができる必要がある Web アプリケーションを構築しています。

私のモデルには、スーパー クラス (Dao はデータ アクセス オブジェクト) があります...

 abstract class Dao {

    static function getInstance($online_status) {

        if $online_status = 'online' {

            return new DaoMySQL;

        } else {

            return new DaoXML;

        }

    }

    abstract function dao_select();
    abstract function dao_insert();
    abstract function dao_update();
    abstract function dao_delete();

}

さて、ここが私が混乱している部分です。以下を使用して適切な Dao を選択するドメイン モデル/エンティティ クラスがあります。

$this->dao = Dao::getInstance($online_status);

これで、正しいデータ アクセス オブジェクトが選択されました。しかし、問題はまだ dao_select() と他の関数の 2 つの実装です。現在、主な実装は DaoMySQL と DaoXML のそれぞれのクラスにありますが、これらの各クラスの dao_select() には異なるものが必要です。つまり、DaoMySQL バージョンには、$table と $where_statement の 2 つのパラメーターが必要です。DaoXML (私は実装していません) には要素名が必要で、別の引数が必要になるかもしれませんが、わかりません。

したがって、私のドメインモデルクラスでは、呼び出した後

$this->dao = Dao::getInstance($online_status);

これは、dao_select() の 2 つの別個のローカル実装 (ドメイン モデル/エンティティ クラスのみに関連する) を含める必要がある場所ですか、それとも間違っていますか? 次のようなことを行うことで、プロセスからエレガンスを取り除いているようです。

class EntityModel {

  $this->dao = Dao::getInstance($online_status);

  if($this->dao->type = 'mysql') {

    $result = $this->dao->dao_select($table, $where);

  } else {

    $result = $this->dao->dao_select($xml_params);

  }


} 

システムからシンプルさを取り除いているような気がします... このアプローチは理にかなっていますか、それとももっと良いアプローチがありますか?

4

1 に答える 1

0

それは間違っている。

最初にいくつかの注意事項:

  • OOP では、extendsステートメントは関係であることを示します。つまり、class Duck extends Birdすべて問題ありませんが、書き込みclass User extends TableNOTです。
  • MVC では、Model はクラスでもクラスのインスタンスでもありません。代わりに、アプリケーションのレイヤーであり、主に次の 2 種類の要素で構成されています。
    1. ドメイン オブジェクト: ドメインのビジネス ルールとロジックを含む
    2. データ アクセス構造: 通常、情報の格納と取得を扱うデータマッパー

モデル層の 3 番目の重要な部分はサービスであると私は主張します。ただし、それがモデルの一部であるか、モデルを超えているかについてのオプションがあります。

現在、あなたがしようとしているのは、ActiveRecord (これは小さなことには問題ありませんが、プロジェクトが成長するにつれて、アーキテクチャの負担になります..これはあなたが今直面していることです) パターンを動的データソースで動作させることです。そのためには、手続き型呼び出しに頼っています。

とにかく、重要なのは、DAOインスタンスをドメイン オブジェクト(「モデル」と呼ぶもの) に挿入する必要があるということです。また、作成は別のファクトリ インスタンスに任せる必要がありDAOます。これは、それらの初期化とデータ ソース (PDO またはファイル パスのインスタンス) の提供を担当します。このようにして、責任を分離するだけでなく、保存先を「その場で」交換することもできます。

詳細については、依存性注入とは何かを調べる必要があります。以下に役立つビデオをいくつか示します。

于 2012-05-07T07:30:11.647 に答える