事件是OO等同于GOTO吗?

时间:2010-02-18 16:44:46

标签: c# .net events goto

在试图找出我们之前开发人员编写的一些代码时,只是在考虑这个问题。试图找出控制程序是如何发生的,这让我想起了BASIC过去的糟糕时期,那里几乎没有明显的程序执行路径。这更像是滥用事件的症状,还是观察者模式存在结构性问题?

5 个答案:

答案 0 :(得分:11)

与任何技术一样,事件可能被错误地使用和滥用。但是,既然你没有提供任何问题的例子,我们几乎不可能说出你在说什么。

一般来说,没有。事件不是OO等价于GOTO,也不是典型的问题。我所知道的观察者模式也没有任何结构性问题。但滥用可能发生在任何事情上。

GOTO的原因有很多,但其中一个最大的原因是它是程序流的转移,而不仅仅是子程序的执行。当你使用goto时,程序执行不会返回到你的goto调用完成之后(或者在异步事件的情况下启动之后)。程序流程永久地转移到新的执行点。更糟糕的是,它可以将执行转移到任何地方,包括其他控制结构或其他功能。

事件根本没有这些特性,只不过是具有对象感知和发布/订阅功能的函数指针。 (好吧,还有更多,但这是他们的基本用法)

答案 1 :(得分:3)

不,不是。 Goto是......啊......我害怕猛禽......

事件只不过是一个逐个调用的委托列表。 F.e:

-> Click Event gets called
    -> List of associated Event-Handlers
        -> Calls every Event-handler/Delegate in the List

答案 2 :(得分:0)

我在事件中看到的最糟糕的事情是在事件中调用多个其他事件。我与之合作的一位同事经常这样做。我认为这可能是一个难以遍历的情况,但它仍然比GOTO更具可读性。

答案 3 :(得分:0)

要回答你的问题,事件不是OO相当于GOTO,因为GOTO本身就是一个保留字。事件是不同的,事件跟随着火和忘记范式,其中GOTO在代码中被“解雇但是在程序上处理”。使用GOTO会导致滥用导致意大利面条代码。尽管如此,唯一可以使用GOTO的是在方法/或函数范围内的错误恢复情况。尽管许多接收器都可以使用事件,但GOTO仅由一个接收器使用。

使用诸如PostSharp之类的AOP框架可能是值得的,您可以在运行时将AOP注入到代码中,以便查看事件的流程和跟踪以帮助更好地理解代码。

希望这有帮助, 最好的祝福, 汤姆。

答案 4 :(得分:0)

事件不等同于GOTO。可能会更糟。程序员在必须在代码中编写GOTO时会感觉很糟糕。随着事件,它是不同的。当人们使用Event时,他们感觉完全,现代和冷静。 我最近花了一些时间试图了解一个包含大约100个类,400个事件和300个处理程序注册的系统。我明白你的痛苦。使用Event,连接看似独立的对象太容易了。事件可以通过或隐藏对象和引用的逻辑关系,使整个系统很难理解。