2012-11-03 57 views
0

我有一个应用程序定义了常见对象类型的某些操作。PHP OO设计:扩展静态类或实例类?

例如,您可以拥有论坛帖子和图片。对于每个论坛帖子和图片,您可以执行以下操作:推荐,评论,评分。

我已经当前定义的静态类

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中的泛型代码知道为这些函数适用的每种对象类型要做什么。

要使用这些功能,我打电话在我的实例类selectPostProcess()类这样的:

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

这种运作良好,并保持在CoreObjectUtil类集中与它的子类提供数据的主要代码设置让CoreObjectUtil中的代码知道该怎么做。

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

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

我希望对此事有任何想法/见解。我可以在没有问题的情况下以任何方式编写代码,但我很难决定采取哪条路线。

+2

一般的说法是:使用对象,而不是静态类的功能。对象更加灵活。 – hakre

+0

当你进行全静态类时,它甚至不是OOP。 “类”实际上就像变量和函数的名字空间一样。基本上,这只是程序编程的另一种形式。 –

回答

0

你现在有一个代码,我认为,最程序的做法曾经冒充OOP即你现在有什么是OOP的对面。使用class关键字不会使其成为OOP。

首先,你应该忘记静态,这不是它不好使用,但它很容易被滥用,如果功能可以属于建模领域概念的对象,你必须首先尝试(在你的案例论坛有关)。只有当这种方式没有意义时,你才会将它作为实用程序类中的静态方法。

说实话,你必须重新设计围绕OOP心态尤尔的应用程序,这是与模型中的具体概念或过程,其中只有一个responsaiblity行为定义类。更重要的是你不应该把业务对象(对论坛概念进行建模的对象)与持久性问题混合在一起,即不要将业务功能和数据库访问放在同一个对象中。使用单独的类访问存储。

使用存储库模式将业务层与持久层分开。尽量不要将创建/更新功能与查询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 
    } 

的后处理功能,可以合并评分和评论服务。但是,也许合并功能更适合评级和评论对象。我不知道该域名实际上是否提供了有效的建议。

要点是,你必须思考不在函数中的对象,现在你所拥有的只是函数。

+0

谢谢您的详细解答!我会根据您提供的想法重新设计。 – user13955