Nehmen wir an, ich habe ein Objekt Employee_Storage
, das ein Datenbankverbindungsdatenelement enthält. Soll dieses Datenelement als Zeiger oder als Referenz gespeichert werden?
Wenn ich es als Referenz speichern, I
muss nicht NULL
tun
Überprüfung. (Wie wichtig ist die NULL-Prüfung überhaupt?)
Wenn ich es als Zeiger speichere, ist es
einfacher einzurichten Employee_Storage
(oder MockEmployee_Storage
) für die
Testzwecke.
Im Allgemeinen habe ich meine Datenmitglieder immer als Referenzen gespeichert. Dies erschwert jedoch die Einrichtung meiner Mock-Objekte, da ich anstelle von NULL
s (vermutlich innerhalb eines Standardkonstruktors) True / Mock-Objekte übergeben muss.
Gibt es eine gute Faustregel, speziell im Hinblick auf die Testbarkeit?
Es ist nur vorzuziehen, Referenzen als Datenmitglieder zu speichern, wenn sie bei der Konstruktion zugewiesen werden, und es gibt wirklich keinen Grund, sie jemals zu ändern. Da Referenzen nicht neu zugewiesen werden können, sind sie sehr begrenzt.
Im Allgemeinen speichere ich in der Regel als Zeiger (oder als eine Art von templateten intelligenten Zeigern). Dies ist viel flexibler - sowohl für Tests (wie Sie erwähnt haben), sondern auch nur für den normalen Gebrauch.
Es ist fast nie vorzuziehen, Referenzen als Datenmitglieder zu speichern, und meistens ist es unmöglich. Wenn die Objekte zuweisbar sein müssen (da sie in einem Standardbibliothekscontainer gespeichert werden müssen), können Verweise nicht verwendet werden. Verweise können auch nicht erneut eingefügt werden. Sobald ein Verweis mit einem Objekt initialisiert wird, kann daher nicht auf ein anderes Objekt verwiesen werden.
Siehe diese Frage Soll ich Zeiger oder Referenzen in einem Mitglied bevorzugen Daten? für eine detailliertere Diskussion des Problems.
Wenn ich eine Wahl habe, möchte ich den möglichst beschränkten Typ verwenden. Wenn ich also keine Nullobjekte unterstützen muss, würde ich lieber ein
deklarieren %Vor%Mitglied und nicht ein
%Vor% member, weil die vorherige Deklaration die Tatsache dokumentiert, dass m_foo
nicht null sein kann.
Auf kurze Sicht ist der Vorteil nicht so groß. Aber auf lange Sicht, wenn Sie zu altem Code zurückkehren, ist die sofortige Gewissheit, dass Sie sich keine Sorgen über den Fall machen müssen, dass m_foo
null ist, sehr wertvoll.
Es gibt andere Möglichkeiten, einen ähnlichen Effekt zu erzielen. Ein Projekt, an dem ich arbeitete, wo sie Verweise nicht verstanden, würde darauf bestehen, dass potentiell null Zeiger mit dem Suffix "00" versehen werden, z. B. m_foo00
. Interessanterweise scheint boost::optional
Support-Referenzen zu haben Ich habe es nicht ausprobiert. Oder Sie können Ihren Code mit Behauptungen bestreuen.