L'aggiunta di funzionalità a una classe può essere eseguita aggiungendo un metodo o definendo una funzione che accetta un oggetto come primo parametro. La maggior parte dei programmatori che conosco sceglierebbero per la soluzione di aggiungere un metodo di istanza.Scelta tra metodi di istanza e funzioni libere?
Tuttavia, a volte preferisco creare una funzione separata. Ad esempio, nel codice di esempio riportato sotto Area
e Diagonal
vengono definite come funzioni gratuite anziché metodi. Lo trovo migliore in questo modo perché penso che queste funzioni forniscano miglioramenti piuttosto che funzionalità di base.
Questa è considerata una buona/cattiva pratica? Se la risposta è "dipende", quali sono le regole per decidere tra aggiungere un metodo o definire una funzione separata?
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 a margine, l'uso di Pow con una potenza costante di due è estremamente inefficiente rispetto alla semplice ortografia di x * x + y * y + z * z. –
@ Mark B: Grazie, non lo sapevo. – StackedCrooked
Vedere il classico _ [Come le funzioni non membro migliorano l'incapsulamento] (http://drdobbs.com/cpp/184401197) _. ("Quando si pensa all'incapsulamento, è necessario pensare a funzioni non membro"). Vedere anche http://stackoverflow.com/q/1692084/140719. – sbi