Ich mag die "Definition von beliebigen Attributen" und ich denke, das OpenStruct in Ruby fühlt sich manchmal sauberer an als mit einem Hash, aber ich bin neugierig, ob es andere spezifische Vorteile oder Anwendungsfälle gibt, die OpenStruct zu einer besseren Wahl machen einfach einen Hash verwenden.Wann sollte ich OpenStruct anstelle von Hash verwenden?
Antwort
Ich denke, das ist meistens eine Leistungsentscheidung. Von der Ruby Documentation:
Ein OpenStruct nutzt Ruby-Methode Lookup-Struktur zu und finden und definieren die notwendigen Methoden für die Eigenschaften. Dies wird durch die Methode method_missing und define_method erreicht.
Dies sollte berücksichtigt werden, wenn Bedenken hinsichtlich der Leistung der erstellten Objekte bestehen, da bei der Einstellung dieser Eigenschaften viel mehr Aufwand im Vergleich zur Verwendung eines Hash oder Struct vorliegt.
Zusätzlich so etwas wie ein Hash
hat zusätzliche Funktionalität mit allen Verfahren bietet es (has_key?
, include?
, etc.). Die OpenStruct
ist ein sehr einfaches Objekt von diesem Standpunkt aus, aber wenn Sie keine Bedenken von einem Leistungsstandpunkt haben und nur ein einfaches Objekt zum Arbeiten wünschen, ist OpenStruct
eine gute Wahl.
Als weitere Vorsichtsmaßnahme, in Ruby 1.9.3 (mindestens) ist die ganze Arbeit getan, wenn das OpenStruct erstellt wird, anstatt auf die erste Methode zu verwenden. Dies macht OpenStruct selbst dann teuer, wenn Sie nie auf Member-Funktionen zugreifen. (Ich weiß nicht, ob das in einer späteren Version behoben wurde). – MZB
OpenStruct
Objekte sind nützlich, wenn Sie etwas brauchen einen gewissen Methodenaufruf Schnittstelle (dh sendet in einer Ente typisierte Objekt #name
und #value
reagiert) zu passen, oder wenn Sie die Details der Implementierung kapseln wollen, sondern wollen auch vermeiden Überdimensionierung der Lösung. Sie machen auch ein tolles Stub-Objekt, und ich benutze sie oft anstelle von Framework-Stubs, wenn ich den Overhead eines Stubs/Mocks nicht benötige.
+1 Zum Erwähnen ihrer Verwendung beim Testen. Ich benutze sie ausgiebig beim Stoppen von HTTP-bezogenen Datenbits beim Testen von API/Web-Service-Aufrufen. Ganz toll, wenn man einmal den Dreh raus hat. –
OS ist langsam, aber großartig für das Prototyping. –