8 mars 2018 11:20:56 seb leridon
Tableau des règles Checkstyle et PMD
Le tableau suivant décrit les règle des outils Checkstyle et PMD retenue pour l'analyse du code. L'abréviation c dans la colonne outil correspondant à Checkstyle, p à PMD
Fonctionnalité | Valeur | Outils | Nom de la règle dans l'outil |
---|---|---|---|
Règles de nommage | |||
Variables locales, finales | ^[A-Z]*$ - strict (TODO) : strName, nName ou lName | c | LocalFinalVariableName |
Variables locales, non finales- attention, paramètres de catch inclus | ^[a-z][a-zA-Z0-9]*$ - strict (TODO) : strName, nName ou lName | c | LocalVariableName |
Attributs non statiques | ^_[a-z](_?[a-zA-Z0-9])*$ - strict (TODO) : strName, nName ou lName | c | MemberName |
Paramètres | ^[a-z][a-zA-Z0-9]*$ - strict (TODO) : strName, nName ou lName | c | ParameterName |
Constantes (champs statiques et finaux) | ^[A-Z0-9]*$ | c | ConstantName |
Variables statiques, non finales | ^_[a-z](_?[a-zA-Z0-9])*$ - strict (TODO) : strName, nName ou lName | c | StaticVariableName |
Méthode | [a-z][a-zA-Z0-9]*$ | c | MethodName |
Classe (et interface) | ^[A-Z][a-zA-Z0-9]*$ | c | TypeName |
Package | ^fr\.paris\.[a-z\.]*$ | c | PackageName |
Classes abstraites | strict seulement : mot clé abstract | c | AbstractClassName |
Longueur max d'une variable | 80 - strict 50 | p | LongVariable |
Longueur min du nom d'une méthode | 3 | p | ShortMethodNameRule |
Longueur min du nom d'une variable | non retenu | p | ShortVariable |
Règles non retenues (redondantes) | |
---|---|
PMD | VariableNamingConventionRule, MethodNamingConvention, |
ClassNamingConventionRule, AbstractNamingRule|
Fonctionnalité | Valeur | Outils | Nom de la règle dans l'outil |
---|---|---|---|
En-tête de fichiers | |||
Les fichiers doivent tous contenir le même en-tête | ${checkstyle.header.file} | c | header |
L'en-tête doit correspondre à une expression régulière | non retenu | c | RegexpHeader |
Fonctionnalité | Valeur | Outils | Nom de la règle dans l'outil |
---|---|---|---|
Imports | |||
Imports inutiles : dupliqué, java.lang.* ou du même package | na | c | RedondantImports |
Idem précédent + import inutilisée | na | c | UnusedImports |
Les imports ne doivent pas utiliser * | na | c | AvoidStarImport |
Vérifie l'ordre des imports (java, puis javax, …) | non retenu | c | ImportOrder |
Rejette les packages illegaux (par défaut, slt ceux de sun.*) | na | c | IllegalImport |
Règles non retenues (redondantes) | |
---|---|
PMD | ImportFromSamePackage, UnusedImports, DontimportJavaLang, |
DuplicateImport|
Fonctionnalité | Valeur | Outils | Nom de la règle dans l'outil |
---|---|---|---|
Non respect de longueur | |||
Longueur max d'une méthode | par défaut : 100 lignes, en comptant les commentaires et les lignes vides | p | ExcessiveMethodLength |
Longueur max d'une classe | par défaut : 1000 lignes, en comptant les commentaires et les lignes vides | p | ExcessiveClassLength |
Nombre max de parametres | par défaut : 7 | c | ParameterNumber |
complexité : nombre de points de décision (if, while, do, for, ?:, catch, switch, , OR et case) + 1 pour la méthode | 10 - strict seulement | p | CyclomaticComplexityRule |
Nombre max de commandes executables | non retenu | c | ExecutableStatementCount |
Longueur max d'un fichier | non retenu | c | FileLenght |
Longueur max d'une ligne | non retenu | c | LineLength |
Longueur max pour une classe anonyme interne | non retenu | c | AnonInnerLenght |
Nombre de méthodes et d'attributs publics | 45 | p | ExcessivePublicCount |
Règles non retenues (redondantes) | |
---|---|
PMD | ExcessiveParameterList |
Checkstyle | MethodLenght, CyclomaticComplexity |
Fonctionnalité | Valeur | Outils | Nom de la règle dans l'outil |
---|---|---|---|
Espaces | |||
Espace non autorisé si un des éléments du for est vide : for(int i;;i++) | non retenu | c | EmptyForIteratorPad |
Seuls = et == peuvent (doivent) être suivis par un espace | token=ASSIGN, EQUAL | c | WhitespaceAround |
Les parenthèses doivent avoir des espaces | space | c | ParenPad |
Vérifie qu'il n'y a pas d'espace après certains operateurs | non retenu | c | NoWhiteSpaceAfter |
Vérifie qu'il n'y a pas d'espace avant certains operateurs | non retenu | c | NoWhiteSpaceBefore |
Vérifie la façon de gérer les longues lignes après les opérateurs | non retenu | c | OperatorWrap |
Vérifie les espaces pour le cas particulier des cast | non retenu | c | TypeCastParenPad |
Vérifie qu'il n'y a pas de tab dans le code source | non retenu | c | TabCharacter |
Vérifie que les éléments listés sont bien suivis par un espace | non retenu | c | WhiteSpaceAfter |
Fonctionnalité | Valeur | Outils | Nom de la règle dans l'outil |
---|---|---|---|
Qualificatifs | |||
L'ordre des qualificatifs est : public - protected - private - abstract - static - final - transient - volatile - synchronized - native - strictfp | na | c | ModifierOrder |
Les interfaces ne sont ni publiques ni abstraites, les methodes et attributs prives d'une classe finale ne sont pas finaux, dans une interfaces les variables ne sont ni publiques ni statiques ni finales | na | c | RedundantModifier |
Fonctionnalité | Valeur | Outils | Nom de la règle dans l'outil |
---|---|---|---|
Blocs | |||
Les blocs ne peuvent pas être vides (concerne : catch, do, else, finally, if, for, try, while et init) | na | c | EmptyBlock |
Les blocs switch sont non vides | na | p | EmptySwitchStatements |
Les blocs synchronized sont non vides | na | p | EmptySynchronizedBlock |
Vérifie que les accolades ouvrantes ( { ) vont à la ligne | na | c | LeftCurly |
Vérifie que les blocs de code sont bien entourés d'accolades {} | na | c | NeedBraces |
Vérifie que les accolades fermantes ( } ) vont à la ligne | na | c | RightCurly |
Vérifie qu'il ne reste pas de bloc {} qui ne servent plus dans le code (laissés après un debuggage) | na | c | AvoidNestedBlocks |
Règles non retenues (redondantes) | |
---|---|
PMD | EmptyCatchBlock, EmptyIfStmt, EmptyWhileStmt, EmptyTryBlock, EmptyFinallyBlock, IfStmtsMustUseBraces, WhileLoopsMustUseBracesRule, IfElseStmtsMustUseBracesRule, ForLoopsMustUseBracesRule |
Fonctionnalité | Valeur | Outils | Nom de la règle dans l'outil |
---|---|---|---|
Problèmes de code | |||
Eviter les syntaxes de type ?: | non retenu | c | AvoidInlineConditionals |
Vérifier si un test est imbriqué dans un synchronize qui est lui-même imbriqué dans le même test |
EX : if ( theInstance == null ) { synchronized( MySingleton.class ) { if ( theInstance == null ) { theInstance = new MySingleton(); }}} |na|c|Double checked locking|
Détecter les instructions vides (;) | na | c | EmptyStatement |
Si on surcharge equals [resp hashcode] alors on doit surcharger hashcode [resp equals] | na | c | EqualsHashCode |
Une variable ou un paramètre local ne doit pas risquer d'écraser un attribut | na | c | HiddenField |
Simplifier les retours de booleens - ex : on doit avoir return (! isValid()) au lieu de if (isValid()) return false; else return true; | na | c | SimplifyBooleanReturn |
Inutile de tester avec == true ou !false … | na | c | SimplifyBooleanExpression |
Vérifie que l'on n'a pas de nombre qui ne soit pas une constante (à part -, 0, 1, et 2) | strict seulement | c | MagicNumber |
Vérifie que les switch on bien un default case | na | c | MissingSwitchDefault |
Vérifie qu'il ne reste pas une virgule après le dernier élément en initialisant un array | na | c | ArrayTrailingComma |
Vérifie que si on définit un equals on a surchargé aussi equals(java.lang.Object) | na | c | CovariantEquals |
Vérifie que l'on définit bien dans l'ordre : les attributs statiques, publics, protected, ceux pour le package (sans getter ni setter), privés; les constructeurs; les méthodes. | na | c | DeclarationOrder |
Vérifie que l'on n'initialise pas des objets inutilement (comme int i=0; ou object o=null;) | na | c | ExplicitInitialization |
Les paramètres et variables qui ne sont jamais modifiés doivent être déclarés final | non retenu | c | FinalLocalVariable |
Vérifie que l'on ne catche pas de mauvaise exception (java.lang.Exception , java.lang.Error ou java.lang.RuntimeException ) | non retenu | c | FinalLocalVariable |
Vérifie que l'on utilise bien des factory quand il le faut | non retenu | c | IllegalInstantiation |
Interdit certains token (comme ++) | non retenu | c | IllegalToken |
Interdit les valeurs definies par type (par ex : pas de string qui ont la valeur a href, pas d'entier qui commence par 0, …) | non retenu | c | IllegalTokenText |
Interdit certains type/certaines classes | non retenu | c | IllegalType |
Interdit les affectations dans les expressions | na | c | InnerAssignment |
Limite le nombre de if-else imbriqués | 3 | c | NestedIfDepth |
Limite le nombre de try imbriqués | 3 | c | NestedTryDepth |
Chaque classe doit avoir un packages | na | c | PackageDeclaration |
Les paramètres ne doivent pas être affectés | na | c | ParameterAssignment |
Vérifie que l'on ne lance pas 2 fois la même exception, ni une exception unchecked, ni une exception qui soit une sous classe d'une exception déjà lancée | na | c | RedundantThrows |
Limite le nombre de return | 5 | c | ReturnCount |
Vérifie que l'on ne compare pas de strings avec == ou != | na | c | StringLiteralEquality |
Vérifie que lorsqu'on surcharge clone(), on appelle super.clone() | na | c | SuperClone |
Vérifie que lorsqu'on surchage finalize(), on appelle super.finalize() | na | c | SuperFinalize |
Vérifie l'imbrication de boucles for | 2 | p | JumbledIncrementer |
Certaines boucles for peuvent/doivent être remplacées par des while | na | p | ForLoopShouldBeWhileLoop |
Il vaut mieux convertir dans le return que dans une variable temporaire | na | p | UnnecessaryConversionTemporaryRule |
Vérifie que l'on ne fait pas de return dans un finally | non retenu | p | ReturnFromFinallyBlock |
Détecte les return; inutiles | na | p | UnnecessaryReturn |
Détecte les champs privés non utilisés | na | p | UnusedPrivateField |
Détecte les variables locales non utilisées | na | p | UnusedLocalVariable |
Détecte les méthodes privées non utilisées | na | p | UnusedPrivateMethod |
Détecte les paramètres non utilisés | na | p | UnusedFormalParameter |
Une classe qui n'a que des méthodes statiques devrait être un singleton | na en strict seulement | p | UnusedLocalVariable |
Utiliser l'interface (ex : Set) plutot que son implementation (ex HashSet) | na | p | LooseCouplingRule |
Il vaut mieux utiliser une variable locale que de réutiliser un paramètre | na | p | AvoidReassigningParametersRule |
Vérifie la taille du switch (longueur max du case) | 5 | p | SwitchDensity |
Le constructeur ne doit pas appeler de méthode surchargée | na | p | ConstructorCallsOverridableMethodRule |
Ne pas appeler de constructeur privé en dehors de la classe du constructeur | na | p | AccessorClassGenerationRule |
Un champ final constant doit être statique | na | p | FinalFieldCouldBeStatic |
Les connexions doivent toujours être fermées | strict seulement | p | CloseConnectionRule |
Si la même chaine est utilisée plusieurs fois, elle doit devenir une constante | 4 | p | AvoidDuplicateLiterals |
Ne pas instantier les strings avec un new | na | p | StringInstantiation |
Inutile d'utiliser toString() sur un string | na | p | StringToString |
Considère qu'un objet est trop couplé avec un autre si le nombre d'attributs, variables locales et types retournés est trop important | 20 | p | CouplingBetweenObjectsRule |
Trop d'imports indique que l'objet est trop couplé | 25 | p | ExcessiveImportsRule |
Une méthode ne doit pas lancer d'exception de type Exception | non retenu | p | SignatureDeclareThrowsException |
Il est plus propre de catcher chaque type d'exception (plutot que de catcher Exception et de faire des instanceof ensuite) | na | p | ExceptionTypeChecking |
Règles non retenues (redondantes) | |
---|---|
PMD | OverrideBothEqualsAndHashcodeRule, DoubleCheckedLockingRule, SimplifyBooleanReturnsRule, SimplifyBooleanExpressions, SwitchStmtsShouldHaveDefault, AvoidDeeplyNestedIfStmts, BooleanInstantiation, ProperCloneImplementationRule, AvoidCatchingThrowable, AssignmentInOperandRule |
Fonctionnalité | Valeur | Outils | Nom de la règle dans l'outil |
---|---|---|---|
Problèmes de design | |||
Une méthode non privée et non statique d'une classe qui peut être spécialisée doit être ou abstraite, ou finale, ou vide | na strict seulement | c | DesignForExtension |
Une classe qui n'a que des constructeurs privés doit être déclarée finale | na | c | FinalClass |
Une classe qui ne contient que des méthodes statiques ne doit pas avoir de constructeur public | na | c | HideUtilityClassConstructor |
Les interfaces ne doivent définir que des types (pas d'interface qui ne contient aucune methode, que des constantes) | na strict seulement | c | InterfaceIsType |
Seuls les attributs statiques ET finaux peuvent être publics | na | c | VisibilityModifier |
Vérifie que les classes d'exceptions n'ont que des champs finaux | na | c | MutableException |
Vérifie le nombre max de throw | non retenu | c | ThrowsCount |
Détecte quand il n'y a qu'un seul constructeur, public, vide et sans argument | non retenu | p | UnnecessaryConstructorRule |
Vérifie qu'on n'assigne pas null à des objets | na | p | NullAssignment |
Vérifie qu'il n'y a qu'un seul retour par fonction | non retenu | p | OnlyOneReturn |
Détecte les public static etc inutiles | na | p | UnusedModifier |
Oblige chaque classe à avoir un constructeur | non retenu | p | AtLeastOneConstructor |
Déclarer finalize() protected si on le surcharge | na | p | FinalizeShouldBeProtected |
Fonctionnalité | Valeur | Outils | Nom de la règle dans l'outil |
---|---|---|---|
Javadoc | |||
Chaque package doit avoir un fichier package.html | non retenu | c | PackageHtml |
Vérifie qu'il y a un javadoc pour la classe (ou l'interface) | na | c | JavadocType |
Les variables doivent être commentées) | strict seulement | c | JavadocVariable |
Les classes doivent être commentées (au minimum : @return, @param, @throws et @see) | na | c | JavadocMethod |
Valide le contenu des commentaires : phrase complète, tags HTML bien formés, … | non retenu | c | JavadocStyle |
Fonctionnalité | Valeur | Outils | Nom de la règle dans l'outil |
---|---|---|---|
Junit | |||
Il est nécessaire d' utiliser les assertions avec message | na | p | JUnitAssertionsShouldIncludeMessageRule |
suite() doit être publique ET statique | na | p | JUnitStaticSuite |
Vérifie que setUp et tearDown sont bien orthographiées | na | p | JUnitSpelling |
Fonctionnalité | Valeur | Outils | Nom de la règle dans l'outil |
---|---|---|---|
Divers | |||
Détecte le code dupliqué | non retenu | c | StrictDuplicateCode |
Vérifie que la déclaration d'un tableau est conforme au style retenu (Java-style: public static void main(String[] args) ou C-style: public static void main(String args[])) | style Java | c | ArrayTypeStyle |
Restreint certains tokens à l'intérieur de certains autres | non retenu | c | DescendantToken |
Vérifie que les paramètres sont finaux (sauf pour les interfaces) | non retenu | c | FinalParameters |
grep pour une expression régulière donnée | System\.out\.println, System\.exit | c | GenericIllegalRegexp |
Vérifie l'indentation | non retenu | c | Indentation |
Vérifie que tous les fichiers terminent bien par un retour a la ligne | non retenu | c | NewlineAtEndOfFile |
Cherche les commentaires TODO: | non retenu | c | TodoComment |
Vérifie que les fichiers properties de différents langages contiennent les mêmes clés | na | c | Translation |
Détecte les méthodes main non commentées | non retenu | c | UncommentedMain |
Les constantes de type long doivent commencer par L | non retenu | c | UpperEll |