【问题标题】:OOP - Can and should events be part of the abstractions?OOP - 事件可以而且应该成为抽象的一部分吗?
【发布时间】:2015-09-11 15:03:29
【问题描述】:

想象一下,我有一个对象系统,它们是事件发射器,也可以监听其他对象中的事件。在这个系统中,这些对象之间主要使用事件进行通信。

我想遵循良好的面向对象实践,并且我有兴趣为我的对象创建抽象。我将使用的实际语言并不重要:例如,这些抽象可以是接口或抽象类。

这类抽象定义对象中的方法和属性,但不定义事件名称。新的实现可能会决定抛出全新的事件......确实,您总是使用相同的方法来抛出它们,但是如果您正在创建新的事件名称,我的印象是您在某种程度上违反了开放/封闭原则:我会说这相当于添加新方法。

是否有一种方法可以在该对象遵循的抽象中说明此类对象可以发出的可能事件?

我对它在 Java、C++、Javascript 和 Typescript 等语言中的工作方式很感兴趣。我不完全确定,因为我不了解 C#,但我认为在那种语言中,事件可以成为接口的一部分。但我感兴趣的是,您如何让事件成为那些不直接支持的其他语言的抽象的一部分。

【问题讨论】:

    标签: oop events solid-principles open-closed-principle


    【解决方案1】:

    在代码中有效执行这些合同的能力会因所使用的语言而异,因此最佳解决方案并不是真正与语言无关:每种语言都有一种惯用的做事方式。

    一种可能在所有类型化语言中都可以实现的解决方案是使每个事件都成为发射器并依赖于组合。

    这基本上归结为someObject.onSomeEvent.listen(handler) 而不是someObject.listenTo('someEvent', handler)。

    这就是他们在refactoring the DOM Events API 时在 Google Dart 中使用的方法。由于事件现在是类成员,它们很容易成为代码契约的一部分。

    显然还有其他方法,例如为每个事件创建一个具体的事件类而不是使用字符串。此解决方案的优势在于,当添加新事件时,合约不必更改。

    【讨论】:

    • 谢谢@plalx 我很喜欢你的回答,但我不知道 Dart 中的事件。我希望有人可以在对话中添加更多内容,但由于没有发生,我选择这个作为答案
    猜你喜欢
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2011-09-29
    • 2022-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多