Designfrage: Datenvalidierung,setter und andere Möglichkeiten
-
Hallo,
in einem aktuellen projekt verwalten mehrere managerklassen ihre daten.
Die daten sind in form einer einfachen struktur gegeben. Die struktur wurde deshalb gegeben weil der austaush zwischen logik und ansicht in packeten erfolgt.Da die daten die per packet aus der ansicht kommen meist benutzereingaben sind, möchte ich die natürlich nicht ungeprüft übernehmen und damit arbeiten.
Ich habe mir 3 möglichkeiten überlegt dass relativ komfortabel erledigen zu können, bin mir aber nicht sicher welche nun gut ist oder ob es vll an bestimmten stellen einfach nur overhead ist. Das ganze soll schon in der template-basisklasse der manager vorgesehen werden.-
einen setter der die daten erst prüft und dann zuweisst
-
Ich leite alle datenpackete zusätzlich von einer struct validated_struct ab, die die reinvirtuelle methode validate enthält. Die müsste dann immer von den managern aufgerufen werden bevor ein datanpacket angenommen wird.
-
Eine lösung die ich dataport nenne. Dabei werden die manager zusätzlich von einer struktur abgeleitet die nur für die validierung der daten zuständig ist und auch den setter bereit stellt
template<typename T_,typename Validationpred_> class data_port{ protected: data_port(T_ &ref):data_ref_(ref){} const bool check_in(const T_ &data); const T &check_out() const {return data_ref_;} private: T_ &data_ref_; }; template<typename T_,typename Validationpred_> const bool data_port<T_,Validationpred_>::check_in(const T_ &data){ Validationpred_ inst; if(!inst(data)) return false; data_ref_=data; return true; } //benutzung in abgeleiteter klasse struct greater_zero{ const bool operator()(const int &data){ return data > 0; } }; class some_manager : public data_port<int,greater_zero>{ public: some_manager():data_port(mydata_){} private: int mydata_; }; some_manager manager; int val=-1; manager.check_in(val); //würde false zurück geben und die daten nicht zuweisen val=2; manager.check_in(val); //würde tun was man verlangt
Ich preferiere die dritte methode, weil ich so beides habe, setter und validierung.
Aber wie es immer so ist, kann es sein dass ich was wesentliches übersehe.
Welche methode haltet ihr für die beste ? Oder sollte man sowas vielleicht sogar ganz anders machen ?
-