【问题标题】:OOP design for deletion of an object with many dependent objects用于删除具有许多依赖对象的对象的 OOP 设计
【发布时间】:2012-01-05 09:56:51
【问题描述】:

我想知道设计删除对象的最佳方法,触发删除许多依赖对象。

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

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

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

我考虑过哪些选项:

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

【问题讨论】:

  • 很抱歉没有回答您的问题,但 Udi Dahan 发表了一篇关于“删除”一词的优秀博客:udidahan.com/2009/09/01/dont-delete-just-dont
  • 这是一个有趣的观点,但并不能解决我的问题,并且讨论“不删除”超出了这个问题的上下文。
  • 删除依赖对象需要什么样的参数? object.deleteYourself() 似乎是一个相当简单的指令,不需要任何其他输入。
  • 我的意思是,对象本身不应该拥有删除自己所需的所有信息吗?
  • 就像,我在问题中写道,例如:employer.delete(job_searcher, invoice_searcher, ...)。换句话说,我必须传递检索依赖对象所需的对象(搜索器)。也可以传递一些缓存存储对象,以便从那里删除已删除的实体。

标签: oop


【解决方案1】:

如果你将参数传递给删除函数,你就犯了一个错误。

您调用删除函数的每个 object 都应该能够识别它是其父级的其他 objects

我强调object,因为听起来你是从关系的角度来看的。

【讨论】:

  • 我想这可能是这种情况的正确答案。 MrMisterMan 在他的评论中提出了同样的建议。
【解决方案2】:

尝试以这样的方式使用组合,一旦你减少员工参考,其他人将自动变得更少参考......

其他方法是借助嵌套类,如果最顶层的封装类会得到 未引用的其他也将自动被取消引用..(但请确保您没有在其他类中提取嵌套类(例如您的内部类)的引用。)

【讨论】:

  • 也许,我应该明确指出问题在于从数据库中删除对象,即从业务逻辑域中删除对象,而不是取消设置对象本身。
【解决方案3】:

在我的工作中,我不需要编写太多代码来删除,所以请谨慎对待我的建议。查看这些对象/记录是如何创建的,并以相同的方式处理删除可能会有所帮助。例如,如果创建逻辑是这样的:

  1. 创建雇主
  2. 创建发票
  3. 将发票与雇主关联

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

  1. 删除发票与雇主的关联
  2. 删除发票
  3. 删除雇主

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

【讨论】:

  • 问题是可以在没有发票的情况下创建雇主,发票是随时单独创建的,而不是从雇主对象创建的。但是必须从雇主那里删除。我知道删除应该如何进行。这里的问题是删除依赖于主要父母(雇主)的实体的参数太多
  • 如果 Invoice 是独立于 Employer 对象创建的,为什么不独立于 Employer 对象删除它呢?我认为这是要求雇主必须负责删除,而不是创建发票(和其他孩子),这与我通常遇到的不同。但是,如果该要求确实是一项要求,我认为除了告诉雇主必须删除哪些对象(通过传递所有参数)之外,您无能为力。
  • 单独删除雇主和发票(使用不同的方法)可能会使系统处于不一致状态(发票不属于任何雇主)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
相关资源
最近更新 更多