0

一般的なオブジェクト タイプに対して特定のアクションを定義するアプリケーションがあります。

たとえば、フォーラムの投稿と画像を含めることができます。フォーラムの投稿と画像ごとに、推奨、コメント、評価のアクションを実行できます。

現在、静的クラスを定義しています

class CoreObjectUtil
{
    protected static $_objObjKey  = null;
    protected static $_objTypeKey = null;

    public static function getComments (...) {...}
    public static function getCommentsArray (...) {...}
    public static function getRatings (...) {...}
    public static function getRatingsArray (...) {...}
}

次に、このようにサブクラス化されます

class ForumPostUtil extends CoreObjectUtil
{
    protected static $_objObjKey  = 'forumpost';
    protected static $_objTypeKey = 'FP';
}

フォーラムの投稿に関連する機能を提供するため。CoreObjectUtil のジェネリック コードに、これらの関数が適用されるオブジェクト タイプごとに何をすべきかを知らせるには、2 つのパラメーターで十分です。

これらの関数を使用するために、次のようにインスタンス クラスで selectPostProcess() クラスを呼び出しています。

public function selectPostProcess ($data)
{
    $data = ForumPostUtil::mergeRatings ($data);
    $data = ForumPostUtil::mergeComments ($data);
    ...
}

これはうまく機能し、CoreObjectUtil 内のコードが何をすべきかを知るためのデータ設定を提供するサブクラスを使用して、メイン コードを CoreObjectUtil クラスに集中させます。

別のアプローチは、コードを CoreObjectUtil から基本インスタンス クラスに移動し、それをインスタンス クラスに継承することです。したがって、CoreObjectUtil から静的メソッドを呼び出すのではなく、$this->getComments() のようなメソッド呼び出しを行うことになります。

どちらのアプローチも、機能タイプの観点からは問題なく機能します。しかし、ObjectOriented の設計ガイドラインと経験豊富な ObjectOriented 開発者は、これら 2 つのアプローチについてどう考えているのだろうか。これを行うにはどの方法が望ましいですか?またその理由は?

この件についての考えや洞察をいただければ幸いです。どちらの方法でも問題なくコーディングできますが、どのルートを取るかを決めるのに苦労しています。

4

1 に答える 1

0

あなたが今持っているコードは、これまで OOP を装った最も手続き的なアプローチだと思います。つまり、あなたが今持っているものは、OOP の反対側にあります。class キーワードを使用しても OOP にはなりません。

まず第一に、静的を忘れる必要があります。使用が悪いというわけではありませんが、機能がドメイン概念をモデル化するオブジェクトに属することができるかどうかを最初に試す必要があるため、最初に試してみる必要があります。この方法では意味がない場合にのみ、ユーティリティ クラスのどこかに静的メソッドとして配置します。

実を言うと、OOP の考え方に基づいてアプリを再設計する必要があります。つまり、特定の概念またはプロセスをモデル化し、責任が 1 つしかない動作を持つクラスを定義する必要があります。さらに、ビジネス オブジェクト (フォーラムの概念をモデル化するオブジェクト) のようなものと永続性の問題を混在させてはなりません。つまり、同じオブジェクトにビジネス機能とデータベース アクセスを入れないでください。ストレージへのアクセスには別のクラスを使用します。

リポジトリ パターンを使用して、ビジネス レイヤーを永続レイヤーから分離します。複雑になる場合は、作成/更新機能とクエリ IF を混在させないようにしてください。その場合は、クエリ専用の別の読み取りモデルを使用してください。

あなたが私たちに示したコードは、クエリに関するものです。このように単純なDAO /リポジトリ(この場合は好きなように呼んでください)を持つことができます

 class ThreadViewData
 {
    public $Id ;
    public $Title;
    public $Comments; //etc
 }

  class ThreadsQueryRepository
  {
      //we inject the db access object , this helps with testing
      function _construct($db) { } 
       public function GetThread($id){ } //this returns a ThreadViewData
  }

postPROcess 機能は、評価とコメントをマージできるサービスです。しかし、マージ機能は、Rating および Comment オブジェクトにより適している可能性があります。実際に有効な提案をするためのドメインがわかりません。

ポイントは、関数ではなくオブジェクトで考える必要があり、現在は関数しかありません。

于 2012-11-03T09:33:23.963 に答える