2010-10-21 3 views
9

J'écris cette question pour maintenir un registre des modèles de conception associés à Scala, des modèles de normes ou seulement à partir de ce langage.Design Patterns et Scala

des questions associées:

Merci à tous ceux qui contribuent

+0

Réalisant qu'il est trop tard, mais ce devrait vraiment être la communauté wiki –

+0

@Dave D'accord, je ne pense pas que ce soit une question SO juridique. Mais, je suis très intéressé à voir les réponses et j'espère que ça continue! – JAL

+0

Vous pouvez également créer un lien vers [cette question] (http://stackoverflow.com/questions/5566708/design-patterns-for-static-type-checking). – ziggystar

Répondre

7

Commençons par le "pattern Singleton":

object SomeSingleton //That's it 

Je propose en outre la "Utilisation-fonctions de-ordre supérieur modèle". Au lieu de e. g. itérer à travers une collection par vous-même vous fournissez des fonctions aux méthodes que les classes fournissent.

Dans Scala vous dites essentiellement ce que vous avez l'intention de le faire:

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

Faire cela en Java aurait signifié de toucher les éléments d'une collection et vous mélangez votre logique d'application avec le code de contrôle de flux.

More information concernant les classes de la collection.


Cette belle EPFL paper à propos dévalorisant le motif d'observateur pourrait être intéressant aussi.


Typeclasses sont une approche pour structurer les caractéristiques communes des classes où l'héritage ne correspond pas vraiment.

+2

Il est triste que le "niveau" ou le langage de programmation commun est tel que ces ... constructions ... doivent être mises en évidence et appelé "modèles de conception" (comme s'ils devaient justifier une charge supplémentaire :-) –

+2

"Utiliser des fonctions de modèle supérieur" est la stratégie du GoF – Synesso

+0

Pour rendre les singletons plus testables, il est toujours préférable de laisser partiel sinon plein implémentation dans un trait. // Code trait SomeSingleton { def doSomething1 {} val val1 paresseux } SomeSingleton objet étend SomeSingleton – Nick