2016-03-22 7 views
0

私はPHPで実装している(概念的に)かなり単純なアプリケーション仕様を持っています。その大部分はプロジェクトデータの読み込み、表示、ユーザーによる編集(潜在的にセクションの追加)データベースに戻ります。OOPHPのデュアルロード/保存オブジェクト - 不要な重複?

私はthuslyそれに近づい上で計画しています:

  • は、作成時にIDを取る基本的な「ロード」オブジェクト(例えばProjectLoad、FormLoad)のセットを持つデータベースを照会し、と自分自身を埋めますフェッチされたデータ。これらのオブジェクトを使用してページ要素を埋めることができます。

  • 配列を取って(ページが送信されたときに返される)「保存」オブジェクト(例:ProjectSave、FormSave)をもう1組持ち、データベースにINSERT\UPDATE操作を実行します。この不必要な重複は

ですか?私はただOOPHPを扱っています。これまで見てきたアドバイスのすべては、すべてのもの(オブジェクト、メソッドなど)を可能な限りフォーカスし、単一目的にすることをお勧めしているようです。これはその基準を満たしているようですが、より良い方法がありますか?

答えて

3

それはあなたが二つの概念にあなたの方法をブレインストーミングするために管理するもののようになります。

  • Data Mappers

  • 分離新しいエントリ を作成するためのロジックと取得するためのロジックの背後にあるコアアイデアデータ(この考え方は、の文脈では、特にCQRSで重要です)

しかし、私は、データマッパーはあなたが把握するのが非常に簡単なはずですが、2番目のCQRS関連の部分は、あなたが探索するには早すぎるかもしれないと考えています。ご質問については

...
あなたは愚かな何かをする場合を除き、あなたの「ロードオブジェクト」に多くの重複がないだろうと、「オブジェクトを保存」..しかし、あなたはおそらく抽出します1つまたは2つそこにスーパークラス。

「あなたが見たアドバイス」は実際にはSingle Responsibility Principleと呼ばれ、TBHですが、OOPではより不明瞭な概念です。それは、あなたがそれを見て、それを知っている、 "ポルノ"とは何かを定義するようなものです。

さらに、より良いアプローチをお勧めする場合は、読み取りと書き込みの部分を1つのデータマッパーで結合することをお勧めします。こんな風に:

$project = new Entity\Project; 
$mapper = new Mapper\Project($pdo); 

$project->setId(43); 
$mapper->load($project); //pulls data about project 43 from DB 

if ($project->getDeadline() > time()) { 
    $project->setStatus(Entity\Project::STATUS_OVERDUE); 
    $mapper->save($project); //pushes changed state to DB 
} 
+0

あなたの頭の中で定義しようとしてきたことが、あなたが得たよりも適切な名前と深い探求を持っていることを知ることは、常に素晴らしいことです。 データマッパーは私が必要としているように見えますが、悲しいことに、PHPはオブジェクトを永続化しないため、すべての最後にsave($ project)を呼び出すことはできません。 Mapperスーパークラスに一対の静的メソッドを配置し、それらを使用してIDまたは配列からロードを呼び出すことができます。これはhttp://stackoverflow.com/a/1701337/3171734とよく似ています。 –

+0

そして、私は将来の参照のためにCQRSリンクをブックマークします。このサイトはCRUDで手に入れることができるはずですが、ポインタはとても感謝しています。 –

+0

静的メソッドと変数の使用を強くお勧めします。前者はグローバルな名前空間を持つ関数、後者は栄光のあるグローバル関数です。 datamapper-routeに行く場合は、エンティティごとに1つのマッパーを用意する必要があります。プロジェクト用に別のマッパー、ユーザー用に別々のマッパーを用意する必要があります。 –

0

まだコンセプトであるため、実際には重複しているかどうかはわかりません。実装中に重複が実際に発生していると思います。コンセプトとして、あなたのクラス間の懸念を分ける良い仕事をしました。 - 基本的な(ビルディング・ブロック)のためのデザインパターン

  • OOP Design Patterns

    あなたが本当にOOPHPにしている場合は、同様にデザインパターンについてのトピックを確認してください可能性があります。ソフトウェア工学で

    、ソフトウェアデザインパターンは、一般的に発生する問題への一般的な 再利用可能なソリューションです... デザイン:ウィキペディアによると、先進的なデザインパターン

から

  • Martin Fowler's Patterns of Application Architectureパターンは、 アプリケーションまたはシステムを設計する際に、プログラマが一般的な問題を解決するために使用できる公式ベストプラクティス です。

  • +0

    私は実際にその定義に同意しません。それは、デザインパターンが既製のレシピまたは缶詰ソリューションであるという印象を与えます。 IMHO、デザインパターンは実際には*略号*であり、開発者**がすでに存在するコード**を記述するために使用されます。 1つは "パターンを適用"しません。代わりに、あなたが書いたコードから "パターンが出てくる"。 –

    関連する問題