Agregar funcionalidad a una clase se puede hacer agregando un método o definiendo una función que toma un objeto como su primer parámetro. La mayoría de los programadores que conozco elegirían para la solución de agregar un método de instancia.¿Elegir entre métodos de instancia y funciones gratuitas?
Sin embargo, a veces prefiero crear una función separada. Por ejemplo, en el código de ejemplo siguiente Area
y Diagonal
se definen como funciones gratuitas en lugar de métodos. Lo encuentro mejor de esta manera porque creo que estas funciones proporcionan mejoras en lugar de la funcionalidad central.
¿Esto se considera una buena/mala práctica? Si la respuesta es "depende", ¿cuáles son las reglas para decidir entre agregar un método o definir una función separada?
class Rect
{
public:
Rect(int x, int y, int w, int h) :
mX(x), mY(y), mWidth(w), mHeight(h)
{
}
int x() const { return mX; }
int y() const { return mY; }
int width() const { return mWidth; }
int height() const { return mHeight; }
private:
int mX, mY, mWidth, mHeight;
};
int Area(const Rect & inRect)
{
return inRect.width() * inRect.height();
}
float Diagonal(const Rect & inRect)
{
return std::sqrt(std::pow(static_cast<float>(inRect.width()), 2) + std::pow(static_cast<float>(inRect.height()), 2));
}
Una nota al margen, el uso de pow con una potencia constante de dos es extremadamente ineficiente en comparación con solo deletrear x * x + y * y + z * z usted mismo. –
@Mark B: Gracias, no sabía eso. – StackedCrooked
Vea el clásico _ [Cómo las funciones no miembro mejoran la encapsulación] (http://drdobbs.com/cpp/184401197) _. ("Cuando piense en la encapsulación, debería pensar en las funciones que no son miembro"). También vea http://stackoverflow.com/q/1692084/140719. – sbi