Ich programmiere regelmäßig in R in einem professionellen Kontext und schreibe auch Pakete für Kunden oder Mitarbeiter. Einige der Programmierer hier haben einen Java-Hintergrund und bestehen darauf, alles objektorientiert mit S4-Methoden zu tun. Andererseits habe ich die Erfahrung gemacht, dass S4-Implementierungen häufig schlechter abschneiden und viel mehr Kopfschmerzen verursachen, wenn Sie versuchen, den Code dazu zu bringen, das zu tun, was Sie möchten.
Ich stimme definitiv zu, dass Sie in einigen Fällen in der Lage sein müssen, komplexe Objekte zu konstruieren oder vorhandene Objekte kontrolliert anzuhängen. Meistens können S4-Implementierungen jedoch auch problemlos mit klassischen Listen durchgeführt werden, ohne den Aufwand, standardGeneric, Methoden, Konstruktoren, Initialisierer und dergleichen zu definieren.
Wann sollten Sie S4-Implementierungen für R schreiben?
EDIT: Aus Gründen der Klarheit schätze ich die Antworten und die Diskussion über OO im Allgemeinen in R. OOP kann in R auf vielfältige Weise durchgeführt werden, aber meine Frage zielt wirklich auf den Mehrwert der Verwendung von S4-Methoden speziell ab.
c
. Formale Validierung? Niemand sagte, OOP müsse mit strenger Eingabe durchgeführt werden; Smalltalk ist ein spektakuläres Beispiel. Im Allgemeinen denke ich, dass OOP nur eine Art und Weise ist, und daher gibt es keine "kanonische" OOP (trotzdem wählen die Leute normalerweise ihre Lieblingssprache aus und sagen, dass sie sie definiert).Antworten:
Ich gehe davon aus, dass dies nicht direkt auf Sie zutrifft, aber wenn Sie Pakete für Bioconductor entwickeln, besteht ein Anreiz, S4 zu verwenden, da diese die Verwendung aktiv fördern und dies seit fast einem Jahrzehnt tun - also den gesamten Kern Pakete nutzen S4 stark.
Ich finde, dass all der zusätzliche Aufwand ein Schmerz ist - setGeneric, setMethod, der Umgang mit NAMESPACE usw. Abgesehen davon finde ich, dass sich die auferlegte Struktur, das Potenzial für Erweiterbarkeit und andere solche Dinge lohnen können. Wie bei allem gibt es Kompromisse. Ich denke, es kann viel sauberer sein - ich mag es nicht, wie S3-Methoden einfach durch Namenskonventionen (foo.class) getarnt werden. Abgesehen davon vermeide ich es, S4 in meinem eigenen Code stark zu verwenden, es sei denn, ich werde dazu aufgefordert.
quelle
Meine Erfahrung stimmt mit Ihrer überein, daher verwende ich ausschließlich S3.
Zur Verdeutlichung: S4 verfügt über einige raffinierte Funktionen (z. B. Versand mehrerer Argumente und Überprüfung des Steckplatztyps), aber ich bin nicht auf eine Situation gestoßen, in der die Funktionen die Kosten überwogen. Beispiele für die Kosten sind: Jede Slot-Änderung erfordert eine vollständige Objektkopie und (möglicherweise noch schlimmer) die laufenden Änderungen an den S4-Methoden.
Kurz gesagt, ich mag die Idee hinter S4, aber ich würde warten, bis sie reif ist, bevor ich sie in meinem eigenen Code verwende.
quelle
Gute Frage! und ich hoffe, es wird eine nachdenkliche Diskussion ausgelöst ...
Ich habe es nie benutzt und beabsichtige es auch aus folgenden Gründen nicht:
Ich mag Suguar, was soll ich sagen!
quelle
object.method()
. Im R-Stil von Google heißt es: "Verwenden Sie S3-Objekte und -Methoden, es sei denn, es gibt einen starken Grund für die Verwendung von S4-Objekten oder -Methoden. Eine primäre Rechtfertigung für ein S4-Objekt wäre die Verwendung von Objekten direkt im C ++ - Code. Eine primäre Rechtfertigung für ein S4-Generikum / Methode wäre, auf zwei ArgumenteIch habe S4 gelernt, um die Spatial (sp) -Klassen für Tierspurdaten zu erweitern. Es war die beste Wahl (konsistenteste, allgemeinste und eng mit vielen GIS-Definitionen übereinstimmende) aus den verfügbaren Optionen, um zu vermeiden, dass alles, was erforderlich ist, von Grund auf neu geschrieben wird. Ich finde S4 nicht so lästig, wie viele Leute sagen, aber ich bin es jetzt gewohnt, die zugrunde liegende Struktur solcher Objekte zu untersuchen. Die Leistung ist auch gut, ich denke, es kann gut gemacht werden, obwohl es, wenn es schlecht gemacht wird, Leistungsfallen gibt.
Wenn räumliche Daten für Sie von Interesse sind, ist spatstat ein gutes Beispiel dafür, wie man viele ähnliche Dinge wie sp in S3 macht, obwohl es (wie bei scheinbar allem räumlichen ...) kaum saubere Analogien zwischen Datenstrukturen in verschiedenen Softwareprogrammen gibt .
quelle
S4-Klassen spielen eine wichtige Rolle in der räumlichen Statistik (sensu-Paket
sp
), bei der die Konvertierung von einem Datentyp zum anderen nahtlos erscheint. Die Falle dabei ist das Debuggen, das meiner Erfahrung nach bestenfalls mühsam war. Bisher habe ich es mit S3 geschafft, könnte aber in Zukunft die Verwendung von S4 in Betracht ziehen.Mit der Zeit, da die Dinge viel herumgespielt werden, werden sie meiner Meinung nach zumindest in den Kernmerkmalen verschiedener Bereiche von R eine wichtige Rolle spielen (möglicherweise räumliche Analyse, Ökonometrie, Umweltmetrik ...).
quelle
Vergessen Sie nicht, dass es auch R.oo (auf CRAN) gibt, das eine dritte Möglichkeit bietet, OO in R auszuführen. Meiner Meinung nach bietet dies ein OO-System, das Programmierern, die von anderen Systemen migrieren, möglicherweise besser bekannt ist - insbesondere, anstatt generisch zu sein Funktionen (damit print (foo) dann die Klasse von foo auslösen muss) sind die Methoden an das Objekt gebunden, sodass Sie foo $ print () ausführen würden - genau wie in Python oder C ++ würden Sie foo.print ausführen ().
quelle
Es war einmal, dass Roxygen2 S4-Methoden nicht mochte. Ab 2017 (zumindest) arbeiten sie zusammen.
Ich hatte das Unglück, einige Funktionen zu erstellen, die Methoden für die Arbeit mit S3- und S4-Klassen benötigten. Es war unglaublich schmerzhaft, diesen Code über die Jahre hinweg am Laufen zu halten, da R-Core die Details zur Interaktion dieser Systeme, zur Funktionsweise von Namespaces und zur Funktionsweise der Rcmd-Prüfung mehrfach geändert hat.
Wenn Ihnen der Styleguide von Google nicht gefällt, lesen Sie die Kommentare dieser bekannten Entwickler von R-Paketen aus diesem Thread in der R-Hilfe
Frank Harrell "Wenn Sie Informatik mehr lieben als Ihre eigene Zeit schätzen, verwenden Sie S4."
Terry Therneau schrieb: Für 90 Prozent meiner Arbeit bevorzuge ich die lockeren (S3) gegenüber den starren (S4) Klassen. Meine Zusammenfassung von S4 gegen S3
S4 hat ein großes Inkrement in: 1. Belästigung beim Schreiben 2. Schwierigkeit beim Debuggen 3. Fähigkeit, sehr obskuren Code zu schreiben 4. Design
S4-Gewinne: 5. Fähigkeit, automatische Konvertierungen zu steuern 6. Überprüfen Sie den Inhalt eines Klassenobjekts
quelle