Rozważmy następujące klasy:Użycie przeciążenia wartości i przeciążenia operatora() w celu uproszczenia procesu pobierania/ustawiania: niebezpieczna praktyka?
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;
};
Jak rzeczywistej zawartości MyClass1
jest szczegół realizacji, pobierające i ustawiające zapewnić jednolity sposób, aby pobrać i ustawić zawartość klasy, nawet jeśli są one interdependant (tutaj _z
nie istnieje wewnętrznie, ale dla użytkownika z
jest zmienną, taką jak x
i y
).
teraz, aby uniknąć musiał napisać getter/setter dla x
i y
można wykorzystywać owijkę tak:
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;
};
A teraz oryginalna klasa staje:
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
};
Czy go niebezpieczna praktyka lub dobre rozwiązanie, aby uniknąć pisania podpowiedzi/ustawiaczy? Uwaga: tutaj MyClass1
i MyClass2
są tylko przykładami. Moje pytanie jest bardzo "ogólne": jest to niebezpieczne, aby zastąpić pobierające/ustawiające klasy przez proponowaną Wrapper
, gdy getter/setter właśnie wróci/ustawi wewnętrzną wartość.
Przypuszczam, że musiałbyś zaimplementować jakiś wzór zachowania, aby faktycznie coś zrobić (sprawdzić, powiadomić, itp.) na akcesoriach. W przeciwnym razie mogliby pokonać cel ich posiadania. Nie sądzisz? imho – imreal
dlaczego twoja klasa potrzebuje uzyskać/ustawić interfejs? jeśli te funkcje nie muszą utrzymywać niezmienników klasy, nie ma sensu ich włączać. – TemplateRex