当我的构造函数是纯粹的参数到propeties setter时,我不知道在哪里放置类需要正确工作的其他代码。
例如,在JavaScript中,我正在编写一个WindowMessageController
来处理message
对象上的window
个事件。
为了使其工作,我必须在某处附加处理程序:
var controller = this;
this.applicableWindow.addEventListener("message", function(event) {
controller.messageAction(event.data);
}
这些东西正确属于哪里?
修改
这种情况似乎很特殊,因为应用程序中通常只有一个这样的控制器实例。但是在更一般化的情况下,如果我创建一个Button
类的实例来覆盖一些DOM <button />
元素,那么答案是什么?突然一个
button = buttonFactory.create(domButtonEl);
似乎更有用。
答案 0 :(得分:2)
不要将任何实际工作放入构造函数中。构造者几乎不可模仿。请记住,接缝aka方法是可模仿的。构造函数不可模仿,因为继承和模拟。
初始化是一个禁止的词,非常一般。
也许,但如果您害怕很多类,也可以将工厂实现为类的静态方法,
组合根只是一个普通的工厂。除了它只有一个,因为你的应用程序可能只有一个入口点,)
很常见,我们正在使用Javascript。如果您只需要一种工厂方法,为什么需要上课呢?请记住,函数是一流的对象。
编辑。 singetons没有什么特别之处,除非他们不控制自己的生命周期。
黄金法则:总是(差不多)在应用程序布线和应用程序逻辑之间进行分离。工厂正在布线。只是接线,没有逻辑,因此无需测试。
答案 1 :(得分:1)
我会将此代码放入 initialize(window)方法,但此方法不能成为 WindowMessageController 的公共API的一部分 - 它必须是可见的并由直接用户(仅限组合根和测试)。 因此,当DI容器返回 WindowMessageController 实例时,容器负责调用 initialize 方法。
回复编辑:是的,这家工厂对我来说似乎是最好的选择。顺便说一句。不要忘记工厂应该有一个 dispose 方法(即在按钮的情况下取消绑定事件处理程序)...
答案 2 :(得分:0)
我认为您需要创建一个负责事件分发的路由器类。此路由器应订阅所有事件并在控制器之间分发。它可以使用某种消息控制器映射,注入构造函数。