发布
社区首页 >问答首页 >就可维护性而言,映射表是比大型switch语句更好的设计吗?

就可维护性而言,映射表是比大型switch语句更好的设计吗?
EN

Stack Overflow用户
提问于 2011-08-24 00:09:40
回答 2查看 117关注 0票数 4

我正在将文本文件从一组定义转换到另一组定义,我通过编写一个小型解析器解决了这个问题。一旦我识别了一个符号,我就会在case语句中结束,该语句根据用户选择的输入选项(这些代码在不同的机器上表示不同的东西)来决定调用哪个转换例程。

我本质上是将多个输入格式转换成一种输出格式,大约400个独特的符号。

问题是,随着这个项目从几个简单的翻译(每个翻译都在自己的头文件中)成长为十几个甚至更多的输入格式,它的维护变得越来越麻烦。这些头文件中的每一个都包含一个生成相关输出的monster switch语句。这一切都很好用,但看起来真的很笨拙。

我是否可以通过为每个输入机器创建映射表(即包含输入和输出符号的二维数组)并使用一个将表作为输入的通用转换例程来解决可维护性问题?有没有我应该考虑的更好的设计?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-24 00:14:46

哈希表类型的结构肯定更容易维护,但至少有一个权衡,即您的巨型switch语句几乎肯定会更快,因为任何像样的编译器都会将其优化为跳转表。但它(取决于实现)不应该那么明显地慢,除非你正在做500亿次查找或其他事情。也就是说,哈希表可以优化为与switch语句一样快。

底线:如果你不需要确保你能获得每一盎司的速度,那么我会选择哈希表。如果这很重要,那就写个人资料。

您可能想看看gperf,它可以生成编译时完美的哈希表。

票数 5
EN

Stack Overflow用户

发布于 2011-08-24 00:23:05

您可以使用宏来减少代码重复。例如

代码语言:javascript
代码运行次数:0
复制
#define ENTRY(ID, OUT) case ID: write_to_output(out); break;

switch (id) {
   ENTRY(ID1, "ID1");
   ENTRY(ID2, "ID3");
   ENTRY(ID2, "ID3");

   default:
     ....
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7164110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档