2012-01-05 71 views
1

我想知道设计对象删除的最佳方法,并触发删除许多相关对象。用于删除具有许多相关对象的对象的OOP设计

这里是一个例子。有一个雇主类。当雇主被删除时,其所有工作,发票都将被删除。当作业被删除时,其类别选择也会被删除。等等。因此,您可以看到在更多对象上删除Employer触发器删除。问题是我必须将删除依赖对象所需的许多参数传递给Employer类中的delete方法。

这里是一个简化的例子。想象一下班级的主。当一个主对象被删除时,对象Dep1,Dep2也必须被删除。当Dep1被删除时,Dep11也必须被删除。如果删除方法如下所示:Dep1.delete(arg1),Dep2.delete(arg2),Dep11.delete(arg3),则Main上的删除方法如下所示:Main.delete(arg1,arg2,arg3) 。你看?更多的对象依赖于主 - 更多的参数将需要删除。

我还必须指出,我有兴趣从数据库中删除,即删除其“业务逻辑”意义。我甚至没有在删除方法中取消“删除”对象。

我曾考虑哪些选项:

  • 分组需要删除到一个单独的对象参数。我只是不明白所有这些参数如何分组。他们根本没有属于一起。例如,如果需要一个Invoice_searcher和Job_searcher - 为什么他们会一起在一个对象中?那可能是什么物体?
  • 将雇主类中的删除方法中的依赖对象删除。在这种情况下,如果不显式调用子对象的删除方法,会使系统处于不一致的状态。我想避免这种情况。
+0

对不起,没有回答你的问题,但Udi Dahan发表了一个关于术语“删除”的优秀博客:http://www.udidahan.com/2009/09/01/dont-delete-just-dont/ – Kane 2012-01-05 10:00:12

+0

这就是一个有趣的观点,但并没有解决我的问题,并讨论“不删除”是在这个问题的背景下。 – 2012-01-05 10:10:34

+2

删除相关对象需要什么样的参数? 'object.deleteYourself()'似乎是一个相当简单的指令,不需要任何其他输入。 – MrMisterMan 2012-01-05 10:17:30

回答

1

如果您将参数传递给删除函数,那么您犯了一个错误。

每个对象上你打电话给你删除功能应该能够识别其他对象它是父。

我强调对象,因为它听起来像是从关系角度来看这件事。

+0

我想这可能是这种情况的正确答案。MrMisterMan在他的评论中也提出了同样的建议。 – 2012-01-06 05:12:58

0

尝试使用成分以这样的方式,一旦你让员工参考其他少会自动变成引用少....

另一种方式是采取嵌套类的帮助下,如果顶部最封装的类将得到 unreferenced其他也将被自动得到unreferenced ..(但要确保你没有拔出嵌套类的参考(说你的内部类)在其他类中)

+0

也许,我应该明确指出,问题是从数据库中删除对象,即从业务逻辑域中删除对象,而不是自己删除对象。 – 2012-01-05 10:15:24

0

在我的工作线我不需要编写太多的代码来删除,所以请一定要听取我的建议。这可能有助于了解如何创建这些对象/记录,并以相同的方式处理删除操作。例如,如果创建的逻辑是这样的:

  1. 创建雇主
  2. 创建发票
  3. 副发票与雇主

比也许删除逻辑应该是这样的:

  1. 删除与雇主发票的关联
  2. 删除发票(或多个)
  3. 删除雇主

只要实体在一个洽方式创建,删除它们以相反的顺序也应该被证明是洽。

+0

问题是可以在没有发票的情况下创建雇主,任何时候都可以单独创建发票,而不是从雇主对象创建发票。 但是删除必须发生在雇主身上。 我知道应该如何删除。这里的问题是删除实体的参数过多,这些实体取决于主要父(雇主) – 2012-01-05 19:22:03

+0

如果发票是独立于雇主对象创建的,为什么不独立于雇主对象删除?我认为这是要求雇主必须负责删除,但不是创建发票(和其他子),这使得这与我通常遇到的不同。但是,如果这个要求确实是一个要求,我不认为除了告诉雇主哪些对象必须被删除(通过传递所有参数)之外,你可以做任何事情。 – 2012-01-06 21:44:57

+0

独立删除雇主和发票(使用不同的方法)可能会导致系统处于不一致的状态(发票不属于任何雇主) – 2012-01-08 13:37:48