2010-04-04 44 views
1

我的问题更像是一个理论。对象责任 - 列表和项目

假设你有一个对象,它表示的事情列表(文章,页面,帐户等)

class ObjCollection 

你有一个类,它代表收集的特定项目:

class objItem 

我有一个思考每个对象的基本职责的问题。

哪个班级负责创建新的objItem

哪一类负责删除objItem?它应该删除自己作为一种方法?


更新1: Techpriester:它是确定使用对象的构造函数的函数来创建新的项目? 我认为像的:

class objItem { 
    public function __construct($id = 0) { 
     if ($id > 0) { 
      // load item data... 
     } else { 
      // make new item... 
     } 
    } 
} 

但是,如果有什么东西在代码中出现问题,而是,它传递0传递一个的$ id> 0的?在这种情况下,更多预期的行为将是空的对象,而不是新的对象,或者我错了吗?

回答

1

我知道这不能回答你的问题,但是因为你把它标记为PHP,我将假设它几乎肯定会应用于某种数据库模型。

在这种情况下,彻底废除'集合'可能是一个好主意,因为如果您让每个类仅代表一个对象,例如,如果您想查看10篇博客文章,则可以调用10个独立SELECT查询每个只检索单个数据库记录,因为您决定让'BlogPost'类封装其检索方法。

另一种方法是让类表示一个或多个记录,这样,只需运行一个SELECT查询,无论您是检索5000条记录还是只有一条。几乎每个object-relational-mapper都这样做。

在做面向对象编程,这是更好地认为在行为责任不是对象是否是一个有形的“东西”条款。这就是面向对象的理论讨论的问题。使用类似动物和水果等与真实世界编程无关的类比是非常诱人的。

3

思考这个的一种方式:

objItem通常有一个类构造函数,因此该类可能是负责创建objItem类型的对象。

objItem插入列表/集合假设objCollection可以objCollection责任从集合中删除它。

0

由于物件本身无法删除,所以必须是集合的责任。

无论您让集合创建它像$collection->makeNewItem();对象(然后调用构造函数的物品),或直接使用$item = new Item();,然后一些$collection->addItem($item);方法完全取决于你和你的应用程序的需要。

我建议使用常规实例化,如果项目本身也在集合之外使用。

2

objItem通常有一类 构造函数,因此这个类是 负责创建 型objItem的对象。

构造函数与责任无关(通常)。以这种方式思考,每个对象都只会对自己负责。

责任是一个概念不直接绑定类层次结构。

如果:

ObjCollection = Nest objItem = Egg。还有第三个对象Bird,然后Bird负责创建egs(即使巢中含有蛋)。这不是关于编程它是关于常识...... :)

有没有像“空对象”这样的事情。对象具有“状态”。你可以创建一个对象然后拥有它,或者你可能不创建它,那么就没有对象。

所有你必须担心的是,如果你的构造函数在两种情况下都能正常工作,并且创建了新对象并且没有它。

通常最好将对象作为构造函数参数(而不是$ id)注入,而不是在另一个对象内创建它。

+1

+1与鸟类相比,它使这个事情更清晰。 – 2010-04-04 19:58:47