Code smells.
Des signes de problèmes plus profonds dans le code. Chaque article renvoie aux refactorings qui permettent de les corriger.
Deux classes remplissent des fonctions identiques mais ont des noms de méthodes différents.
Si une sous-classe n'utilise qu'une partie des méthodes et propriétés héritées de ses parents, la hiérarchie est bancale. Les méthodes inutiles peuvent simplement rester inutilisées ou être redéfinies pour lever des exceptions.
Vous avez un opérateur switch complexe ou une suite d'instructions if.
Les champs temporaires reçoivent leurs valeurs (et sont donc nécessaires aux objets) uniquement dans certaines circonstances. En dehors de ces circonstances, ils sont vides.
Une méthode est truffée de commentaires explicatifs.
Une classe de données désigne une classe qui ne contient que des champs et des méthodes rudimentaires pour y accéder (getters et setters). Ce ne sont que de simples conteneurs de données utilisés par d'autres classes. Ces classes ne contiennent aucune fonctionnalité supplémentaire et ne peuvent pas opérer de manière autonome sur les données qu'elles possèdent.
Une variable, un paramètre, un champ, une méthode ou une classe n'est plus utilisé (généralement parce qu'il est obsolète).
Deux fragments de code se ressemblent presque à l'identique.
Comprendre et maintenir des classes coûte toujours du temps et de l'argent. Donc si une classe n'en fait pas assez pour mériter votre attention, elle doit être supprimée.
Il existe une classe, une méthode, un champ ou un paramètre inutilisé.
Il arrive que différentes parties du code contiennent des groupes de variables identiques (comme les paramètres de connexion à une base de données). Ces amas devraient être transformés en classes à part entière.
Une classe contient de nombreux champs, méthodes ou lignes de code.
Une méthode contient trop de lignes de code. En règle générale, toute méthode de plus de dix lignes devrait vous amener à vous poser des questions.
Plus de trois ou quatre paramètres pour une méthode.
Des types primitifs sont utilisés au lieu de petits objets pour des tâches simples (montants monétaires, plages de valeurs, chaînes spéciales pour les numéros de téléphone, etc.), des constantes servent à encoder des informations (comme USER_ADMIN_ROLE = 1 pour les utilisateurs disposant de droits d'administrateur) et des constantes de type chaîne servent de noms de champs dans des tableaux de données.
Vous vous retrouvez à devoir modifier de nombreuses méthodes sans rapport entre elles lorsque vous apportez des changements à une classe. Par exemple, lors de l'ajout d'un nouveau type de produit, vous devez modifier les méthodes de recherche, d'affichage et de commande des produits.
Chaque fois que vous créez une sous-classe pour une classe, vous vous retrouvez à devoir créer une sous-classe pour une autre classe.
La moindre modification vous oblige à apporter de nombreux petits changements à de nombreuses classes différentes.
Une méthode accède aux données d'un autre objet plus qu'à ses propres données.
Une classe utilise les champs et méthodes internes d'une autre classe.
Dans le code, vous voyez une série d'appels ressemblant à a.b().c().d().
Si une classe n'effectue qu'une seule action, déléguant le travail à une autre classe, pourquoi existe-t-elle ?