假设我有一个Image类,我想在图像上提供一些操作,比如缩放,旋转等。 我想为每个操作提供两种类型的函数。一个修改对象而另一个修改不对象。 在Ruby中,有些函数以!并指出这一个将修改参数。
由于C ++ / Java中不允许这样做,因此最佳命名约定是什么。 对于例如你如何命名img.scale()的Mutating和non-mutating版本?
由于
答案 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;