C ++:为成员函数的变异和非变异版本建议名称

时间:2010-09-02 22:47:58

标签: c++

假设我有一个Image类,我想在图像上提供一些操作,比如缩放,旋转等。 我想为每个操作提供两种类型的函数。一个修改对象而另一个修改不对象。 在Ruby中,有些函数以!并指出这一个将修改参数。

由于C ++ / Java中不允许这样做,因此最佳命名约定是什么。 对于例如你如何命名img.scale()的Mutating和non-mutating版本?

由于

8 个答案:

答案 0 :(得分:10)

一个选项是将Scale用于变异版本,将ScaleCopy用于非变异版本,因为它会返回原始文件的副本并执行操作在副本上。

另一种选择是使非变异版本成为非成员函数。例如,

Image Scale(Image im, double scale_factor) {
    im.Scale(scale_factor);
    return im;
}

我倾向于非成员方法,因为它减少了类中成员函数的数量。引用Herb Sutter的Monoliths Unstrung,“在可能的情况下,更喜欢将函数写成非成员非朋友。”

答案 1 :(得分:3)

我可能会做

img.scale()

VS

img.scaledCopy()

答案 2 :(得分:3)

对于简单的动词,我认为我的选择对于mutator来说是“Verb”,对于非mutator来说是“asVerbed”。对于更改的属性,我将使用“setProperty”作为mutator,使用“withProperty”作为非mutator。

在缩放的情况下,我会使用“Scale”作为mutator,并使用“asScaled”作为非mutator。

答案 3 :(得分:2)

  

你能说出img.scale()的非变异版本吗?

可能是getScaled()createScaled()

答案 4 :(得分:1)

您确定需要变异变体吗?

如果你想改变对象,你总是可以像这样使用非变异对象:

x = x.Scale();

由于C ++编译器积极的内联,我怀疑它甚至会同样有效。

如果你想同时实现这两个,你可以将它们命名为Scale(非变异)和ScaleThis(变异)。

答案 5 :(得分:0)

我的建议是将Scale包裹在自己的小班中,并命名为“getter”operator int(或operator double,或者你正在使用它的任何东西)和“setter”operator=

答案 6 :(得分:0)

python惯例如何:

Image Image::scaled(double) const;

或者:

Image im(other, scale);
Image im = Image(other).scale(1);  // should be okay I think

答案 7 :(得分:0)

如何使用复制构造函数返回基于现有Image对象但具有新比例的Image对象:

Image(const Image& src, double scale);

如果要缩放和变异同一图像,则可以声明非const方法:

void setScale(double scale);

如果您想以非变异的方式获得比例:

double getScale() const;