2012-04-21 7 views
6

ho una classe di marca che ha diversi prodottiscala: come modellare una relazione di base padre-figlio

E nella classe di prodotto voglio avere un riferimento al marchio, in questo modo:

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

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

Come posso calcolare queste classi ???

voglio dire, non riesco a creare un prodotto se non ho un marchio

E non riesco a creare il marchio se non ho un elenco di prodotti (a causa Brand.products è una val)

Quale sarebbe il modo migliore per modellare questo tipo di relazione?

risposta

6

Vorrei mettere in discussione il motivo per cui si stanno ripetendo le informazioni, dicendo quali prodotti si riferiscono a quale marca sia nell'Elenco sia in ciascun Prodotto.

Ancora, si può fare:

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))) 

per nome params non sembrano essere consentito per le classi di casi purtroppo.

Vedi anche questa domanda simile: Instantiating immutable paired objects

+0

Sembra davvero quello che sto cercando, ho provato sulla repl e mi dice che Birdseye non viene trovato, ho dovuto usare il: modalità di pasta e ha funzionato bene, ma come hai detto, la classe case non è supportata :-( – opensas

+0

Ho aggiunto il riferimento del marchio per poterlo attraversare in entrambi i modi, ma suppongo che in un approccio funzionale porti più mal di testa che vantaggi ... Ho ragione? – opensas

+0

@opensas it è un po 'mal di testa, ma a volte è necessario. Altrimenti devi usare 'var's per i campi e rischiare di avere' null's, ma questa versione è sicura –

3

Dal momento che la domanda è circa il modello di questo rapporto, dirò perché non solo loro modello come quello che facciamo nel database? Separa l'entità e la relazione.

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