我的问题更像是理论问题。
假设你有一个对象,代表某些东西(文章,页面,帐户等)的列表。
class ObjCollection
您有一个类,代表集合中的特定项目:
class objItem
我在思考每个对象的基本职责时遇到了问题。
哪个班级负责创建新的objItem
?
哪个班级负责删除objItem
?它应该将自己删除为方法吗?
更新1: Techpriester:使用object的构造函数作为创建新项的函数是否可以? 我想起来就像:
class objItem {
public function __construct($id = 0) {
if ($id > 0) {
// load item data...
} else {
// make new item...
}
}
}
但是,如果代码中出现问题,而不是传递$ id> 0,它通过0?在这种情况下,更期望的行为是空对象,而不是新对象,或者我错了吗?
答案 0 :(得分:3)
一种思考方式:
objItem
通常有一个类构造函数,因此该类可能负责创建objItem
类型的对象。
如果在列表/集合中插入objItem
,请说objCollection
可以 objCollection
负责将其从集合中删除。
答案 1 :(得分:2)
objItem通常有一个类 构造函数所以这个类是 负责创建对象 输入objItem。
构造函数与责任无关(通常)。以这种方式思考,每个对象都只对自己负责。
Responsiblity是一个没有直接与类层次结合的概念。
如果:
ObjCollection = Nest objItem = Egg。还有第三个对象Bird,然后Bird负责创建egs(即使nest包含egg)。这不是关于编程它是关于常识...... :)
没有“空对象”之类的东西。对象具有“状态”。你可以创建一个对象然后你拥有它,或者你可以不创建它,然后就没有对象了。
所有你不必担心的是,如果你的构造函数在两种情况下都能正常工作,创建新对象并且没有它。
通常最好将object作为构造函数参数(而不是$ id)注入,而不是在另一个对象中创建它。
答案 2 :(得分:1)
我知道这不能回答你的问题,但是因为你把它标记为PHP我会假设它几乎肯定会应用于某种数据库模型。
在这种情况下,完全废除'集合'可能是一个更好的主意,因为如果你让每个类只代表一个对象,如果你想查看10个博客帖子,例如,你将调用10个单独的SELECT查询每个只检索一个单独的数据库记录,因为你决定让'BlogPost'类封装它的检索方法。
另一种方法是让类表示一个或多个记录,这样,无论是检索5000条记录还是只检索一条记录,您只需要运行一个SELECT查询。几乎每个object-relational-mapper都会这样做。
在进行面向对象编程时,最好不要考虑行为或责任,而不是对象是否是有形的“事物”。这是OOP理论讨论的问题。使用像动物和水果这样与现实世界编程没有多大关系的类比非常诱人。
答案 3 :(得分:0)
由于对象无法自行删除,必须负责该集合。
你让集合创建它的对象如$collection->makeNewItem();
(然后调用项构造函数)或直接使用$item = new Item();
,然后一些$collection->addItem($item);
方法完全取决于你和需求你的申请。
如果项目本身也在集合之外使用,我建议使用常规实例化。