一流的设计建议 - C++
我的工作,其将英语文本equivalant地方语言文本的语音转换程序。区域语言将具有比英文字母更多的字符,区域语言字体几乎使用字体中的所有位置(1-255)。
我的程序支持不同的字体,并且我创建了一个字体类,这个字体类将有方法提供对字符的访问。这个类将有255个方法,每个方法代表每个字符。所有这些都被标记为虚拟,以便新字体可以覆盖必要的字符方法。
该字体类中的方法很简单。所有的方法都是单行的。例子是
string StandardFont::consonant1(){
return "a";
}
string StandardFont::consonant2(){
return "b";
}
..
问题
- 威尔255个虚拟函数在一个类中做任何性能问题?我知道vtable的东西,但我不确定它在这种情况下会产生多大的影响。
- 任何人都可以提出这个班的替代设计?主要设计目标是允许派生类覆盖必要的方法。我曾考虑将字符添加到容器中,如地图或矢量并提供获取角色的方法。但是因为我会有255个物品,而且这个类经常使用,所以我认为每次我必须循环容器才能获得角色,这又是一个问题。
有什么想法?
我建议你使用非ASCII(区域)字符的标准编码。
的标准编码被称为“统一”,例如http://www.joelonsoftware.com/articles/Unicode.html
总之:在一个类为您解答......
威尔255个虚拟功能使任何性能问题?
总之:不,它不会。
但是因为我将有255个项目,并且这个类被频繁使用,我认为每次我必须循环容器来获取角色,这又是一个问题。
与载体或一个固定长度的数组,其长度为256个,则就不需要循环...代替你可以直接索引,例如:
const char* translations[256] = {
"a",
"bee",
"c!",
...etc...
};
const char* translate(char c)
{
//use the character as an index into the array
int index = c;
//use the translation array (using indexing, not looping)
const char* result = translations[index];
return result;
}
谢谢克里斯。我也有unicode。但是这个库预计可以使用ASCII字体。 – 2009-01-28 02:37:29
看起来很有希望。我会试一试。非常感谢 – 2009-01-28 03:18:51
顺便说一句,你认为我可以在这里使用静态多态(使用模板)吗? – 2009-01-28 03:19:35
255虚拟功能将通常不会导致性能问题(除非您的类的每个实例都有一个很大的VTable,这会影响缓存)。
但是,255个虚拟功能通常会导致维护噩梦。
如果我正确理解你的描述,那么你需要的是:
1)方法返回任何你需要的图像或创建表示在区域语言字符的类,大概。
2)Create是表示字符集的类的层次结构。
3)一个字符集的每个实例将保持从位置映射到字符类的实例。
4)有一个获取索引并返回对象的函数。这种设计的
一个好处是,你可以使用一些相同的标志符号(例如,用于数字)有多个字符集。
就这么说,你为什么不使用Unicode和16位字符呢?
我认为使用单一方法访问字符而不是255个方法会更清晰。想到索引/下标。
您能否澄清一下这些类将如何使用?由于语言和字母不同,因此我觉得你会以同样的方式引用多个字母。从任何角度来看,信件都是任意的。他们在不同的语言中会有所不同并且不相关。
Unicode的目标是为您的问题提供解决方案。你有没有考虑过使用它?
解决你的速度的问题,有255种虚拟方法应该不会引起任何特定的性能损失,但通常建议适用:如果你不知道怎么回事执行,只有这样,才能找出将是以此为基准。
话虽这么说,它很可能有一个更好的办法来解决这个问题。如果你提供关于这个字体类应该做什么的更多细节,这将有所帮助。
为什么不只是有一个255个字符的矢量?
每个“字体”只是在数组中安装不同的字符?甚至是一个Character类?
,或者您可以使用地图,还是其他什么东西
255的方法绝对不是要走的路。
你可以充实一下描述吗?这255种方法实际上将做什么?什么代码会打电话给他们? – Charlie 2009-01-28 02:24:15
查理,已完成 – 2009-01-28 02:36:47