ConstructiCat Logo
CodeBust.

Catalog.

Chaque entrée dans les quatre volumes — techniques de refactoring, patrons de conception, odeurs de code et patrons d'architecture — regroupés par famille.

Vol 01

Refactoring

Restructuration contrôlée du code existant — préserve le comportement, améliore la conception.

Simplifying Method Calls
Design Patterns Mascot
Ajouter un paramètre

Problème : une méthode ne dispose pas de suffisamment de données pour effectuer certaines actions. Solution : créez un nouveau paramètre afin de transmettre les données nécessaires.

001
Design Patterns Mascot
Masquer la méthode

Problème : Une méthode n’est pas utilisée par d’autres classes ou n’est utilisée qu’au sein de sa propre hiérarchie de classes. Solution : Rendez la méthode privée ou protégée.

002
Code Smells Mascot
Introduire un objet paramètre

Problème : vos méthodes contiennent un groupe de paramètres qui se répète. Solution : remplacez ces paramètres par un objet.

003
Code Smells Mascot
Paramétrer la méthode

Problème : Plusieurs méthodes effectuent des actions similaires qui ne diffèrent que par leurs valeurs, nombres ou opérations internes. Solution : Combinez ces méthodes en utilisant un paramètre qui transmettra la valeur particulière nécessaire.

004
Code Smells Mascot
Préserver l'objet entier

Problème : vous récupérez plusieurs valeurs d'un objet, puis vous les passez comme paramètres à une méthode. Solution : essayez plutôt de passer l'objet entier.

005
Antipatterns Mascot
Supprimer un paramètre

Problème : un paramètre n’est pas utilisé dans le corps d’une méthode. Solution : supprimez le paramètre inutilisé.

006
Antipatterns Mascot
Supprimer la méthode d'affectation

Problème : la valeur d'un champ ne doit être définie qu'au moment de sa création et ne doit jamais changer par la suite. Solution : supprimez donc les méthodes qui modifient la valeur du champ.

007
Architectural Patterns Mascot
Renommer la méthode

Problème : Le nom d’une méthode n’explique pas ce que fait la méthode. Solution : Renommez la méthode.

008
Antipatterns Mascot
Remplacer un constructeur par une méthode de fabrique

Problème : vous avez un constructeur complexe qui fait autre chose que simplement affecter les valeurs des paramètres aux champs de l'objet. Solution : créez une méthode de fabrique et utilisez-la pour remplacer les appels au constructeur.

009
Code Smells Mascot
Remplacer un code d'erreur par une exception

Problème : une méthode renvoie une valeur spéciale qui indique une erreur ? Solution : levez plutôt une exception.

010
Code Smells Mascot
Remplacer une exception par un test

Problème : Vous levez une exception là où un simple test ferait l'affaire ? Solution : Remplacez l'exception par un test conditionnel.

011
Antipatterns Mascot
Remplacer un paramètre par des méthodes explicites

Problème : Une méthode est divisée en parties, chacune étant exécutée en fonction de la valeur d'un paramètre. Solution : Extrayez les différentes parties de la méthode dans leurs propres méthodes et appelez-les à la place de la méthode d'origine.

012
Design Patterns Mascot
Remplacer un paramètre par un appel de méthode

Problème : appeler une méthode de requête et passer son résultat comme paramètre d'une autre méthode, alors que cette méthode pourrait appeler directement la requête. Solution : au lieu de passer la valeur via un paramètre, essayez de placer un appel de requête à l'intérieur du corps de la méthode.

013
Code Smells Mascot
Séparer la requête du modificateur

Problème : avez-vous une méthode qui renvoie une valeur mais modifie aussi quelque chose à l'intérieur d'un objet ? Solution : scindez la méthode en deux méthodes distinctes. Comme on peut s'y attendre, l'une doit renvoyer la valeur et l'autre modifier l'objet.

014
Organizing Data
Design Patterns Mascot
Transformer une association bidirectionnelle en association unidirectionnelle

Problème : vous avez une association bidirectionnelle entre des classes, mais l'une des classes n'utilise pas les fonctionnalités de l'autre. Solution : supprimez l'association inutilisée.

015
Antipatterns Mascot
Remplacer une référence par une valeur

Problème : vous avez un objet référence trop petit et trop rarement modifié pour justifier la gestion de son cycle de vie. Solution : transformez-le en objet valeur.

016
Design Patterns Mascot
Transformer une association unidirectionnelle en bidirectionnelle

Problème : Vous avez deux classes qui ont chacune besoin d'utiliser les fonctionnalités de l'autre, mais l'association entre elles n'est qu'unidirectionnelle. Solution : Ajoutez l'association manquante à la classe qui en a besoin.

017
Antipatterns Mascot
Transformer une valeur en référence

Problème : vous avez de nombreuses instances identiques d'une même classe que vous devez remplacer par un seul objet. Solution : convertissez les objets identiques en un unique objet de référence.

018
Antipatterns Mascot
Dupliquer les données observées

Problème : des données métier sont-elles stockées dans des classes responsables de l’interface graphique ? Solution : il est alors judicieux de séparer les données dans des classes distinctes, en assurant la liaison et la synchronisation entre la classe métier et l’interface graphique.

019
Code Smells Mascot
Encapsuler une collection

Problème : Une classe contient un champ de type collection ainsi qu'un simple getter et un simple setter pour manipuler la collection. Solution : Rendez la valeur renvoyée par le getter en lecture seule et créez des méthodes pour ajouter/supprimer des éléments de la collection.

020
Architectural Patterns Mascot
Encapsuler un champ

Problème : vous avez un champ public. Solution : rendez le champ privé et créez des méthodes d'accès pour celui-ci.

021
Code Smells Mascot
Remplacer un tableau par un objet

Problème : Vous avez un tableau qui contient différents types de données. Solution : Remplacez le tableau par un objet qui aura des champs distincts pour chaque élément.

022
Architectural Patterns Mascot
Remplacer une donnée par un objet

Problème : une classe (ou un groupe de classes) contient un champ de données. Ce champ possède son propre comportement et ses propres données associées. Solution : créez une nouvelle classe, placez-y l'ancien champ et son comportement, et stockez l'objet de cette classe dans la classe d'origine.

023
Code Smells Mascot
Remplacer un nombre magique par une constante symbolique

Problème : votre code utilise un nombre qui a une certaine signification. Solution : remplacez ce nombre par une constante portant un nom lisible qui explique la signification du nombre.

024
Code Smells Mascot
Remplacer une sous-classe par des champs

Problème : vous avez des sous-classes qui ne diffèrent que par leurs méthodes (renvoyant des constantes). Solution : remplacez ces méthodes par des champs dans la classe parente et supprimez les sous-classes.

025
Code Smells Mascot
Remplacer un code de type par une classe

Problème : Une classe possède un champ qui contient un code de type. Les valeurs de ce type ne sont pas utilisées dans des conditions d'opérateur et n'affectent pas le comportement du programme. Solution : Créez une nouvelle classe et utilisez ses objets à la place des valeurs du code de type.

026
Architectural Patterns Mascot
Remplacer le code de type par State/Strategy

Problème : vous avez un type codé qui influe sur le comportement mais vous ne pouvez pas recourir à des sous-classes pour vous en débarrasser. Solution : remplacez le code de type par un objet d'état. S'il faut remplacer la valeur d'un champ contenant le code de type, un autre objet d'état est « branché » à la place.

027
Design Patterns Mascot
Remplacer un code type par des sous-classes

Problème : Vous avez un type codé qui affecte directement le comportement du programme (les valeurs de ce champ déclenchent différents codes dans des conditions). Solution : Créez des sous-classes pour chaque valeur du type codé. Puis extrayez les comportements pertinents de la classe d'origine vers ces sous-classes. Remplacez le code de contrôle de flux par du polymorphisme.

028
Code Smells Mascot
Auto-encapsuler un champ

Problème : vous accédez directement aux champs privés à l'intérieur d'une classe. Solution : créez un getter et un setter pour le champ, et utilisez-les exclusivement pour accéder au champ.

029
Dealing with Generalization
Design Patterns Mascot
Réduire la hiérarchie

Problème : vous avez une hiérarchie de classes dans laquelle une sous-classe est pratiquement identique à sa superclasse. Solution : fusionnez la sous-classe et la superclasse.

030
Architectural Patterns Mascot
Extraire l'interface

Problème : plusieurs clients utilisent la même partie de l'interface d'une classe. Autre cas : une partie de l'interface est identique dans deux classes. Solution : déplacez cette portion identique dans sa propre interface.

031
Architectural Patterns Mascot
Extraire une sous-classe

Problème : une classe possède des fonctionnalités qui ne sont utilisées que dans certains cas. Solution : créez une sous-classe et utilisez-la dans ces cas.

032
Code Smells Mascot
Extraire une superclasse

Problème : Vous avez deux classes qui partagent des champs et des méthodes communs. Solution : Créez une superclasse commune pour elles et déplacez-y tous les champs et méthodes identiques.

033
Design Patterns Mascot
Constituer une méthode patron

Problème : Vos sous-classes implémentent des algorithmes qui contiennent des étapes similaires dans le même ordre. Solution : Déplacez la structure de l'algorithme et les étapes identiques vers une superclasse, et laissez l'implémentation des étapes différentes dans les sous-classes.

034
Refactoring Mascot
Remonter le corps du constructeur

Problème : vos sous-classes ont des constructeurs dont le code est en grande partie identique. Solution : créez un constructeur dans la superclasse et déplacez-y le code commun aux sous-classes. Appelez le constructeur de la superclasse dans les constructeurs des sous-classes.

035
Architectural Patterns Mascot
Remonter le champ

Problème : deux classes possèdent le même champ. Solution : supprimez le champ des sous-classes et déplacez-le vers la super-classe.

036
Design Patterns Mascot
Remonter une méthode

Problème : Vos sous-classes ont des méthodes qui effectuent un travail similaire. Solution : Rendez les méthodes identiques, puis déplacez-les vers la superclasse appropriée.

037
Code Smells Mascot
Descendre le champ

Problème : un champ n'est-il utilisé que dans quelques sous-classes ? Solution : déplacez le champ vers ces sous-classes.

038
Refactoring Mascot
Descendre la méthode

Problème : Un comportement implémenté dans une superclasse n’est-il utilisé que par une seule (ou quelques) sous-classe(s) ? Solution : Déplacez ce comportement vers les sous-classes.

039
Design Patterns Mascot
Remplacer la délégation par l’héritage

Problème : une classe contient de nombreuses méthodes simples qui délèguent à toutes les méthodes d’une autre classe. Solution : faites de la classe un héritier du délégué, ce qui rend les méthodes de délégation inutiles.

040
Code Smells Mascot
Remplacer l'héritage par la délégation

Problème : vous avez une sous-classe qui n'utilise qu'une partie des méthodes de sa superclasse (ou il est impossible d'hériter des données de la superclasse). Solution : créez un champ, placez-y un objet de la superclasse, déléguez les méthodes à cet objet et supprimez l'héritage.

041
Simplifying Conditional Expressions
Antipatterns Mascot
Regrouper une expression conditionnelle

Problème : vous avez plusieurs conditions qui mènent au même résultat ou à la même action. Solution : regroupez toutes ces conditions en une seule expression.

042
Antipatterns Mascot
Regrouper les fragments conditionnels dupliqués

Problème : un code identique se retrouve dans toutes les branches d’une condition. Solution : déplacez le code en dehors de la condition.

043
Code Smells Mascot
Décomposer une condition

Problème : Vous avez une condition complexe (if-then/else ou switch). Solution : Décomposez les parties compliquées de la condition en méthodes distinctes : la condition, le then et le else.

044
Design Patterns Mascot
Introduire une assertion

Problème : pour qu'une portion de code fonctionne correctement, certaines conditions ou valeurs doivent être vraies. Solution : remplacez ces hypothèses par des vérifications d'assertion explicites.

045
Antipatterns Mascot
Introduire un objet Null

Problème : comme certaines méthodes renvoient null au lieu d’objets réels, votre code comporte de nombreuses vérifications de null. Solution : au lieu de null, renvoyez un objet Null qui présente le comportement par défaut.

046
Architectural Patterns Mascot
Supprimer le drapeau de contrôle

Problème : vous avez une variable booléenne qui sert de drapeau de contrôle pour plusieurs expressions booléennes. Solution : au lieu de la variable, utilisez break, continue et return.

047
Design Patterns Mascot
Remplacer le conditionnel par du polymorphisme

Problème : vous avez une instruction conditionnelle qui exécute diverses actions selon le type ou les propriétés d’un objet. Solution : créez des sous-classes correspondant aux branches de la conditionnelle. Dans chacune, créez une méthode commune et déplacez-y le code de la branche correspondante de la conditionnelle. Remplacez ensuite la conditionnelle par l’appel de la méthode appropriée. Le résultat est que la bonne implémentation sera obtenue par polymorphisme en fonction de la classe de l’objet.

048
Design Patterns Mascot
Remplacer les conditions imbriquées par des clauses de garde

Problème : Vous avez un groupe de conditions imbriquées et il est difficile de déterminer le flux normal d'exécution du code. Solution : Isolez toutes les vérifications spéciales et les cas limites dans des clauses distinctes et placez-les avant les vérifications principales. Idéalement, vous devriez obtenir une liste « plate » de conditions, les unes après les autres.

049
Moving Features between Objects
Antipatterns Mascot
Extraire une classe

Problème : lorsqu’une seule classe fait le travail de deux, cela devient malcommode. Solution : créez plutôt une nouvelle classe et placez-y les champs et les méthodes responsables de la fonctionnalité concernée.

050
Antipatterns Mascot
Cacher le délégué

Problème : le client obtient l'objet B à partir d'un champ ou d'une méthode de l'objet A. Le client appelle ensuite une méthode de l'objet B. Solution : créez une nouvelle méthode dans la classe A qui délègue l'appel à l'objet B. Désormais, le client ne connaît plus la classe B et n'en dépend plus.

051
Code Smells Mascot
Intégrer la classe

Problème : Une classe ne fait presque rien et n’est responsable de rien, et aucune responsabilité supplémentaire n’est prévue pour elle. Solution : Déplacez toutes les fonctionnalités de la classe vers une autre.

052
Architectural Patterns Mascot
Introduire une méthode étrangère

Problème : une classe utilitaire ne contient pas la méthode dont vous avez besoin et vous ne pouvez pas l'y ajouter. Solution : ajoutez la méthode à une classe cliente et passez-lui un objet de la classe utilitaire en argument.

053
Refactoring Mascot
Introduire une extension locale

Problème : une classe utilitaire ne contient pas certaines méthodes dont vous avez besoin. Mais vous ne pouvez pas ajouter ces méthodes à la classe. Solution : créez une nouvelle classe contenant ces méthodes et faites-en soit une classe fille, soit un wrapper de la classe utilitaire.

054
Code Smells Mascot
Déplacer un champ

Problème : un champ est davantage utilisé dans une autre classe que dans sa propre classe. Solution : créez un champ dans une nouvelle classe et redirigez vers lui tous les utilisateurs de l’ancien champ.

055
Code Smells Mascot
Déplacer une méthode

Problème : une méthode est davantage utilisée dans une autre classe que dans la sienne. Solution : créez une nouvelle méthode dans la classe qui utilise le plus la méthode, puis déplacez-y le code de l'ancienne méthode. Transformez le code de la méthode d'origine en une référence à la nouvelle méthode dans l'autre classe, ou bien supprimez-la entièrement.

056
Refactoring Mascot
Supprimer l’intermédiaire

Problème : Une classe possède trop de méthodes qui se contentent de déléguer à d’autres objets. Solution : Supprimez ces méthodes et obligez le client à appeler directement les méthodes finales.

057
Composing Methods
Refactoring Mascot
Extraire une méthode

Problème : vous avez un fragment de code qui peut être regroupé. Solution : déplacez ce code dans une nouvelle méthode (ou fonction) distincte et remplacez l'ancien code par un appel à la méthode.

058
Antipatterns Mascot
Extraire une variable

Problème : vous avez une expression difficile à comprendre. Solution : placez le résultat de l'expression ou de ses parties dans des variables distinctes qui se passent d'explication.

059
Architectural Patterns Mascot
Intégrer la méthode

Problème : lorsque le corps d'une méthode est plus parlant que la méthode elle-même, employez cette technique. Solution : remplacez les appels à la méthode par son contenu, puis supprimez la méthode.

060
Code Smells Mascot
Intégrer une variable temporaire

Problème : Vous avez une variable temporaire à laquelle est affecté le résultat d’une simple expression, et rien de plus. Solution : Remplacez les références à cette variable par l’expression elle-même.

061
Code Smells Mascot
Supprimer les affectations aux paramètres

Problème : une valeur est affectée à un paramètre à l'intérieur du corps d'une méthode. Solution : utilisez une variable locale au lieu d'un paramètre.

062
Code Smells Mascot
Remplacer une méthode par un objet-méthode

Problème : Vous avez une longue méthode dans laquelle les variables locales sont si entremêlées que vous ne pouvez pas appliquer Extraire une méthode. Solution : Transformez la méthode en une classe distincte afin que les variables locales deviennent des champs de la classe. Vous pourrez alors scinder la méthode en plusieurs méthodes au sein de la même classe.

063
Antipatterns Mascot
Remplacer une variable temporaire par une requête

Problème : vous placez le résultat d'une expression dans une variable locale pour l'utiliser plus tard dans votre code. Solution : déplacez l'expression entière dans une méthode distincte et renvoyez-en le résultat. Interrogez la méthode au lieu d'utiliser une variable. Intégrez la nouvelle méthode dans d'autres méthodes si nécessaire.

064
Antipatterns Mascot
Fractionner une variable temporaire

Problème : vous avez une variable locale utilisée pour stocker différentes valeurs intermédiaires à l'intérieur d'une méthode (à l'exception des variables de boucle). Solution : utilisez des variables différentes pour des valeurs différentes. Chaque variable ne doit être responsable que d'une seule chose en particulier.

065
Design Patterns Mascot
Remplacer l’algorithme

Problème : vous souhaitez remplacer un algorithme existant par un nouveau ? Solution : remplacez le corps de la méthode qui implémente l’algorithme par un nouvel algorithme.

066
Vol 02

Patrons de conception

Solutions typiques aux problèmes courants de conception logicielle, organisées par intention.

Patrons de création
Patrons structurels
Patrons comportementaux
Architectural Patterns Mascot
Chaîne de responsabilité

Chaîne de responsabilité est un patron de conception comportemental qui permet de faire circuler des demandes dans une chaîne de handlers. Lorsqu'un handler reçoit une demande, il décide de la traiter ou de l’envoyer au handler suivant de la chaîne.

013
Code Smells Mascot
Commande

Commande est un patron de conception comportemental qui prend une action à effectuer et la transforme en un objet autonome qui contient tous les détails de cette action. Cette transformation permet de paramétrer des méthodes avec différentes actions, planifier leur exécution, les mettre dans une file d’attente ou d’annuler des opérations effectuées.

014
Antipatterns Mascot
Itérateur

Itérateur est un patron de conception comportemental qui permet de parcourir les éléments d’une collection sans révéler sa représentation interne (liste, pile, arbre, etc.).

015
Design Patterns Mascot
Médiateur

Médiateur est un patron de conception comportemental qui diminue les dépendances chaotiques entre les objets. Il restreint les communications directes entre les objets et les force à collaborer uniquement via un objet médiateur.

016
Refactoring Mascot
Mémento

Mémento est un patron de conception comportemental qui permet de sauvegarder et de rétablir l'état précédent d’un objet sans révéler les détails de son implémentation.

017
Antipatterns Mascot
Observateur

L’Observateur est un patron de conception comportemental qui permet de mettre en place un mécanisme de souscription pour envoyer des notifications à plusieurs objets, au sujet d’événements concernant les objets qu’ils observent.

018
Refactoring Mascot
État

État est un patron de conception comportemental qui permet de modifier le comportement d’un objet lorsque son état interne change. L’objet donne l’impression qu’il change de classe.

019
Code Smells Mascot
Stratégie

Stratégie est un patron de conception comportemental qui permet de définir une famille d’algorithmes, de les mettre dans des classes séparées et de rendre leurs objets interchangeables.

020
Architectural Patterns Mascot
Patron de méthode

Patron de Méthode est un patron de conception comportemental qui permet de mettre le squelette d’un algorithme dans la classe mère, mais laisse les sous-classes redéfinir certaines étapes de l’algorithme sans changer sa structure.

021
Refactoring Mascot
Visiteur

Visiteur est un patron de conception comportemental qui vous permet de séparer les algorithmes et les objets sur lesquels ils opèrent.

022
Vol 03

Odeurs de code

Indicateurs de problèmes plus profonds — et les refactorings qui les traitent.

Object-Orientation Abusers
Dispensables
Bloaters
Change Preventers
Couplers
Other Smells
Vol 04

Patrons d'architecture

Patrons et méthodologies au niveau système — DDD, CQRS, TDD et Spec-Driven Development.