我应该使用多个事件还是更详细的事件参数类

本文关键字:事件 参数 我应该 | 更新日期: 2023-09-27 18:34:25

我的程序正在串行端口上接收数据,接收到数据后,可以用八种不同方式之一进行解释。

如果我想在收到数据后触发事件,我应该使用一个事件并在自定义事件 arg 类中使用类似枚举的东西,还是应该创建 8 个单独的事件?基本上我想知道创建事件的约定是什么。

我的假设是,当它与当前事件区分开来时,应该创建一个新事件,但我不确定我的示例该走哪条路。

编辑:为了澄清情况,程序主要将通过串行端口与设备通信,接收输入的方法如下:

我应该这样做吗?

void receive(byte[] somebytes)
{
    // After checking to make sure all bytes expected are received
    switch(somecase)
    {
        case 0: TriggerEvent(SomeEventArgs);break;
        case 1: TriggerEvent(SomeEventArgs);break;
        case 2: TriggerEvent(SomeEventArgs);break;
        case 3: TriggerEvent(SomeEventArgs);break;
        case 4: TriggerEvent(SomeEventArgs);break;
        case 5: TriggerEvent(SomeEventArgs);break;
        case 6: TriggerEvent(SomeEventArgs);break;
        case 7: TriggerEvent(SomeEventArgs);break;
        case 8: TriggerEvent(SomeEventArgs);break;
    }
}

或者这个:

void receive(byte[] somebytes)
{
    // After checking to make sure all bytes expected are received
    switch(somecase)
    {
        case 0: Event0(LessEventArgs);break;
        case 1: Event1(LessEventArgs);break;
        case 2: Event2(LessEventArgs);break;
        case 3: Event3(LessEventArgs);break;
        case 4: Event4(LessEventArgs);break;
        case 5: Event5(LessEventArgs);break;
        case 6: Event6(LessEventArgs);break;
        case 7: Event7(LessEventArgs);break;
        case 8: Event8(LessEventArgs);break;
    }
}

我应该使用多个事件还是更详细的事件参数类

这两种解决方案都有效,但我认为进行签名事件要容易得多。

如果只有一个事件,则只需定义一个唯一EventArgs<T>即可在类中发布单个事件,并处理单个事件。

决定做什么的所有逻辑都在事件"客户端类"中。这使得测试和调试变得更加容易。

因此,您需要:

  • 发布单个事件的类
  • 处理该事件并将执行调度到正确方法的方法,具体取决于事件参数
  • 处理 8 种情况的方法。
如果这样做,则很容易创建一个单元测试来测试

调度程序方法,并创建一个不同的单元测试来测试这 8 个方法中的每一种方法。

依赖于外部资源的"服务器类"很简单。这很重要,因为很难调试在八个事件之间进行选择的调度程序的测试。

想想另一个实现,使用 8 个事件:你会得到一个更混乱、更难测试和调试的代码。

作为旁注,我鼓励您阅读这篇关于"C# 事件实现基础知识、最佳实践和约定"的详尽文章

这实际上取决于您正在做什么以及程序的更大上下文。 这可能在某种程度上是一个风格问题,但可以这样想:如果你处理的是常规变量而不是事件,是将它们分成八个不同的类更好,还是让它们都使用相同的类但有八个不同的值会更好?

我个人的偏好是"少即是多"的方法,我会创建一个事件,如您所描述的那样通过事件参数传递枚举。

我会将其与用于桌面开发的 .NET 库中的KeyPressDown进行比较。没有AKeyPressedBKeyPressedEnterKeyPressed - 它被封装在一种方法中,以实现整洁直观的实现。

不知道你的程序到底是什么样子的,有点难以判断。但我建议您创建 8 个单独的事件以保持概述并防止通过事件处理程序方法创建一个事件。