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。它们都触发相同的事件标记(如上面的代码所示)。
为每个异步方法提供事件是否有意义?或者只为所有异步方法提供一般化事件?是否存在太多事件?
答案 0 :(得分:6)
两者都有效。这实际上取决于你的意图。
您是否希望听众想要听取所有事件并以类似的方式回复?去看广义事件。
如果你期望每一个对不同方面感兴趣的不同听众,在这些事件上执行截然不同的任务,那就去做第二个。
api设计背后的想法不是在客户端强加某种使用方式(Rails用户可能不同意),但你会在设计方式上给出强有力的提示..
答案 1 :(得分:3)
所有事件都具有相同的EventArgs这一事实表明您可以将这些事件替换为单个事件,并将该活动作为HumanActivityProgressChanged和HumanActivityCompleted类型的属性传递。
没有法律告诉你这样做。这一切都取决于您希望揭示的内容以及客户期望/需要的内容。
答案 2 :(得分:0)
这是一个品味问题,但我个人更喜欢第一种方法。 首先,维护将变得更加容易。 以这种方式编码效率更高。