有太多事件吗?

时间:2011-05-26 08:43:23

标签: c# events

public class Human
{
    public void Run(){}
    public void Jump(){}
    public void Eat(){}

    //Generalized approach
    public EventHandler<HumanActivityProgressChanged> ActivityProgressChanged;
    public EventHandler<HumanActivityCompleted> ActivityCompleted;

    //Per-method approach
    public EventHandler<HumanActivityProgressChanged> Running;
    public EventHandler<HumanActivityCompleted> Ran;

    public EventHandler<HumanActivityProgressChanged> Jumping;
    public EventHandler<HumanActivityCompleted> Jumped;

    public EventHandler<HumanActivityProgressChanged> Eating;
    public EventHandler<HumanActivityCompleted> Ate;
}

我有不同的方法来实现基于事件的异步模式。这些方法会触发ProgressChanged eventargs和Completed eventargs。它们都触发相同的事件标记(如上面的代码所示)。

为每个异步方法提供事件是否有意义?或者只为所有异步方法提供一般化事件?是否存在太多事件?

3 个答案:

答案 0 :(得分:6)

两者都有效。这实际上取决于你的意图。

您是否希望听众想要听取所有事件并以类似的方式回复?去看广义事件。

如果你期望每一个对不同方面感兴趣的不同听众,在这些事件上执行截然不同的任务,那就去做第二个。

api设计背后的想法不是在客户端强加某种使用方式(Rails用户可能不同意),但你会在设计方式上给出强有力的提示..

答案 1 :(得分:3)

所有事件都具有相同的EventArgs这一事实表明您可以将这些事件替换为单个事件,并将该活动作为HumanActivityProgressChanged和HumanActivityCompleted类型的属性传递。

没有法律告诉你这样做。这一切都取决于您希望揭示的内容以及客户期望/需要的内容。

答案 2 :(得分:0)

这是一个品味问题,但我个人更喜欢第一种方法。 首先,维护将变得更加容易。 以这种方式编码效率更高。