0

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

如果我想在收到数据后触发一个事件,我应该使用一个事件并在我的自定义事件 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;
    }
}
4

4 回答 4

1

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

于 2012-05-16T14:50:34.787 回答
1

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

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

于 2012-05-16T15:26:58.517 回答
1

两种解决方案都可以,但我认为举办一个活动要容易得多。

如果你有一个事件,你只需要EventArgs<T>在你的类中定义一个唯一的发布一个事件,并处理一个事件。

决定要做什么的所有逻辑都在订阅事件的“客户端类”中。这使得测试和调试更容易。

所以你需要:

  • 发布单个事件的类
  • 处理该事件并将执行分派到正确方法的方法,具体取决于事件 arg
  • 处理这8个案例中的每一个的方法。

如果你这样做,很容易创建一个单元测试来测试调度程序方法,并创建不同的单元测试来测试 8 个方法中的每一个。

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

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

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

于 2012-05-16T15:01:43.760 回答
0

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

于 2012-05-16T14:49:04.843 回答