8 mars 2018 11:20:56 seb leridon avatar

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éValeurOutilsNom de la règle dans l'outil
Règles de nommage
Variables locales, finales^[A-Z]*$ - strict (TODO) : strName, nName ou lName cLocalFinalVariableName
Variables locales, non finales- attention, paramètres de catch inclus^[a-z][a-zA-Z0-9]*$ - strict (TODO) : strName, nName ou lName cLocalVariableName
Attributs non statiques^_[a-z](_?[a-zA-Z0-9])*$ - strict (TODO) : strName, nName ou lName cMemberName
Paramètres^[a-z][a-zA-Z0-9]*$ - strict (TODO) : strName, nName ou lName cParameterName
Constantes (champs statiques et finaux)^[A-Z0-9]*$cConstantName
Variables statiques, non finales^_[a-z](_?[a-zA-Z0-9])*$ - strict (TODO) : strName, nName ou lName cStaticVariableName
Méthode[a-z][a-zA-Z0-9]*$cMethodName
Classe (et interface)^[A-Z][a-zA-Z0-9]*$cTypeName
Package^fr\.paris\.[a-z\.]*$cPackageName
Classes abstraitesstrict seulement : mot clé abstractcAbstractClassName
Longueur max d'une variable80 - strict 50pLongVariable
Longueur min du nom d'une méthode3pShortMethodNameRule
Longueur min du nom d'une variablenon retenupShortVariable
Règles non retenues (redondantes)
PMDVariableNamingConventionRule, MethodNamingConvention,

ClassNamingConventionRule, AbstractNamingRule|

FonctionnalitéValeurOutilsNom 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}cheader
L'en-tête doit correspondre à une expression régulièrenon retenucRegexpHeader
FonctionnalitéValeurOutilsNom de la règle dans l'outil
Imports
Imports inutiles : dupliqué, java.lang.* ou du même packagenacRedondantImports
Idem précédent + import inutiliséenacUnusedImports
Les imports ne doivent pas utiliser *nacAvoidStarImport
Vérifie l'ordre des imports (java, puis javax, …)non retenucImportOrder
Rejette les packages illegaux (par défaut, slt ceux de sun.*)nacIllegalImport
Règles non retenues (redondantes)
PMDImportFromSamePackage, UnusedImports, DontimportJavaLang,

DuplicateImport|

FonctionnalitéValeurOutilsNom de la règle dans l'outil
Non respect de longueur
Longueur max d'une méthodepar défaut : 100 lignes, en comptant les commentaires et les lignes videspExcessiveMethodLength
Longueur max d'une classepar défaut : 1000 lignes, en comptant les commentaires et les lignes videspExcessiveClassLength
Nombre max de parametrespar défaut : 7cParameterNumber
complexité : nombre de points de décision (if, while, do, for, ?:, catch, switch, , OR et case) + 1 pour la méthode10 - strict seulementpCyclomaticComplexityRule
Nombre max de commandes executablesnon retenucExecutableStatementCount
Longueur max d'un fichiernon retenucFileLenght
Longueur max d'une lignenon retenucLineLength
Longueur max pour une classe anonyme internenon retenucAnonInnerLenght
Nombre de méthodes et d'attributs publics45pExcessivePublicCount
Règles non retenues (redondantes)
PMDExcessiveParameterList
CheckstyleMethodLenght, CyclomaticComplexity
FonctionnalitéValeurOutilsNom 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 retenucEmptyForIteratorPad
Seuls = et == peuvent (doivent) être suivis par un espacetoken=ASSIGN, EQUALcWhitespaceAround
Les parenthèses doivent avoir des espacesspacecParenPad
Vérifie qu'il n'y a pas d'espace après certains operateursnon retenucNoWhiteSpaceAfter
Vérifie qu'il n'y a pas d'espace avant certains operateursnon retenucNoWhiteSpaceBefore
Vérifie la façon de gérer les longues lignes après les opérateursnon retenucOperatorWrap
Vérifie les espaces pour le cas particulier des castnon retenucTypeCastParenPad
Vérifie qu'il n'y a pas de tab dans le code sourcenon retenucTabCharacter
Vérifie que les éléments listés sont bien suivis par un espacenon retenucWhiteSpaceAfter
FonctionnalitéValeurOutilsNom de la règle dans l'outil
Qualificatifs
L'ordre des qualificatifs est : public - protected - private - abstract - static - final - transient - volatile - synchronized - native - strictfpnacModifierOrder
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 finalesnacRedundantModifier
FonctionnalitéValeurOutilsNom 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)nacEmptyBlock
Les blocs switch sont non videsnapEmptySwitchStatements
Les blocs synchronized sont non videsnapEmptySynchronizedBlock
Vérifie que les accolades ouvrantes ( { ) vont à la lignenacLeftCurly
Vérifie que les blocs de code sont bien entourés d'accolades {}nacNeedBraces
Vérifie que les accolades fermantes ( } ) vont à la lignenacRightCurly
Vérifie qu'il ne reste pas de bloc {} qui ne servent plus dans le code (laissés après un debuggage)nacAvoidNestedBlocks
Règles non retenues (redondantes)
PMDEmptyCatchBlock, EmptyIfStmt, EmptyWhileStmt, EmptyTryBlock, EmptyFinallyBlock, IfStmtsMustUseBraces, WhileLoopsMustUseBracesRule, IfElseStmtsMustUseBracesRule, ForLoopsMustUseBracesRule
FonctionnalitéValeurOutilsNom de la règle dans l'outil
Problèmes de code
Eviter les syntaxes de type ?: non retenucAvoidInlineConditionals
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 (;)nacEmptyStatement
Si on surcharge equals [resp hashcode] alors on doit surcharger hashcode [resp equals]nacEqualsHashCode
Une variable ou un paramètre local ne doit pas risquer d'écraser un attributnacHiddenField
Simplifier les retours de booleens - ex : on doit avoir return (! isValid()) au lieu de if (isValid()) return false; else return true;nacSimplifyBooleanReturn
Inutile de tester avec == true ou !false …nacSimplifyBooleanExpression
Vérifie que l'on n'a pas de nombre qui ne soit pas une constante (à part -, 0, 1, et 2) strict seulementcMagicNumber
Vérifie que les switch on bien un default casenacMissingSwitchDefault
Vérifie qu'il ne reste pas une virgule après le dernier élément en initialisant un arraynacArrayTrailingComma
Vérifie que si on définit un equals on a surchargé aussi equals(java.lang.Object)nacCovariantEquals
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.nacDeclarationOrder
Vérifie que l'on n'initialise pas des objets inutilement (comme int i=0; ou object o=null;)nacExplicitInitialization
Les paramètres et variables qui ne sont jamais modifiés doivent être déclarés finalnon retenucFinalLocalVariable
Vérifie que l'on ne catche pas de mauvaise exception (java.lang.Exception , java.lang.Error ou java.lang.RuntimeException )non retenucFinalLocalVariable
Vérifie que l'on utilise bien des factory quand il le fautnon retenucIllegalInstantiation
Interdit certains token (comme ++)non retenucIllegalToken
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 retenucIllegalTokenText
Interdit certains type/certaines classesnon retenucIllegalType
Interdit les affectations dans les expressionsnacInnerAssignment
Limite le nombre de if-else imbriqués3cNestedIfDepth
Limite le nombre de try imbriqués3cNestedTryDepth
Chaque classe doit avoir un packagesnacPackageDeclaration
Les paramètres ne doivent pas être affectésnacParameterAssignment
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éenacRedundantThrows
Limite le nombre de return5cReturnCount
Vérifie que l'on ne compare pas de strings avec == ou !=nacStringLiteralEquality
Vérifie que lorsqu'on surcharge clone(), on appelle super.clone()nacSuperClone
Vérifie que lorsqu'on surchage finalize(), on appelle super.finalize()nacSuperFinalize
Vérifie l'imbrication de boucles for2pJumbledIncrementer
Certaines boucles for peuvent/doivent être remplacées par des whilenapForLoopShouldBeWhileLoop
Il vaut mieux convertir dans le return que dans une variable temporairenapUnnecessaryConversionTemporaryRule
Vérifie que l'on ne fait pas de return dans un finallynon retenupReturnFromFinallyBlock
Détecte les return; inutilesnapUnnecessaryReturn
Détecte les champs privés non utilisésnapUnusedPrivateField
Détecte les variables locales non utiliséesnapUnusedLocalVariable
Détecte les méthodes privées non utiliséesnapUnusedPrivateMethod
Détecte les paramètres non utilisésnapUnusedFormalParameter
Une classe qui n'a que des méthodes statiques devrait être un singletonna en strict seulementpUnusedLocalVariable
Utiliser l'interface (ex : Set) plutot que son implementation (ex HashSet)napLooseCouplingRule
Il vaut mieux utiliser une variable locale que de réutiliser un paramètrenapAvoidReassigningParametersRule
Vérifie la taille du switch (longueur max du case)5pSwitchDensity
Le constructeur ne doit pas appeler de méthode surchargéenapConstructorCallsOverridableMethodRule
Ne pas appeler de constructeur privé en dehors de la classe du constructeurnapAccessorClassGenerationRule
Un champ final constant doit être statiquenapFinalFieldCouldBeStatic
Les connexions doivent toujours être ferméesstrict seulementpCloseConnectionRule
Si la même chaine est utilisée plusieurs fois, elle doit devenir une constante4pAvoidDuplicateLiterals
Ne pas instantier les strings avec un newnapStringInstantiation
Inutile d'utiliser toString() sur un stringnapStringToString
Considère qu'un objet est trop couplé avec un autre si le nombre d'attributs, variables locales et types retournés est trop important20pCouplingBetweenObjectsRule
Trop d'imports indique que l'objet est trop couplé25pExcessiveImportsRule
Une méthode ne doit pas lancer d'exception de type Exceptionnon retenupSignatureDeclareThrowsException
Il est plus propre de catcher chaque type d'exception (plutot que de catcher Exception et de faire des instanceof ensuite)napExceptionTypeChecking
Règles non retenues (redondantes)
PMDOverrideBothEqualsAndHashcodeRule, DoubleCheckedLockingRule, SimplifyBooleanReturnsRule, SimplifyBooleanExpressions, SwitchStmtsShouldHaveDefault, AvoidDeeplyNestedIfStmts, BooleanInstantiation, ProperCloneImplementationRule, AvoidCatchingThrowable, AssignmentInOperandRule
FonctionnalitéValeurOutilsNom 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 videna strict seulementcDesignForExtension
Une classe qui n'a que des constructeurs privés doit être déclarée finalenacFinalClass
Une classe qui ne contient que des méthodes statiques ne doit pas avoir de constructeur publicnacHideUtilityClassConstructor
Les interfaces ne doivent définir que des types (pas d'interface qui ne contient aucune methode, que des constantes)na strict seulementcInterfaceIsType
Seuls les attributs statiques ET finaux peuvent être publicsnacVisibilityModifier
Vérifie que les classes d'exceptions n'ont que des champs finauxnacMutableException
Vérifie le nombre max de thrownon retenucThrowsCount
Détecte quand il n'y a qu'un seul constructeur, public, vide et sans argumentnon retenupUnnecessaryConstructorRule
Vérifie qu'on n'assigne pas null à des objetsnapNullAssignment
Vérifie qu'il n'y a qu'un seul retour par fonctionnon retenupOnlyOneReturn
Détecte les public static etc inutilesnapUnusedModifier
Oblige chaque classe à avoir un constructeurnon retenupAtLeastOneConstructor
Déclarer finalize() protected si on le surchargenapFinalizeShouldBeProtected
FonctionnalitéValeurOutilsNom de la règle dans l'outil
Javadoc
Chaque package doit avoir un fichier package.htmlnon retenucPackageHtml
Vérifie qu'il y a un javadoc pour la classe (ou l'interface)nacJavadocType
Les variables doivent être commentées)strict seulementcJavadocVariable
Les classes doivent être commentées (au minimum : @return, @param, @throws et @see)nacJavadocMethod
Valide le contenu des commentaires : phrase complète, tags HTML bien formés, …non retenucJavadocStyle
FonctionnalitéValeurOutilsNom de la règle dans l'outil
Junit
Il est nécessaire d' utiliser les assertions avec messagenapJUnitAssertionsShouldIncludeMessageRule
suite() doit être publique ET statiquenapJUnitStaticSuite
Vérifie que setUp et tearDown sont bien orthographiéesnapJUnitSpelling
FonctionnalitéValeurOutilsNom de la règle dans l'outil
Divers
Détecte le code dupliquénon retenucStrictDuplicateCode
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 JavacArrayTypeStyle
Restreint certains tokens à l'intérieur de certains autresnon retenucDescendantToken
Vérifie que les paramètres sont finaux (sauf pour les interfaces)non retenucFinalParameters
grep pour une expression régulière donnéeSystem\.out\.println, System\.exitcGenericIllegalRegexp
Vérifie l'indentationnon retenucIndentation
Vérifie que tous les fichiers terminent bien par un retour a la lignenon retenucNewlineAtEndOfFile
Cherche les commentaires TODO: non retenucTodoComment
Vérifie que les fichiers properties de différents langages contiennent les mêmes clésnacTranslation
Détecte les méthodes main non commentéesnon retenucUncommentedMain
Les constantes de type long doivent commencer par Lnon retenucUpperEll