Mi piacerebbe essere in grado di assemblare oggetti di dominio da tratti, in base alle varie proprietà che potrebbero avere le classi concrete. Quando i miei oggetti sono mutabili, questo è abbastanza semplice. Per esempio:Aggiornamenti polimorfici in una gerarchia di classe immutabile
trait HasHitPoints { var hitPoints: Int = 100 }
trait HasBearing { var bearing: Double = 0 }
class Ship extends HasHitPoints with HasBearing
class Base extends HasHitPoints
val entities = new Ship :: new Base :: Nil
entities.collect { case h: HasHitPoints => h.hitPoints += 10 }
In particolare, posso polimorfico leggere o aggiornare qualsiasi HasHitPoints
esempio senza conoscere il tipo concreto.
Qual è il modo migliore per implementare questo con oggetti immutabili? Se io sono felice di leggere solo le proprietà, allora avrei potuto fare qualcosa di simile:
trait HasHitPoints { val hitPoints: Int }
trait HasBearing { val bearing: Double }
case class Ship(hitPoints: Int, bearing: Double) extends HasHitPoints with HasBearing
case class Base(hitPoints: Int) extends HasHitPoints
val things = Ship(50, 0) :: Base(100) :: Nil
val totalHitPoints = things.collect { case h: HasHitPoints => h.hitPoints }.sum
Inoltre, posso modificare facilmente le classi concrete utilizzando copy
se conosco il tipo preciso. La parte difficile è l'aggiornamento di un arbitrario HasHitPoints
, ad esempio. Se ho un sacco di lezioni concrete e molte proprietà diverse che mi piacerebbe mescolare, qual è il miglior schema per evitare un'esplosione di codice boilerplate?
Giusto, anche se il disordine dei metodi di aggiornamento N nelle classi concrete M era quello che speravo di evitare. E come fai notare, sarebbe piuttosto semplice in un linguaggio dinamico. Questo caso d'uso è ovviamente molto semplificato, ma penso che spesso il problema si risolva quando si mescolano gli aggiornamenti con una gerarchia di ereditarietà immutabile. –
Non dirò che è qualcosa che Scala non gestisce bene, ma nella mia esperienza è uno scenario che non emerge spesso - a meno che, naturalmente, non siate morti in questo momento della modellazione. –
Forse, anche se mi chiedo fino a che punto è la cosa di Sapir-Whorf: gli scenari che un linguaggio non può gestire bene diventano gli scenari che non si presentano spesso ... –