def showPage() {
// [. . .]
def b = new UiBlockSpecifier().ui {
diagram buildDiagram() (1)
tableFilter t, f (2)
}
taackUiService.show b
}
private UiDiagramSpecifier buildDiagram() {
// Always called (3)
new UiDisagramSpecifier().ui {
// Called only when needed (4)
def data = slowDataRetreiveMethod()
// Draw data Stuffs
}
}
Code lent
Lorsque le traitement des données est lent et que la closure est chargée à la demande (lazy loaded), il est important de placer le code lent directement dans la closure. Ainsi, il ne sera exécuté que si la closure est effectivement affichée.
| 1 | buildDiagram est toujours appelé, même si la cible à dessiner est tableFilter, mais la closure résultante n’est pas appelée systématiquement |
| 2 | Lors du tri ou du filtrage, seul le tableau est dessiné, pas le diagramme |
| 3 | Partie toujours appelée |
| 4 | Appelée uniquement si nécessaire : le code lent doit être écrit ici. |
Guide de style de codage pour le développement d’applications Grails
Voici quelques directives destinées à faciliter la maintenance des applications :
-
Modificateurs de méthodes :
-
Utilisez les modificateurs
protected,privateetfinalpour les méthodes d’un contrôleur qui ne sont pas des actions.
-
-
Style de codage :
-
Privilégiez un code concis tout en maintenant la clarté.
-
Utilisez les annotations
@GrailsCompileStaticou@CompileStaticdans l’ensemble du code.
-
-
Actions sans état :
-
Concevez toujours les actions pour qu’elles soient sans état (stateless) et évitez d’utiliser les sessions.
-
-
Traits de contrôleur :
-
Évitez d’utiliser des services pour implémenter des traits de contrôleur.
-
-
Annotation
@Transactional:-
Réservez l’annotation
@Transactionaluniquement aux actions de contrôleur.
-
-
Règles générales :
-
Utilisez le modificateur
finallorsque cela est pertinent. -
Adhérez au principe DRY (Don’t Repeat Yourself).
-
Gardez la portée des symboles aussi courte que possible pour améliorer la lisibilité du code.
-
Optez pour des noms de variables locales concis et explicites.
-
Spécifiez clairement les paramètres des méthodes publiques et les noms des membres.
-
En suivant ces directives, vous pouvez maintenir une base de code propre et expressive pour votre application Grails.
i18n
-
Ne centralisez pas l'`i18n`, utilisez les dossiers
i18ndu module applicatif Gradle de chaque application.
class Book {
String title
}
-
localisation du nom de classe : "book.label = Libro"
-
localisation du nom de champ de classe : "book.title.label = Título del libro"
-
Pour être efficace :
-
ne traduisez pas trop tôt
-
commencez à traduire lorsque vous avez une vue d’ensemble
-
gardez les libellés les plus importants courts et utilisez l’espace de noms
defaultpour eux ; les libellés spécialisés peuvent être longs
-
-
Utilisez des conventions pour votre
i18n:-
préfixez par "default." tout ce qui peut être réutilisé
-
ne préfixez pas le nom de classe traduit
-
Dans l’application
crew, nous utilisons des fichiers de propriétés spécifiques aux actions et aux domaines (voir dossier i18n de Crew)
-
Les traductions i18n communes doivent être placées dans le module applicatif Crew ou Server ; les propriétés ne sont pas privées à un module applicatif.
Configuration
-
Utilisez des
enumdans le code pour la configuration-
Le typage statique est roi
-
Les énumérations Groovy sont lisibles (plus que XML, JSON, YAML…)
-
Sécurité
-
Le code lié à la sécurité doit être situé au plus près de son point d’application
-
Nous souhaitons éviter de centraliser toutes les préoccupations
-
Créez un nouveau domaine selon les besoins, évitez d’encombrer la classe
User -
Les concepts abstraits doivent être minimisés pour des raisons de sécurité ; les vérifications statiques sont cruciales
-
-
-
Évitez les règles complexes qui ne peuvent pas être vérifiées statiquement lors de la compilation
-
Les règles d’administration ne doivent pas reposer sur des chaînes de permissions : une valeur booléenne dans un objet est plus explicite lors des tests dans le code.
Classes de domaine
-
Évitez les dépendances cycliques dans le domaine (
User⇒CartETCart⇒User) si les classes de domaine appartiennent à différents modules applicatifs -
Les classes de domaine doivent rester strictement minimales
-
Aucun helper avec des dépendances externes dans le domaine
Nous savons que nous sommes efficaces si :
-
De petites évolutions n’entraînent pas une réécriture complète du code
-
L’intégration de nouvelles fonctionnalités est directe
-
Les différentes préoccupations restent isolées, minimisant leur influence mutuelle
-
Les choses paraissent simples