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';
}

为论坛帖子提供相关功能。这 2 个参数足以让 CoreObjectUtil 中的通用代码知道对这些函数适用的每个对象类型要做什么。

要使用这些函数,我在我的实例类中调用 selectPostProcess() 类,如下所示:

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

这很好用,并且将主要代码集中在 CoreObjectUtil 类中,其子类提供数据设置,让 CoreObjectUtil 中的代码知道该做什么。

另一种方法是将代码从 CoreObjectUtil 移动到基实例类中,然后在我的实例类中继承。因此,我不会从 CoreObjectUtil 调用静态方法,而是像 $this->getComments() 这样的方法调用。

从功能类型的角度来看,这两种方法都可以正常工作。然而,我想知道面向对象的设计指南和经验丰富的面向对象开发人员如何看待这两种方法。哪种方式更可取,为什么?

我将不胜感激有关此事的任何想法/见解。我可以毫无问题地编码任何一种方式,但我很难决定采取哪条路线。

4

1 回答 1

0

我认为,您现在拥有的代码是有史以来最程序化的方法,即您现在拥有的是 OOP 的另一面。使用 class 关键字不会使其成为 OOP。

首先,您应该忘记静态,并不是说它不好用,而是它很容易被滥用,如果该功能可以属于对域概念建模的对象(在您的情况下与论坛相关),您真的必须首先尝试。只有当它以这种方式没有意义时,你才会将它作为一个静态方法放在实用程序类的某个地方。

说实话,您必须围绕 OOP 思维重新设计您的应用程序,即定义具有行为的类,这些行为建模特定概念或过程并且只有一个责任。此外,您不应该将业务对象(对论坛概念建模的对象)与持久性问题混为一谈,即不要将相同的对象业务功能和数据库访问。使用单独的类来访问存储。

使用存储库模式将业务层与持久层分开。尽量不要将创建/更新功能与查询混合在一起,如果它使事情变得复杂。在这种情况下,使用专门用于查询的单独读取模型。

您向我们展示的代码是关于查询的。您可以像这样拥有一个简单的 DAO/Repository(在这种情况下可以随意调用它)

 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 回答