Wann ist es vorzuziehen, Datenelemente als Referenzen anstelle von Zeigern zu speichern?

8

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?

    
Runcible 05.06.2009, 17:23
quelle

4 Antworten

10

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.

    
Reed Copsey 05.06.2009, 17:28
quelle
7

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.

    
anon 05.06.2009 17:26
quelle
3

Ich habe versucht, das selbst herauszufinden, also könnte ich es auch posten. Ich schließe, es scheint nicht eine gute Idee zu sein, Referenzdaten Mitglied zu verwenden, weil Sie versehentlich einen Alias ​​erstellen könnten, wenn Sie ihn initialisieren.

%Vor%     
Bill 22.12.2012 03:33
quelle
2

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.

    
timday 05.06.2009 19:20
quelle

Tags und Links