Si consideri il seguente classe:Utilizzo dell'overloader value e dell'overloading() per semplificare il design getter/setter: una pratica pericolosa?
class MyClass1
{
public:
double x() const {return _x;} // getter
double y() const {return _y;} // getter
double z() const {return _x*_y;} // getter
void x(const double var) {_x = var;} // setter
void y(const double var) {_y = var;} // setter
void z(const double var) {_x = var; _y = 1;} // setter
protected:
double _x;
double _y;
};
Come il contenuto effettivo di MyClass1
è un dettaglio di implementazione, i getter e setter forniscono un modo unificato per ottenere e impostare il contenuto di classe, anche se sono interdipendenti (qui _z
non esiste internamente ma per l'utente, z
è una variabile come x
e).
Ora per evitare di dover scrivere getter/setter per x
e y
, si può usare un wrapper come questo:
template <typename Type>
class Wrapper
{
public:
constexpr Wrapper(const Type& value) {_value = value;}
constexpr Type& operator()() {return _value;}
constexpr const Type& operator()() const {return _value;}
constexpr void operator()(const Type& value) {_value = value;}
protected:
_value;
};
E ora la classe originale diventa:
class MyClass2
{
public:
Wrapper<double> x;
Wrapper<double> y;
double z() const {return x*y;} // getter
void z(const double var) {x = var; y = 1;} // setter
};
E ' una pratica pericolosa o una buona soluzione per evitare di dover scrivere getter/setter?
Nota: qui MyClass1
e MyClass2
sono solo esempi. La mia domanda è molto "generale": è pericoloso sostituire getter/setter di classi con il Wrapper
proposto quando il getter/setter restituisce/imposta un valore interno.
Suppongo che avresti bisogno di implementare un qualche tipo di modello di comportamento per fare effettivamente qualcosa (convalidare, notificare, ecc.) sugli accessors. In ogni caso, avrebbero sconfitto lo scopo di averli. Non pensi? imho – imreal
perché la tua classe ha bisogno dell'interfaccia get/set? se queste funzioni non devono mantenere invariante una classe, non ha molto senso inglobarle. – TemplateRex