代码之家  ›  专栏  ›  技术社区  ›  Lukas Å alkauskas

最佳实践:事件的操作枚举用法

  •  2
  • Lukas Å alkauskas  · 技术社区  · 17 年前

    我发现自己很难为事件设计动作枚举。

    f.ex制作计算处理器。

    所以我应该有这样的枚举?:

    public enum CalculatorCoreActions
    {
        ProcessStarted,
        ProcessFinished,
        ProcessFailure,
        ProcessFailed,
        SubstractionStarded,
        SubstractionFinished,
        SubstractionFailure,
        SubstractionFailed,
        <etc.>...
    }
    

    或者我应该做两个枚举?F.EX:

    public enum CalculatorAction
    {
        Process,
        Substraction,
        Division
    }
    
    public enum CalculationActionResult
    {
       Started,
       Finished,
       Failure,
       Failed
    }
    

    或者甚至我应该创建一个新的类?:

    public class CalculatorActionEventArgs : EventArgs {<...>}
    public class CalculatorActionFailedEventArgs : EventArgs {<...>}
    public class etc... : EventArgs {<...>}
    

    你认为哪种方法最好?

    3 回复  |  直到 17 年前
        1
  •  2
  •   Pontus Gagge    17 年前

    你想做什么?你打算用这些枚举做什么?您的第一个示例对于很少的组合可能是可以的,而第二个示例将更复杂,但更干净,更容易扩展。

    我的猜测是,您希望能够显示计算状态,并可能在错误处理中对该状态进行操作。你可以考虑 State State Machine 模式而不是枚举,以避免枚举上出现巨大的switch语句。

        2
  •  2
  •   Dan Blair    17 年前

    在您提供的两个枚举选项中,我将使用第二组枚举。

    为什么,当你把状态和行为交叉(字面相乘)时,你会发现一个大的增长模式。当您希望在将来添加状态或功能时,不再添加一个项目,而是添加1XX或NX1项目。有关此类型问题的其他参考,请参见 Martin Fowler 重构 以及物体的层次纠缠。

    现在,对于事件参数,使用通用的事件参数,并在对象中为其提供操作和状态。不要创造比你必须创造的更多的东西,它将最小化你创造的头痛的数量。

        3
  •  0
  •   Usman Masood    17 年前

    这取决于你如何设计你的结构…对我来说,事件应该是不同的,但是一个事件应该尽量不要使用更多的事件参数,例如,你正在使用一个用于失败的一个用于操作等。 相反,尝试使用最少数量的事件参数作为它唯一的数据传递机制…

    现在关于枚举部分,我不完全能够理解您的场景……为什么你想要这么多不同的枚举?

    如果你打算用它来替代多个事件,那么…如果我是你,我会去参加活动…但是,如果您的结构需要大量的事件,比如说10个或更多的事件,那么可以将事件与枚举混合作为最小事件参数…假设10个事件,用4或5个枚举将事件减少到3个。