考虑我正在与将以某种格式发送消息(数据库表,消息队列,Web服务)的外部系统连接.在"消息头"中有"MessageType",它是1到20之间的数字.MessageType定义了如何处理消息的其余部分.有新的,修改的,删除的,取消的......
我的第一个倾向是设置枚举并定义所有类型.然后将数字解析为枚举类型.将它作为枚举,我将设置典型的开关案例系统,并为每种消息类型调用特定方法.
一个大问题是维护.
开关/箱体系统笨重而且很笨重,但它非常简单.
各种各样的表/配置系统可能很难让其他人知道并添加新消息或调整现有消息.
对于大约12个MessageTypes,交换机/案例系统似乎非常合理.切换到表驱动系统的合理截止点是什么?
哪种系统最适合处理这些类型的问题?
我在这里为C#和Java设置了一个标签,因为它绝对是一个常见的问题.还有许多其他语言具有相同的问题.
在Java中,你可以使它成为枚举并为不同的值赋予行为(尽管有100个值,我希望每种类型的行为都是短暂的,调用"正确的"类).
在C#中,您可以拥有从值到某个适当委托类型的映射 - 然后在静态构造映射时,您可以根据需要使用lambda表达式或方法组转换.
话虽如此,设置地图将像switch语句一样丑陋.如果每个switch语句只是一个方法调用,您可能想尝试这种格式:
switch (messageType) { case 0: HandleLogin(message); break; case 50: SaveCurrentDocument(message); break; case 100: HandleLogout(message); break; }
(等等).我知道这违反了正常惯例,但对于像这样的奇怪异常情况它可能非常简洁.如果你只需要一个地方的数字,那么引入常量几乎没有意义 - 基本上包含有效数字的行是常量定义!