2012-04-21 24 views
6

tengo una clase de marca que tiene varios productosScala: cómo modelar una relación básica entre padres e hijos

Y en la clase de producto que desea tener una referencia a la marca, así:

case class Brand(val name:String, val products: List[Product]) 

case class Product(val name: String, val brand: Brand) 

¿Cómo puedo rellenar estas clases?

quiero decir, no puedo crear un producto a menos que tenga una marca

Y no puedo crear la marca a menos que tenga una lista de los productos (porque es una Brand.products val)

¿Cuál sería la mejor manera de modelar este tipo de relación?

Respuesta

6

Me pregunto por qué está repitiendo la información, diciendo qué productos se relacionan con qué marca tanto en la Lista como en cada Producto.

Aún así, puede hacerlo: no parecen estar permitido para las clases de caso por desgracia

params
class Brand(val name: String, ps: => List[Product]) { 
    lazy val products = ps 
    override def toString = "Brand("+name+", "+products+")" 
} 

class Product(val name: String, b: => Brand) { 
    lazy val brand = b 
    override def toString = "Product("+name+", "+brand.name+")" 
} 

lazy val p1: Product = new Product("fish", birdseye) 
lazy val p2: Product = new Product("peas", birdseye) 
lazy val birdseye = new Brand("BirdsEye", List(p1, p2)) 

println(birdseye) 
    //Brand(BirdsEye, List(Product(fish, BirdsEye), Product(peas, BirdsEye))) 

por nombre.

Ver también esta pregunta similar: Instantiating immutable paired objects

+0

Realmente parece lo que estoy buscando, lo probé en el repl y me dice que no se encontró que ojo de perdiz, tuve que usar el: modo de pasta y funcionó bien, pero como usted ha dicho, la clase de caso no es compatible :-( – opensas

+0

Agregué la referencia de la marca para poder recorrerla en ambos sentidos, pero supongo que en un enfoque funcional trae más dolores de cabeza que ventajas ... ¿Tengo razón? – opensas

+0

@opensas it es un poco dolor de cabeza, pero a veces es necesario. De lo contrario, tienes que usar 'var's para los campos y arriesgarte a tener' null's, pero esta versión es segura –

3

Desde su pregunta es sobre el modelo de esta relación, voy a decir por qué no sólo modelarlos como lo que hacemos en la base de datos? Separa la entidad y la relación.

val productsOfBrand: Map[Brand, List[Product]] = { 
    // Initial your brand to products mapping here, using var 
    // or mutable map to construct the relation is fine, since 
    // it is limit to this scope, and transparent to the outside 
    // world 
} 
case class Brand(val name:String){ 
    def products = productsOfBrand.get(this).getOrElse(Nil) 
} 
case class Product(val name: String, val brand: Brand) // If you really need that brand reference 
Cuestiones relacionadas