但是我不知道我是否应该去静态方法,只是标题,班级或其他东西?

最好的做法是什么?但是,我不想有一个公用事业类的实例。

我想添加以下功能:

Uint32 MapRGB (int r, int g, int b);
const char* CopyString(const char* char);
// etc. You know: utility methods...
有帮助吗?

解决方案

不要把它们放在课堂上;只需在命名空间范围内使其成为非会员功能。

没有规则说每个功能都必须是某些类的成员功能。

其他提示

一个因素是甚至将它们放在课堂上,还是将它们作为名称空间中的名义列为(在Java中,您必须使用类,但是C ++提供名称空间)。

如果您确实使其成为集体成员,那么您必须对每个功能做出的最重要决定是需要或应影响未接收或通过其参数传递的任何状态和返回值。如果没有,应该做 static, ,因为您不会使用“此”隐藏参数。

使用类代替命名空间的一个参数是,如果您的实用程序类可能需要调用其实现的其他方法(例如,在递归,复杂计算等情况下)。然后可以做你的方法 static public, ,以及它实施的一切 static private. 。自从我使用C ++以来已经有很多年了,但是我认为您不能在名称空间中“隐藏”非会员功能(如果我错了,有人纠正我)。

在设计函数接口方面,请考虑参数数量。如果传入的参数太多(尤其是如果它们具有相似类型并且有些相关),则可能需要考虑使用其他类型而不是传递多个ARG。例如,而不是 calculateVolume(int x, int y, int z), ,您可能想做类似的事情 calculateVolume(Point3D). 。同样,在您的情况下,使用RGB类。这似乎很愚蠢,但是它可以节省一些烦人的错误(例如,如果您具有ints和rgb的功能)和时间(如果您必须将值传递给其他函数)。您可以创建静态出厂方法,以使这些类型在传递参数时更容易创建。例如: doSomethingWithColor(RGB.create(20,30,40))

如果这些功能在逻辑上不属于类,则可能没有理由让这些功能包装。在这种情况下,您可以让它们成为免费功能。将它们包含在命名空间中可能是合适的,以避免名称碰撞。

如果您想提供课程的弦逻辑分组,那么让它们成为班级的静态成员函数没有真正的伤害 - 但是我没有理由如何拥有这样的功能 MapRGB()CopyString() 需要成为同一班的成员。

如果您只想将功能分组在一起,但不创建组的实例,那么您可能应该考虑将它们放入名称空间而不是类。

不过,我会尝试使用有意义的名称空间 - 将mapRGB和copysstring放在一起几乎没有意义。如果您真的需要两者,并且真的没有 任何 其他处理字符串或RGB映射的功能,将它们放入“ Utillity”名称空间可能是有道理的,但是如果您使用这些名称空间,似乎您有更多的字符串“东西”和一些“颜色”的东西,并且可能会从每个名称空间中受益。

我通常有一个名为“ util”的.a(.lib)(.lib)被链接到中。但是,通常“ util”类是坏消息,它引入了打破标准面向对象的设计的依赖性。现在,如果您试图在另一个项目中拔出课程以重复使用,则您对UTIL库有成千上万的隐藏依赖关系。基本上,这很有用,但是尽力避免将东西放在那里。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top