我正在将文本文件从一组定义转换到另一组定义,我通过编写一个小型解析器解决了这个问题。一旦我识别了一个符号,我就会在case语句中结束,该语句根据用户选择的输入选项(这些代码在不同的机器上表示不同的东西)来决定调用哪个转换例程。
我本质上是将多个输入格式转换成一种输出格式,大约400个独特的符号。
问题是,随着这个项目从几个简单的翻译(每个翻译都在自己的头文件中)成长为十几个甚至更多的输入格式,它的维护变得越来越麻烦。这些头文件中的每一个都包含一个生成相关输出的monster switch语句。这一切都很好用,但看起来真的很笨拙。
我是否可以通过为每个输入机器创建映射表(即包含输入和输出符号的二维数组)并使用一个将表作为输入的通用转换例程来解决可维护性问题?有没有我应该考虑的更好的设计?
发布于 2011-08-24 00:14:46
哈希表类型的结构肯定更容易维护,但至少有一个权衡,即您的巨型switch语句几乎肯定会更快,因为任何像样的编译器都会将其优化为跳转表。但它(取决于实现)不应该那么明显地慢,除非你正在做500亿次查找或其他事情。也就是说,哈希表可以优化为与switch语句一样快。
底线:如果你不需要确保你能获得每一盎司的速度,那么我会选择哈希表。如果这很重要,那就写个人资料。
您可能想看看gperf,它可以生成编译时完美的哈希表。
发布于 2011-08-24 00:23:05
您可以使用宏来减少代码重复。例如
#define ENTRY(ID, OUT) case ID: write_to_output(out); break;
switch (id) {
ENTRY(ID1, "ID1");
ENTRY(ID2, "ID3");
ENTRY(ID2, "ID3");
default:
....
}
https://stackoverflow.com/questions/7164110
复制相似问题