2010-10-21 55 views
9

Escribo esta pregunta para mantener un registro de patrones de diseño asociados con Scala, patrones de estándares o solo de este idioma.Patrones de diseño y Scala

preguntas asociadas:

Gracias a todos los que contribuyen

+0

Al darse cuenta de que es demasiado tarde, pero esto realmente debería ser wiki de la comunidad –

+0

@Dave De acuerdo, no creo que esta sea una pregunta TAN legal. Pero, estoy muy interesado en ver las respuestas y espero que continúe. – JAL

+0

Es posible que también desee realizar un enlace a [esta pregunta] (http://stackoverflow.com/questions/5566708/design-patterns-for-static-type-checking). – ziggystar

Respuesta

7

Vamos a empezar con el "patrón Singleton" :

object SomeSingleton //That's it 

Me gustaría, además, proponer la "patrón utilizando funciones-de-orden superior" . en lugar de e. gramo. iterando a través de una colección usted mismo, proporciona funciones a los métodos que proporcionan las clases.

En Scala que básicamente dice lo que va a hacer:

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

Hacer esto en Java habría significado tocar los elementos de una colección de uno mismo y mezclar su lógica de la aplicación con el código de control de flujo.

More information sobre las clases de Colección.


Este agradable EPFL paper sobre deprecating el patrón de observador podría ser de interés, también.


Typeclasses son un enfoque para estructurar las características comunes de las clases donde la herencia no lo hace realmente en forma.

+2

Es triste que el "nivel" o lenguaje de programación común sea tal que estos ... constructos ... se deben sacar a la luz y llamados "patrones de diseño" (como si merecieran una carga adicional :-) –

+2

"Patrón de uso de funciones de orden superior" es la estrategia – Synesso

+0

del GoF. Para que los singleton sean más comprobables, siempre es mejor dejarlos parciales si no completos. implementación en un rasgo. // código rasgo SomeSingleton { def doSomething1 {} perezoso val1 val } objeto SomeSingleton extiende SomeSingleton – Nick