0

当我的构造函数是纯参数到属性设置器时,我不确定将类需要正常工作的其他代码放在哪里。

例如,在 JavaScript 中,我正在编写一个WindowMessageController处理对象message事件的程序window

为了使它起作用,我必须在某处附加处理程序:

var controller = this;
this.applicableWindow.addEventListener("message", function(event) {
    controller.messageAction(event.data);
} 

这些东西正确地属于哪里?

  1. 在构造函数中
  2. 在 .initialize() 方法中 - 引入时间耦合
  3. 在 WindowMessageControllerFactory.create(applicableWindow) 中——对于如此核心的代码来说,这是一个相当遥远的地方。这意味着即使是这么小的班级也会被分成两部分。
  4. 在组合根本身中 - 这会在一直做时增加它的大小
  5. 在其他一些类 WindowMessageRouter 中,只有一个方法,即构造函数,使用此代码

编辑

这种情况似乎很特殊,因为在应用程序中通常只有一个这样的控制器实例。然而,在更普遍的情况下,如果我正在创建一个Button将包裹一些 DOM<button />元素的类的实例,那么答案是什么?突然一个

button = buttonFactory.create(domButtonEl);

似乎更有用。

4

3 回答 3

2
  1. 不要将任何实际工作放入构造函数中。构造函数很难模拟。请记住,接缝又名方法是可模拟的。构造函数不可模拟,因为继承和模拟。

  2. 初始化是一个禁止的词,非常笼统。

  3. 也许吧,但是如果你害怕很多类,你也可以将工厂实现为类的静态方法,)

  4. 组合根只是一个普通的工厂。除了它只有一个,因为您的应用程序可能只有一个入口点,)

  5. 常见的,我们使用的是 Javascript。如果您只需要一种工厂方法,为什么还需要类呢?请记住,函数是一流的对象。

并用于编辑。singington 没有什么特别之处,除非它们不控制自己的生命周期。

黄金法则:总是(几乎,)在应用程序布线和应用程序逻辑之间进行分离。工厂正在布线。只是接线,没有逻辑,因此无需测试。

于 2012-03-22T20:45:20.890 回答
1

我会将此代码放入initialize(window)方法中,但此方法不能是WindowMessageController的公共 API 的一部分 - 它必须是可见的,并且只能由直接用户(因此组合根和测试)调用。因此,当 DI 容器返回WindowMessageController实例时,调用初始化方法是容器的责任。

回复编辑:是的,这家工厂对我来说似乎是最好的方式。顺便提一句。不要忘记工厂应该有一个dispose方法(即在button的情况下取消绑定事件处理程序)......

于 2012-03-20T12:23:26.890 回答
0

我认为您需要创建一个负责事件分发的路由器类。路由器应该订阅所有事件并将它们分发给控制器。它可以使用某种消息控制器映射,注入到构造函数中。

于 2012-03-22T16:32:24.727 回答