In meiner Code-Basis möchte ich Refraktor entfernt von vars
. Die Code Grundstruktur folgt das Format:Scala: var zu Val - Redesign
class Animal {
var name : Option[String] = None
var owner : Option[String] = None
}
case class Dog(breed: String) extends Animal {
//Dog logic
}
Der Hauptgrund für diesen Entwurf ist, dass alle Informationen zur gleichen Zeit nicht zur Verfügung stehen.
Also, von service A
, die eine json deserialisiert, erhalte ich eine Animal
(entweder Animal
, Dog
)
val animal = new Animal
animal.name = "My little animal"
und dann
def update(animal: Animal) : Unit {
animal match {
case a : Animal => a.owner = Some("Joe") // call to service B
case _ => //handle dog
}
}
update(animal)
Die Frage ist: Wie kann ich es neu gestalten kann vermeidbaren Zustand in Animal
vermeiden?
eine
copy
Methode inAnimal
schreiben? Es gibt eine Reihe von Feldern, die einige Vortexer erzeugen können.Zusammensetzung?
Herstellung der beiden Klassen case
?
case class Animal (...)
case class Dog(animal: Animal, breed: String)
bearbeiten
- Tier als
trait
Ich brauche noch eine konkrete Umsetzung Animal
, wie ich Dogs
und Animals
(die wirklich sind Animal
und kein Subtyp haben)
- Probleme mit Kopie
Die bei Klasse Kopiermethode gebaut, aktualisiert nicht die Werte der Animal
Klasse. So werden Standardwerte verwendet - nicht was ich will. - Ja, es ist möglich, eine Fallklasse mit allen Feldern zu erstellen, aber ist es praktisch, wenn wir mehr als 100 Felder haben?
Fallklassen enthalten eine Kopiermethode https://stackoverflow.com/questions/7249396/how-to-clone-a-case-class-instance-and-change-just-one-field-in-scala – ameer