効果的な C++は、「メンバー関数よりも非メンバー非フレンド関数を優先する」(項目 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 は非メンバー非フレンド関数 (メソッドではない) である必要があるようです。たとえば、Rectangle の面積は、幅と高さのメソッドから次のように計算できます。
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);
}
ここで何か不足していますか?それとも、これは実際には悪いアドバイスですか??