Ich scheine viele Probleme zu haben, mit unveränderlichen Prinzipien in Scala zu bleiben, von denen eines das Konzept des Klonens (oder eher Ableitens) von dem fraglichen Objekt ist.Unveränderliche Klassen und Eigenschaften?
Eines dieser Probleme ist das Konzept der gemischten in Zügen - Beispiel
trait helper //modifies some kind behavior.. assume we want to to continue down the line
class A (val x:int) {
def add(y:int) = new A(x + y)
}
Example extends App {
val a =new A(5) with helper
val b = a.add(10) // mixed trait disappears
}
Nun ist diese nur eine wirklich einfache Version eines komplexeren Problem ist, habe ich heute schon um verschiedene Klassen gebaut, Factory-Methoden zu verstecken Klasse A usw. Wenn wir nur mit einem Merkmal arbeiten, weiß ich, dass ich es einfach testen und nach Bedarf weiterleiten könnte. Aber was zum Teufel mache ich, wenn ab 3 oder mehr Charakterzüge existieren könnten? Ich müsste für alle Kombinationen testen, was unrealistisch ist.
Wie instanziieren (klonen) Sie ein existierendes Objekt mit verschiedenen Merkmalen und/oder modifizieren Sie einige Aspekte davon, während Sie den funktionalen Designprinzipien folgen?
Vielen Dank, - Tim
Es stellt sich heraus, überhaupt nicht einfach zu sein! Dies ist einer der Hauptgründe, warum ich versuche, das Kuchenmuster zu vermeiden - es ist wirklich schwierig, den gleichen Kuchen herzustellen, besonders wenn man den Kuchen im Handumdrehen baut. Es ist im Allgemeinen einfacher, wenn das, was Verhalten verändert, Daten sind (z. B. ein "val" in der Klasse, wahrscheinlich im Konstruktor). –
Ich stimme zu, und leider vermeide ich auch das Muster der Eigenschaftsverzierung ... es sieht gut in einem Buch aus, aber die akademischen Bücher befassen sich nie damit, wie man das Objekt später klont, wie ich hier beschrieben habe. – LaloInDublin
Sie müssen grundsätzlich einen Builder für das Objekt erstellen, der jedes Mal, wenn Sie das Merkmal mischen möchten, weitere drei oder vier Zeilen Boilerplate (wenn ich es tue) hinzufügt. Manchmal lohnt es sich immer noch. Oft ist es nicht. –