Me gustaría poder ensamblar objetos de dominio a partir de rasgos, de acuerdo con varias propiedades que las clases concretas puedan tener. Cuando mis objetos son mutables, esto es bastante sencillo. Por ejemplo:Actualizaciones polimórficas en una jerarquía de clase inmutable
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 }
En particular, puedo leer polimórfica o actualizar cualquier HasHitPoints
instancia sin conocer el tipo de hormigón.
¿Cuál es la mejor manera de implementar esto con objetos inmutables? Si estoy feliz de leer simplemente las propiedades, entonces yo podría hacer algo como:
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
Además, puedo modificar fácilmente las clases concretas utilizando copy
si conozco el tipo preciso. La parte difícil es actualizar un arbitrario HasHitPoints
, por ejemplo. Si tengo muchas clases concretas y muchas propiedades diferentes que me gustaría mezclar, ¿cuál es el mejor esquema para evitar una explosión de código repetitivo?
Correcto, aunque el desorden de N métodos de actualización en M clases concretas era lo que esperaba evitar. Y como usted señala, sería bastante sencillo en un lenguaje dinámico. Este caso de uso es, obviamente, muy simplificado, pero creo que el problema a menudo surge cuando se mezclan las actualizaciones con una jerarquía de herencia inmutable. –
No argumentaré que es algo que Scala no maneja bien, pero en mi experiencia es un escenario que no aparece a menudo, a menos que, por supuesto, estés muerto en este momento del modelado. –
Posiblemente, aunque me pregunto hasta qué punto esa es la cuestión de Sapir-Whorf: los escenarios que un lenguaje no puede manejar bien se convierten en los escenarios que no surgen a menudo ... –