Effective C++说“Prefer non-member non-frend functions to member functions”(第 23 条)。理由对我来说很有意义:它最小化了 API“表面积”。但在实践中,我经常发现很难说服人们(包括我自己)效仿。例如,假设我有一些形状类,它们应该支持周长和面积计算:
// @interface
class Shape {
public:
virtual double Area() = 0;
virtual double Perimeter() = 0;
}
class Rectangle : public Shape {
public:
Rectangle(double width, double height);
double width();
double height();
...
};
class Circle : public Shape {
public:
Circle(double radius);
double radius();
...
};
根据这个建议,似乎 Area 和 Perimeter 应该是非成员非朋友函数(而不是方法),因为它们可以。例如,可以通过 width 和 height 方法计算矩形的面积,如下所示:
double Area(const Rectangle& rectangle) {
return rectangle.width() * rectangle.height();
}
事实上,Rectangle 和 Circle 都没有任何内部状态不会被它们的 getter 暴露出来,很难想象会是怎样的情况。因此,对这些进行操作的任何函数都不应该是方法。另一个例子:
// The diameter of a shape is the (circle) diameter of the smallest circle
// that contains a shape.
double Diameter(const Rectangle& rectangle) {
double w = rectangle.width();
double h = rectangle.height();
return sqrt(w * w + h * h);
}
我在这里错过了什么吗?或者这实际上是个坏建议?