2

我在这里遇到一种情况,我希望验证什么是更好的(设计)方法。

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

现在,如果我希望对实例化的 XObjects 做一些事情,推荐以下哪一项:

方法一:

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'

方法二:

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() 之前/之后并没有真正做任何事情。
  • doStuff() 的实现通常只会更新该对象的状态。

任何关于为什么一个比另一个更好的参考都受到高度赞赏。

4

3 回答 3

2

首先,这是相当抽象的,所以只能猜测代码的意图。

这两种方法几乎是同一回事。在这两种情况下,消费代码都在告诉 x1 做一些事情。您应该使用方法#2,因为看起来消费代码是知道它有一个 x1 并且它希望 x1 做某事的实体。有一个原则叫信息专家;只有知道如何做某事的代码才应该是做这件事的代码。

如果您使用方法#1,您似乎所做的只是让另一个类负责调用一个对象,而消费代码已经知道应该调用它。事实上,如果消费者知道调用 x1.DoStuff(),为什么要把它交给其他东西并要求它做那件事呢?

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

在有更多细节之前,这是我能给你的最好的。

于 2012-12-27T17:49:31.410 回答
0

在不知道更多细节的情况下很难说。

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

如果您想更详细地描述您要编写的代码,则可以提供更好的建议。

于 2012-12-27T17:51:46.450 回答
0

虽然没有提供足够的信息,但仅根据所提供的内容,第二种方法比第一种方法更好。因为,如果您想对 XObject 执行操作,通过中介(XController)执行此操作违反 OOP(封装等)原则,并且不必要地使代码复杂(它将工作单元分散在多个位置)。

此外,您在这里称为 Controller 的东西似乎是一种 Repositofy - 您向其提供某种 ID 并为您提供对象。这也是为什么在 XController 中对 XObject 执行“东西”可能不是一个好主意的另一个原因。

于 2012-12-27T21:44:29.783 回答