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. –
- 1. Wann sollte ich anstelle von gcc ld verwenden?
- 2. RequestStack Wann sollte ich getMasterRequest anstelle von getCurrentRequest verwenden?
- 3. Android: Wann/warum sollte ich FrameLayout anstelle von Fragment verwenden?
- 4. Wann sollte ich ein UserControl anstelle einer Seite verwenden?
- 5. Wann sollte ich anstelle einer For-Schleife eine Map verwenden?
- 6. Wann sollte ich String.Format oder String.Concat anstelle des Verkettungsoperators verwenden?
- 7. Wann sollte ich anstelle einer Direktive eine Komponente verwenden?
- 8. Wann sollte ich Threads verwenden?
- 9. Wann sollte ich RESTful verwenden?
- 10. Wann sollte ich getElementById verwenden?
- 11. Wann sollte ich ConcurrentSkipListMap verwenden?
- 12. Wann sollte ich AUTOLOAD von Perl verwenden?
- 13. Was sollte ich anstelle von isinstance() verwenden
- 14. Wann sollte ich eine einheitliche Initialisierung verwenden?
- 15. Wann sollte ich before_filter vs helper_method verwenden?
- 16. In Objective-C, wann sollte ich Klassenmethoden verwenden und wann sollte ich Instanzmethoden verwenden?
- 17. In Jira Agile wann sollte ich eine "Story" verwenden und wann sollte ich eine "Verbesserung" verwenden?
- 18. Isolationsstufe - serialisierbar. Wann sollte ich das verwenden?
- 19. Wann/warum sollte ich eine Datenbank verwenden?
- 20. Wann sollte ich poppler_page_render vs poppler_page_render_for_printing verwenden?
- 21. Wann sollte ich setUserState in Joomla verwenden?
- 22. Wann sollte ich ein ORM-Framework verwenden?
- 23. Wann sollte ich Subdomains verwenden oder vermeiden?
- 24. Wann sollte ich String statt Stringstream verwenden?
- 25. Wann sollte ich # in ColdFusion verwenden?
- 26. Wann sollte ich LINQ für C# verwenden?
- 27. Wann sollte ich eine Objektdatenbank verwenden?
- 28. Wann ich ServiceTracker vs ServiceReference verwenden sollte
- 29. Wann sollte ich user.get_profile in django verwenden?
- 30. Wann addressof (x) anstelle von & x verwenden?
OS ist langsam, aber großartig für das Prototyping. –