PHP类:我应该使用2个类还是1个?

时间:2013-03-09 17:57:51

标签: php class drupal

我目前正在尝试创建一个用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。

但是,我还希望能够从数据库中检索这些调查结果的方法并对其进行操作,为我提供各种数字。在类Survey中使用这些方法感觉不对,因为它们实际上是多个 Surveys 。但是它们是相关的,并且还可能返回Survey的实例,因此不确定它们是否应该是完全独立的类。这里最好的事情是什么?

BTW我不在乎它是否是一个Drupally答案。

谢谢, Amshad

2 个答案:

答案 0 :(得分: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 :(得分:0)

使用单个类来保存数据库逻辑和业务逻辑违反了Separation of Concerns原则。我会使用一个单独的接口和类,让我们说SurveyRepository(接口)和DrupalSurveyRepository(使用Drupal DB层的接口的实现)来管理Survey持久性(即读取和写入数据库)。这将简化(单元)测试,因为当您与一些依赖注入结合使用时,您可以在没有数据库连接的情况下使用Survey相关代码来提供SurveyRepository接口的模拟实现。

对于Drupal 7+项目,我会考虑在https://drupal.org/node/1261744的帮助下将Survey作为实体类型(参见Entity API module)。然后可以使用EntityFieldQuery搜索调查,而可以使用现有的entity_load()entity_save()函数完成加载和保存。