0

現在、PHP(Drupal)でアンケートを扱うクラスを作ろうとしています。これまでのところ、私はこれを持っています:

class Survey{

  public $id;
  public $uid;
  public $rate;
  public $reason;
  public $complete;
  public $opinion;

  public function save(){
    drupal_write_record('survey', $this);
  }
}

これは素晴らしいことです。Survey の新しいインスタンスを作成し、プロパティを設定して、save を呼び出すことができます。

ただし、DB からこれらの調査の結果を取得し、それに基づいてさまざまな数値を取得するメソッドも必要です。Surveyこれらのメソッドは実際には複数のSurveyであるため、クラスにこれらのメソッドを含めるのは適切ではありません。ただし、それらは関連しており、のインスタンスを返すこともあるSurveyため、完全に別のクラスにする必要があるかどうかはわかりません。ここで何をするのが最善ですか?

ところで、それが Drupally の答えであるかどうかは気にしません。

ありがとう、アムシャド

4

2 に答える 2

0

何でもそうですが、独自の長所と短所を持つ多くのアプローチがあります。

私の(現在の)好みは、オブジェクトのグループと個々のオブジェクトをそれぞれ処理するために、クラスメソッド(静的)とオブジェクトメソッドを組み合わせることです。

次のコードを検討してください。

class Survey {
    public $id;
    public $uid;
    public $rate;
    public $reason;
    public $complete;
    public $opinion;

    public function save()
    {
        drupal_write_record('survey', $this);
    }
    /**
     * Loads survey from secondary storage
     * 
     * @param string $id Unique surevy ID
     */
    public function load( $id ) {
        // loads a survey from secondary storage
    }
    /**
     * Returns report of survey results.
     * 
     * @param array $surveys array of surveys to process. If not passed or NULL,
     *     The whole set of completed surveys will be processed.
     * @return string HTML Formatted report
     */
    public static function compile_results( $surveys = NULL )
    {
        if( empty( $surveys ) )
        {
            $surveys = self::get_completed_results();
        }
        foreach( $surveys as &$survey )
        {
            // process an individual survey, possibly aggregating it
        } 
    }
    /**
     * Retreives completed surveys from secondary storage.
     * 
     * @return array  Array of completed Survey objects
     */
    public static function get_completed_surveys()
    {
        $surveys = array();
        // Select all surveys from secondary storage
        $survey_rows = array(); //replace with code to get surveys
        foreach( $survey_rows as $survey_row )
        {
            $survey = new Survey();
            $survey['id']       = $survey_row['id'];
            $survey['uid']      = $survey_row['uid'];
            $survey['rate']     = $survey_row['rate'];
            $survey['reason']   = $survey_row['reason'];
            $survey['complete'] = $survey_row['complete'];
            $survey['opinion']  = $survey_row['opinion'];

            $surveys[] = $survey;
        }
        return $surveys;
    } 
}

静的メソッドを使用して、オブジェクトのグループを操作できます。ロードされた各調査への参照を保持する静的配列を持つこともできます。

もう1つのオプションは、調査のグループを操作することを目的とした「調査」クラスを用意することです。以前のアプローチは私にとってよりクリーンに感じます。

于 2013-03-09T21:35:42.013 に答える
0

単一のクラスを使用してデータベース ロジックとビジネス ロジックの両方を保持することは、関心の分離の原則に違反します。SurveyRepositoryたとえば、(インターフェイス) と(Drupal DB レイヤーを使用したインターフェイスの実装) を分離したインターフェイスとクラスをDrupalSurveyRepository使用して、Survey の永続性を管理します (つまり、データベースの読み取りと書き込み)。これにより、インターフェイスのモック実装を提供するためにいくつかの依存関係の注入と組み合わせると、データベース接続なしで調査関連のコードを実行できるため、(単体) テストが容易になりSurveyRepositoryます。

Drupal 7 以降のプロジェクトでは、 Entity API モジュールを使用して、Survey をエンティティ タイプにすることを検討します ( https://drupal.org/node/1261744を参照) 。Survey の検索は を使用して実行でき、ロードと保存は既存のおよび関数を使用して実行できます。EntityFieldQueryentity_load()entity_save()

于 2013-03-11T19:12:02.343 に答える