一流的设计建议 - C++

一流的设计建议 - C++

问题描述:

背景一流的设计建议 - C++

我的工作,其将英语文本equivalant地方语言文本的语音转换程序。区域语言将具有比英文字母更多的字符,区域语言字体几乎使用字体中的所有位置(1-255)。

我的程序支持不同的字体,并且我创建了一个字体类,这个字体类将有方法提供对字符的访问。这个类将有255个方法,每个方法代表每个字符。所有这些都被标记为虚拟,以便新字体可以覆盖必要的字符方法。

该字体类中的方法很简单。所有的方法都是单行的。例子是

string StandardFont::consonant1(){ 
    return "a"; 
} 

string StandardFont::consonant2(){ 
    return "b"; 
} 

.. 

问题

  1. 威尔255个虚拟函数在一个类中做任何性能问题?我知道vtable的东西,但我不确定它在这种情况下会产生多大的影响。
  2. 任何人都可以提出这个班的替代设计?主要设计目标是允许派生类覆盖必要的方法。我曾考虑将字符添加到容器中,如地图矢量并提供获取角色的方法。但是因为我会有255个物品,而且这个类经常使用,所以我认为每次我必须循环容器才能获得角色,这又是一个问题。

有什么想法?

+0

你可以充实一下描述吗?这255种方法实际上将做什么?什么代码会打电话给他们? – Charlie 2009-01-28 02:24:15

+0

查理,已完成 – 2009-01-28 02:36:47

我建议你使用非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; 
} 
+0

谢谢克里斯。我也有unicode。但是这个库预计可以使用ASCII字体。 – 2009-01-28 02:37:29

+0

看起来很有希望。我会试一试。非常感谢 – 2009-01-28 03:18:51

+0

顺便说一句,你认为我可以在这里使用静态多态(使用模板)吗? – 2009-01-28 03:19:35

255虚拟功能将通常不会导致性能问题(除非您的类的每个实例都有一个很大的VTable,这会影响缓存)。

但是,255个虚拟功能通常会导致维护噩梦。

如果我正确理解你的描述,那么你需要的是:

1)方法返回任何你需要的图像或创建表示在区域语言字符的类,大概。

2)Create是表示字符集的类的层次结构。

3)一个字符集的每个实例将保持从位置映射到字符类的实例。

4)有一个获取索引并返回对象的函数。这种设计的

一个好处是,你可以使用一些相同的标志符号(例如,用于数字)有多个字符集。

就这么说,你为什么不使用Unicode和16位字符呢?

我认为使用单一方法访问字符而不是255个方法会更清晰。想到索引/下标。

您能否澄清一下这些类将如何使用?由于语言和字母不同,因此我觉得你会以同样的方式引用多个字母。从任何角度来看,信件都是任意的。他们在不同的语言中会有所不同并且不相关。

Unicode的目标是为您的问题提供解决方案。你有没有考虑过使用它?

解决你的速度的问题,有255种虚拟方法应该不会引起任何特定的性能损失,但通常建议适用:如果你不知道怎么回事执行,只有这样,才能找出将是以此为基准。

话虽这么说,它很可能有一个更好的办法来解决这个问题。如果你提供关于这个字体类应该做什么的更多细节,这将有所帮助。

为什么不只是有一个255个字符的矢量?

每个“字体”只是在数组中安装不同的字符?甚至是一个Character类?

,或者您可以使用地图,还是其他什么东西

255的方法绝对不是要走的路。