2009-05-06 60 views
1

假设我有一个拥有Dog对象集合的Person类。这种关系是双向的。现在包含集合的Web应用程序域对象是否应该添加和删除项目方法?

public class Person { 
    private List<Dog> dogs; 
    // getter and setter for dogs 
} 

public class Dog { 
    private Person person; 
    // getter and setter for person 
} 

好吧,如果我只是用这些对象的工作,我会在人方法可用于添加狗和删除狗,以便客户端不直接与收集。

public void removeDog(Dog dog) { 
    dogs.remove(dog); 
    dog.setPerson(null); 
} 

public void addDog(Dog dog) { 
    dog.setPerson(this); 
    dogs.add(dog); 
} 

或沿着这些线的东西。

我的问题来处理这些对象在服务层。我可以通过addDog给一个人添加一条新狗,并简单地保存将自动持续新狗的人。但是,通过removeDog移除一只狗,然后保存该人将不会自动从持久存储中删除该狗......它只会将狗引用设置为null。

所以我最终的东西,如:

Dog dog = dogDAO.getDogById(int id); 
dogDAO.remove(dog); 

因为这是一个Web应用程序以及人员和狗没有在内存中保存,这工作得很好,我从来没有叫Person.removeDog()。下次我加载最初引用此狗的人时,它将不包含该狗,因为它已从存储中移除。同样的事情可以适用于添加狗:

Person person = personDAO.getPersonById(int id); 
Dog dog = new Dog(); 
dog.setPerson(person); 
dogDAO.save(dog); 

这同样适用,甚至罚款,我从来没有叫Person.addDog()。

然后在我的Person类中使用addDog和removeDog方法有什么意义吗?

回答

1

没有人工干预,这总是很难做到。一旦你删除了对象引用并且有一个陈旧的对象。在另一个用例中,您只需删除其他对象指向的对象(列表)。这也应该是一个问题。如果这被懒惰地接受,它会覆盖很多错误。

为了简单起见,你可以在DAO的删除操作添加到人removeDog(),但是用例取出狗从一个人,并把它添加到另一个是不可能的。如果你知道它必须被删除,那么你将该狗从该人身上移除并将其从持久性中移除的问题是什么?你只需要一步。于是久违的去除狗会带给你的

dogDAO.remove(person.removeDog(dog)) 

具有添加模式,并亲自删除使您不仅能够模拟天生列表行为,但也有一些额外的功能。在你的情况很难决定,因为它是一个简单的设置,它取决于如何accesible道的东西是什么,你喜欢把它放在哪里。

您应该至少对您想要支持的每个用例有一个印象。然后需要定义强制和可选的对象链接和设置。通过一些实用主义(例如,将持久性内容与对象耦合),我们必须有机会做一些更易于使用的面向对象的设置(并且因此不易出错)以便使用

1

如果从逻辑上向人添加并移除狗是如何完成的,那么没有理由有办法增加和删除狗的人。您的目标是您的数据模型始终处于一致状态。如果允许去除狗的人,那么你就必须有狗从人自身删除,让您的数据模型是一致的。那么你必须避免递归。

这听起来像你拥有它的方式很好,清晰明确。如果你愿意,你可以随时给Dog类添加一条评论,以补充说明没有addPerson和removePerson方法是有目的的,并且这应该通过从人中移除狗或将狗添加到人来完成。

代码中不需要完美的对称性或完美的正交性。目标不是为了这个目的,而是为了保持数据模型的一致性,以一种干净,可理解的方式。

相关问题