2016-05-05 10 views
3

Fallklassen sind vermutlich algebraische Typen, daher sind einige Leute dagegen, der Fallklasse Methoden hinzuzufügen. Kann jemand bitte ein Beispiel dafür geben, warum es eine schlechte Idee ist?Ist es eine gute Idee, Methoden zu Scala-Fallklassen hinzuzufügen

+1

Ich denke nicht, dass dies eine schlechte Idee ist, solange Ihre Fallklasse unveränderlich bleibt und Methoden, die Sie hinzufügen, idempotent sind. In diesem Fall können Methoden der Fallklasse als Funktionen mit speziellem Namensraum betrachtet werden. – Aivean

+1

Das wäre eine viel bessere Frage, wenn Sie auf einige Beispiele von Leuten zeigen, die dieses Argument machen.Die Leute gehen nicht nur herum und sagen "Fügen Sie keine Methoden zu Fallklassen hinzu", obwohl manche Leute das in einem bestimmten Kontext sagen, und es wird mehr oder weniger vertretbar sein, abhängig von diesem Kontext. –

Antwort

1

Dies ist eine dieser Fragen, die zu mehr Fragen führt. Folgendes ist meine Einstellung zu diesem Thema.

Mal sehen, was passiert, wenn ein Fall der Klasse definiert ist, Der Scala-Compiler die folgende Fall ist,

  • Erstellt eine Klasse und ihre Begleiter-Objekt.
  • Implementiert die apply Methode, die Sie als Fabrik verwenden können. Dadurch können Sie Instanzen der Klasse ohne das Schlüsselwort new erstellen.
  • Präfixiert alle Argumente in der Parameterliste mit val. dh. macht es unveränderliche
  • Fügt Implementierungen von hashCode, equals und toString
  • die unapply Methode implementiert, unterstützt ein Fall Klasse pattern matching. Dies ist wichtig, wenn Sie eine Algebraic Data Type definieren.
    • Erzeugt accessors für Felder. Beachten Sie, dass es nicht „Mutatoren“

Jetzt generiert, wie wir Fallklassen exakt sind nicht Peers des Java Beans sehen können. Fallklassen neigen dazu, Datatype mehr darzustellen, als es eine entity darstellt. ich sie anschauen, wie gute Freunde von Programmierern in Bezug auf die Tatsache, dass es an der Kesselplatte endloser Getter schneidet sich, Überschreibung gleich und hashcode Methoden usw.

Nun zur Frage kommen,

Wenn Sie Betrachten Sie es von einem funktionalen Programmierstandpunkt aus, dann sind Fallklassen der Weg zu gehen, da Sie Unveränderlichkeit, Gleichheit betrachten würden und Sie sicher sind, dass die case class eine Datenstruktur darstellt. Es ist hier, dass viele Leute, die FP programmieren, sagen, sie für ADTs zu verwenden.

Wenn Ihre Fallklasse eine Logik hat, die auf der Klasse state funktioniert, dann ist dies eine schlechte Wahl für die funktionale Programmierung.

Ich bevorzuge die Verwendung von Fallklassen für Szenarien, in denen ich sicher bin, dass ich eine Klasse brauche, um eine Datenstruktur darzustellen, weil ich die Hilfe von automatisch generierten Methoden und den zusätzlichen Vorteil patter-matching bekomme. Wenn ich in einer OO Weise mit Nebenwirkungen, veränderbaren Zustand programmiere, verwende ich class.

Immerhin könnte es immer noch Szenarien geben, in denen Sie eine Fallklasse mit utlity Methoden haben könnten. Ich denke nur, dass diese Chancen geringer sind.