课堂设计中的责任委托

时间:2012-12-27 16:09:06

标签: java oop

我有一个情况,我希望验证什么是更好的(设计)方法。

假设我有一个类'XController',它包含/实例化'XObject'实例的集合。而且,我有一个负责实例化XController的客户端。

现在,如果我希望对实例化的XObject进行操作,建议采用以下哪种方法:

方法1:

XController x = new XController(); // do something in the constructor to create XObjects with ids, x1, x2, so on...

x.doStuff(x1); // which does some stuff with the XObject with id 'x1'

方法2:

XController x = new XController(); // do something in the constructor to create XObjects with ids, x1, x2, so on...

XObject xObj1 = x.getXObject(x1); 
xObj1.doStuff(); // which does some stuff with(in) itself

注意:

  • 在doStuff()之前/之后,Controller并没有真正做任何事情。
  • doStuff()的实现通常只会更新该对象的状态。

任何提及为什么一个人会比另一个更好的人都会受到高度赞赏。

3 个答案:

答案 0 :(得分:2)

首先,这是相当抽象的,因此人们只能猜测代码的意图,。

这两种方法几乎完全相同。在这两种情况下,消费代码告诉x1做东西。 您应该采用方法#2 ,因为看起来消费代码是知道它具有x1并且希望x1做某事的实体。有一个名为 information expert 的原则;只有知道如何做某事的代码才应该是这样做的。

如果你采用方法#1,看起来你正在做的就是让另一个类负责在消费代码已经知道它应该被调用时调用一个对象。实际上,如果消费者知道调用x1.DoStuff(),为什么要把它交给别的东西并要求它做那件事呢?

话虽如此,这里缺少很多变量:控制器是否总是在每个对象上调用DoStuff()之前做一些事情?调用DoStuff()后控制器是否执行某些操作?调用DoStuff()会改变控制器中任何内容的状态吗?等...

直到有更多细节,这是我能给你的最好的。

答案 1 :(得分:0)

如果不了解更多细节,很难说。

但是第一个解决方案可能会更好,如果调用代码现在不需要任何关于XObjects的东西,因为它们被XController包装。这样,如果需要,可以在不影响调用者的情况下更改XObject。

如果您要详细说明您尝试编码的内容,可以提供更好的建议。

答案 2 :(得分:0)

虽然没有提供足够的信息,但仅根据所呈现的内容,第二种方法优于第一种方法。因为,如果你想对XObject执行操作,通过中间件(XController)执行它是违反OOP(封装等)的原则,并且它也不必要地使代码变得复杂(它在多个位置上分散了一个工作单元) )。

此外,似乎你在这里称为Controller,是一种Repositofy - 你提供某种ID,它为你提供了对象。这是为什么在XController中对XObject执行“stuff”可能不是一个好主意的另一个原因。