14-05-2012, 05:18 PM
Bonjour,
Je vous ai déjà plein de fois du langage Scala et un peu aussi du framework play!.
Et on m'a souvent dit "tu as codé quoi en Scala ? Montre nous voir".
Je vais essayer de vous montrer ici des choses que j'aime bien dans le langage Scala et le framework play!
Un exemple tout simple, je n'aime pas dans quasiment tous les framework leur couche ORM qui empêche de faire des requêtes super compliqués (car elles ne map dans aucun objet), du moins on peut le faire, mais on perd toute la notion d'objet. J'aime pas aussi le fait que dans un ORM on soit trop rigide dans le sens ou le model objet colle beaucoup trop au model de la base de données, alors que ce sont deux mondes différents.
Je vais vous donner un exemple simple.
J'ai une table Game (T_GAME_GAM) qui contient les informations d'une partie (du jeu Heroes of Newerth), par exemple l'heure du match, le nombre de participants, etc. Cette table et relié à la table Player (T_PLAYER_PLA) par l'intermédiaire de la table de jointure (TJ_PLA_GAM_PGA). Cette table de jointure contient des informations du joueur pour cette partie, par exemple le level qu'il a atteint, le nombre de joueur qu'il a tué, etc. Dans la plus part des frameworks (si vous utilisez un framework, n'hésitez pas à donner ici le code correspondant à cet exemple pour que l'on en discute) vous aurez une modélisation de Game et d'un objet par exemple Participate, qui contiendra les informations de la participation d'un joueur dans la partie.
Mais en objet pure on aurait sans doute pas architecturé les choses ainsi, mais plutôt de la sorte : un joueur à joué à une Game, qui contient toutes les informations nécessaires.
Quoi qu'il en soit, que vous soyez d'accord ou pas avec cette idée, avec play! on peut faire les deux, Game et Participate, ou tout le mettre dans Game de façon très simple, car dans play! on peut construire n'importe quelle requête et la mapper exactement comme on veut dans les objets.
Voici ce que donne mon exemple précédemment :
Je vous ai déjà plein de fois du langage Scala et un peu aussi du framework play!.
Et on m'a souvent dit "tu as codé quoi en Scala ? Montre nous voir".
Je vais essayer de vous montrer ici des choses que j'aime bien dans le langage Scala et le framework play!
Un exemple tout simple, je n'aime pas dans quasiment tous les framework leur couche ORM qui empêche de faire des requêtes super compliqués (car elles ne map dans aucun objet), du moins on peut le faire, mais on perd toute la notion d'objet. J'aime pas aussi le fait que dans un ORM on soit trop rigide dans le sens ou le model objet colle beaucoup trop au model de la base de données, alors que ce sont deux mondes différents.
Je vais vous donner un exemple simple.
J'ai une table Game (T_GAME_GAM) qui contient les informations d'une partie (du jeu Heroes of Newerth), par exemple l'heure du match, le nombre de participants, etc. Cette table et relié à la table Player (T_PLAYER_PLA) par l'intermédiaire de la table de jointure (TJ_PLA_GAM_PGA). Cette table de jointure contient des informations du joueur pour cette partie, par exemple le level qu'il a atteint, le nombre de joueur qu'il a tué, etc. Dans la plus part des frameworks (si vous utilisez un framework, n'hésitez pas à donner ici le code correspondant à cet exemple pour que l'on en discute) vous aurez une modélisation de Game et d'un objet par exemple Participate, qui contiendra les informations de la participation d'un joueur dans la partie.
Mais en objet pure on aurait sans doute pas architecturé les choses ainsi, mais plutôt de la sorte : un joueur à joué à une Game, qui contient toutes les informations nécessaires.
Quoi qu'il en soit, que vous soyez d'accord ou pas avec cette idée, avec play! on peut faire les deux, Game et Participate, ou tout le mettre dans Game de façon très simple, car dans play! on peut construire n'importe quelle requête et la mapper exactement comme on veut dans les objets.
Voici ce que donne mon exemple précédemment :
// Je définis les propriétés de mon objet, il y a ici des propriétés de T_GAME_GAM et de TJ_PLA_GAM_PGA
case class Game(id: Pk[Long], level: Long, killHero: Long, date: Option[Date])
object Game {
// -- Parsers
/**
* Je définis comment est parsé le résultat de ma requête et comment mon objet est remplis
*/
val simple = {
get[Pk[Long]]("t_game_gam.gam_id") ~
get[Long]("tj_pla_gam_pga.pga_level") ~
get[Long]("tj_pla_gam_pga.pga_kill_hero") ~
get[Option[Date]]("t_game_gam.gam_date") map {
case id~level~killHero~date => Game(
id, level, killHero, date
)
}
}
// -- Queries
/**
* Je définis la requête que je veux et lui demander de la parser avec Game.simple
*/
def findInvolving(playerId: Long): Seq[Game] = {
DB.withConnection { implicit connection =>
SQL(
"""
select * from t_game_gam gam
inner join tj_pla_gam_pga pga on (gam.gam_id = pga.gam_id)
where pla_id = {plaId}
"""
).on(
'plaId -> playerId
).as(Game.simple *)
}
}
}