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
}
}
Portion de code lent
Pour le code s’exécutant lentement, il faut le placer directement dans la closure gérant l’affichage. Il sera appelé seulement si nécessaire.
1 | buildDiagram est toujours appelé, même si ce qui doit être affiché est le tableFilter , par contre la closure ne sera exécutée que si nécessaire. |
2 | Le trie et le filtrage de la table ne redessine que la table et le filtre. |
3 | Partie toujours appelée… |
4 | Appelé seulement si nécessaire, le code lent devrait être mis là. |
Guide de style de codage pour le développement d’applications Grails
Voici quelques lignes directrices qui devraient faciliter la maintenance de l’application :
-
Modificateurs de méthode :
-
Utilisez des modificateurs protected, private et final pour les méthodes d’un contrôleur qui ne sont pas des actions.
-
-
Style de codage :
-
Donnez la priorité au code concis, tout en préservant la clarté.
-
Utilisez les annotations
@GrailsCompileStatic
ou@CompileStatic
dans toute la base de code.
-
-
Actions sans état :
-
Concevez toujours les actions de manière à ce qu’elles soient sans état et évitez d’utiliser des sessions.
-
-
Traits du contrôleur :
-
Évitez d’utiliser des services pour implémenter les traits du contrôleur.
-
-
Annotation @Transactional :
-
Réservez l’annotation @Transactional uniquement aux actions du contrôleur.
-
-
Règles générales :
-
Utilisez le modificateur final lorsque cela est approprié.
-
Adhérez au principe DRY (Don’t Repeat Yourself).
-
Gardez la portée des symboles la plus courte possible pour améliorer la lisibilité du code.
-
Optez pour des noms de variables locales concis et significatifs.
-
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 i18n, utilisez les dossiers du module d’application gradle
i18n
pour chaque application.
class Book {
String title
}
-
class name localisation "book.label = Libro"
-
class field name localisation "book.title.label = Título del libro"
-
Pour être efficace
-
Ne localisez pas trop tôt
-
Lorsque vous avez une vue d’ensemble globale, commencez la traduction
-
Utilisez pour les labels les plus globaux des clés courtes, utilisez l’espace de noms
default
pour eux, l’étiquette spécialisée peut être longue
-
-
Utilisez la convention pour votre i18n :
-
Préfixez avec "default" ce qui pourrait être réutilisé
-
Ne pas préfixer 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 Crew i18n)
-
L’i18n commun doit être localisé dans le module d’application Crew
ou Server
, les propriétés ne sont pas privées pour un module d’application.
Configuration
-
Utilisez l’énumération, dans le code, pour la configuration
-
La vérification statique est facilitée ;
-
Les énumérations Groovy sont plus lisibles que XML, Json, Yaml…
-
Sécurité
-
Le code lié à la sécurité doit être situé près du point d’influence
-
Nous voulons éviter la centralisation pour 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 contrôles statiques sont cruciaux
-
-
-
Évitez les règles complexes qui ne peuvent pas être vérifiées de manière statique lors de la compilation
-
Les règles administratives ne doivent pas s’appuyer sur des chaînes d’autorisation, une valeur booléenne dans un objet est plus explicite lors des tests dans le code.
Classes du répertoire domain
-
Éviter les dépendances cycliques entre les classes domain de différents modules applicatifs
-
Ces classes doivent être minimales
-
Pas de helper et autres, avec des dépendances externes dans les domains
Pour être efficace :
-
Les petites évolutions ne déclenchent pas une réécriture complète du code
-
L’intégration de nouvelles fonctionnalités doit être simple
-
Les différentes préoccupations doivent rester isolées, minimisant l’influence mutuelle