JeuWeb - Crée ton jeu par navigateur
[Scala] play! - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Scala] play! (/showthread.php?tid=6129)

Pages : 1 2 3 4 5


[Scala] play! - srm - 14-05-2012

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


}




RE: [Scala] play! - niahoo - 14-05-2012

tes noms de tables sont sensationnellement atroces.

Code :
inner join tj_pla_gam_pga pga on (gam.gam_id = pga.gam_id)

Je sais pas pourquoi ça me fait penser à un canard.

Mais tu pointes du doigt un défaut de pas mal d'ORM : ne pas penser aux champs dans les tables de jointure, obligeant à créer des objets qui gèrent ça.

D'ailleurs si ces champs on un nom précis, j'aimerais le savoir ça m'aiderait dans mes recherches de doc.

KOIN !


RE: [Scala] play! - srm - 14-05-2012

Je nomme mes tables, mes champs, mes index, mes clés étrangères (et tout le reste) selon une norme assez précise.

En gros, pour expliquer le nommage ici :
- On préfixe les tables par T_
- On préfixe les tables de jointures par TJ_
- On suffixe les tables par un trigramme unique sur toute la base de données
- On préfixe tous les noms de colonnes par ce trigramme
- On nomme les tables de jointures avec les trigrammes des tables utilisés et on suffixe avec le trigramme de la jointure

Avec cette nomenclature, on s'assure que chaque élément est unique, c'est impossible par exemple d'avoir deux colonnes avec le même nom.
On sait directement en un clin d'oeil si une colonne fait partie d'une table ou si c'est une colonne étrangère.
On sait en un clin d'oeil le rôle d'une table, T_, TJ_, TR_ (table relationnel)
Il y a pas mal d'autres raisons aussi, mais je me souviens plus de toutes.
C'est pas très joli visuellement, mais c'est carrément bien pratique et évite pas mal d'âneries dans la vie de tous les jours Smile

Plus d'explications ici : http://sqlpro.developpez.com/cours/standards/

Edit : Grmbl, d'ailleurs je vois que je me suis planté sur les noms de table de jointure, je sais plus ou j'avais lu autre chose, je vais devoir corriger ça :o


RE: [Scala] play! - niahoo - 14-05-2012

c'est quoi une TR en gros ? erf je devrais le savoir de par ma formation mais je ne vois pas. (oui y a google sinon mais bon)

sinon le système est sympa mais c'est moche. fais donc un petit ORM qui gère ça Wink

Et sinon pour scala ben ... on voit surtout du SQL (d'ailleurs il manque une quote ça nique la coloration).

D'où vien la variable 'get' ( get[Pk[long]]
et l'opérateur ~
TR => table de référence

en gros c'est les tables dont le contenu ne bouge pas ?


RE: [Scala] play! - srm - 14-05-2012

Oui pour TR :-)

Il manque pas une quote, c'est la syntaxe pour dire que c'est un symbole.
scala> 'Bouh
res1: Symbol = 'Bouh

get ça fait partie de l'orm Anorm, dans mon exemple j'ai pas mis les include que voici :


package models

import java.util.{Date}

import play.api.db._
import play.api.Play.current

import anorm._
import anorm.SqlParser._

En effet ici il n'y a pas de Scala quasiment, je parle surtout de play! dans mon message Smile

Et concernant le ~ c'est un type de variable spécial de Anorm, en gros si je dis Int~String j'ai un type "Int String" Big Grin


RE: [Scala] play! - Marc15 - 06-07-2012

Mon prochain jeu Web utilisera Play! 2.0 avec Scala.

Je l'ai essayé un peu. C'est formidable.

C'est dur de revenir au PHP après...


RE: [Scala] play! - srm - 06-07-2012

Comme ça d'un coup d'un seul tu sors ça ? ^^


RE: [Scala] play! - srm - 07-07-2012

Je comprends mieux Smile


RE: [Scala] play! - Marc15 - 09-07-2012

Désolé, je ne comprends pas... :/


RE: [Scala] play! - Sephi-Chan - 09-07-2012

Je suppose qu'il ironisait sur ton absence de réponse. Smile