2010-10-21 16 views
9

Sto scrivendo questa domanda per mantenere un registro di modelli di progettazione associati a Scala, modelli standard o solo da questo linguaggio.Design Patterns e Scala

domande associati:

Grazie a tutti coloro che contribuiscono

+0

Rendersi conto che è troppo tardi, ma questa dovrebbe essere la wiki della comunità –

+0

@Dave Concordato, non penso che questa sia una domanda SO-legale. Ma sono molto interessato a vedere le risposte e spero che continui! – JAL

+0

Si potrebbe anche voler collegare a [questa domanda] (http://stackoverflow.com/questions/5566708/design-patterns-for-static-type-checking). – ziggystar

risposta

7

Cominciamo con il "pattern Singleton" :

object SomeSingleton //That's it 

Vorrei inoltre proporre la "modello Utilizzando funzioni-di-ordine superiore" . Invece di e. g. iterando attraverso una raccolta da solo si forniscono funzioni ai metodi forniti dalle classi.

In Scala che, fondamentalmente, dire ciò che si intende fare:

//declare some example class 
case class Person(name: String, age: Int) 

//create some example persons 
val persons = List(Person("Joe", 42), Person("Jane", 30), Person("Alice", 14), Person("Bob", 12)) 

//"Are there any persons in this List, which are older than 18?" 
persons.exists(_.age > 18) 
// => Boolean = true 

//"Is every person's name longer than 4 characters?" 
persons.forall(_.name.length > 4) 
// => Boolean = false 

//"I need a List of only the adult persons!" 
persons.filter(_.age >= 18) 
// => List[Person] = List(Person(Joe,42), Person(Jane,30)) 

//"Actually I need both, a list with the adults and a list of the minors!" 
persons.partition(_.age >= 18) 
// => (List[Person], List[Person]) = (List(Person(Joe,42), Person(Jane,30)),List(Person(Alice,14), Person(Bob,12))) 

//"A List with the names, please!" 
persons.map(_.name) 
// => List[String] = List(Joe, Jane, Alice, Bob)  

//"I would like to know how old all persons are all together!" 
persons.foldLeft(0)(_ + _.age) 
// => Int = 98 

Fare questo in Java avrebbe significato toccare gli elementi di una collezione di te stesso e mescolare la logica dell'applicazione con il codice di controllo di flusso.

More information sulle classi Collection.


Questo bel EPFL paper sulla deprecando il pattern Observer potrebbe essere di interesse, anche.


Typeclasses sono un approccio per strutturare le caratteristiche comuni delle classi in cui eredità non fa davvero in forma.

+2

È triste che il "livello" o linguaggio di programmazione comune sia tale che questi ... costrutti ... devono essere portati fuori e chiamato "schemi di progettazione" (come se dovessero giustificare qualche onere aggiuntivo :-) –

+2

"Usare le funzioni del modello di ordine superiore" è la strategia di GoF – Synesso

+0

Per rendere più singolarmente testabili è sempre meglio lasciare parziale se non pieno implementazione in un tratto. // codice tratto SomeSingleton { def doSomething1 {} pigro val val1 } oggetto SomeSingleton estende SomeSingleton – Nick