AccueilđŸ‡«đŸ‡·Chercher

Code smell

En gĂ©nie logiciel, les code smells ou mauvaises odeurs peuvent ĂȘtre de mauvaises pratiques de conception logicielle qui conduisent Ă  l’apparition de dĂ©fauts[1] - [2]. Ces dĂ©fauts sont souvent issus de mauvais choix d’implantation ou de conception et conduisent Ă  une complexification du code source et de la maintenance et Ă©volutivitĂ© de celui‐ci. A la diffĂ©rence d'un AntiPattern, les code smells ne sont pas forcĂ©ment des erreurs, c'est-Ă -dire qu'ils peuvent persister sans perspective d'Ă©volution dans un logiciel. Afin de corriger un code smell, il est nĂ©cessaire de procĂ©der Ă  un rĂ©usinage du code source, c’est‐à‐dire modifier le code sans en altĂ©rer son comportement.


Exemples de code smells

À la maniĂšre des patrons de conceptions, de nombreux exemples de code smells ont Ă©tĂ© rĂ©pertoriĂ©s et dĂ©crits dans la littĂ©rature scientifique.

Martin Fowler en a notamment répertorié des dizaines ainsi que la refactorisation à adopter[3].

Duplicated Code[4]

L’anti‐patron Duplicated Code est un exemple de code smell classique. Il s’agit de trouver la mĂȘme portion de code Ă  plusieurs endroits d’une application.

La duplication de code peut se situer dans une mĂȘme classe, au sein de mĂ©thodes diffĂ©rentes, ou dans des classes diffĂ©rentes.

Feature Envy[5]

L’anti‐patron Feature Envy dĂ©crit une mĂ©thode qui fait de nombreux appels Ă  des mĂ©thodes d’autres classes. Le plus souvent ces appels sont faits Ă  des getters (ou accesseurs) par besoin de donnĂ©es.

C’est le signe que la mĂ©thode se trouve probablement dans la mauvaise classe.

BLOB[6]

Aussi connu sous le nom de God Class ou Winnebago, l’anti‐patron Blob est une classe ayant trop de responsabilitĂ©s au sein du logiciel.

Cela se manifeste par un trop grand nombre d’attributs et de dĂ©pendances aux classes data, ainsi qu’un nombre d’appels de ces mĂ©thodes par les classes extĂ©rieures trĂšs important.

Long Parameter List[7]

L’anti‐patron Long Parameter List est une erreur hĂ©ritĂ©e des dĂ©buts de la programmation, avant l’arrivĂ©e de l’orientĂ© objet. Chaque fonction nĂ©cessitait toute une sĂ©rie de paramĂštres, qu’il Ă©tait prĂ©fĂ©rable d’utiliser Ă  la place des variables globales. Mais aujourd’hui et depuis l’arrivĂ©e des langages orientĂ©s objets, la situation a Ă©voluĂ© et le surnombre de paramĂštres ne fait que nuire Ă  la lisibilitĂ© et la comprĂ©hension. Cela complique Ă©galement l’utilisation et la refactorisation du code.

Long Method[7]

L’implantation de longues mĂ©thodes est un problĂšme rĂ©current chez les dĂ©veloppeurs dĂ©butants. Il s’agit de rendre les mĂ©thodes inutilement longues et complexes quand il est possible de les dĂ©composer.

Cette dĂ©composition en plus d’amĂ©liorer la lisibilitĂ© et la comprĂ©hension d’un code, permet de simplifier la refactorisation par la suite. On la caractĂ©rise souvent par l’utilisation d’un trop grand nombre de paramĂštres internes, de boucles ou conditions ainsi que de valeurs de retour.

Large Class[4]

L’anti‐patron Large Class dĂ©crit simplement le cas d’une classe possĂ©dant beaucoup de variables. Ce genre de situation induit parfois une utilisation sĂ©parĂ©e des variables et conduit le plus souvent vers de la duplication de code.

DĂ©tection et correction de code smells

Moyens de détection

Pour chaque code smell, il existe des moyens de dĂ©tection plus ou moins mathĂ©matiques ainsi que des pratiques permettant de corriger ou mĂȘme Ă©viter l’erreur. Pour chacun des six code smells prĂ©cĂ©dents, voici la mĂ©thodologie de correction ainsi que le moyen de dĂ©tection Ă  adopter.

Duplicated Code

Pour dĂ©tecter le smell Duplicated Code (code dupliquĂ© littĂ©ralement), il faut mesurer le pourcentage de lignes dupliquĂ©es dans le logiciel. Cela peut paraĂźtre assez simple d’un premier abord, mais un morceau de code peut ĂȘtre dupliquĂ© de diffĂ©rentes maniĂšres. La dĂ©tection du duplicata exact est triviale, mais dans certains cas, il faut aussi ĂȘtre capable de gĂ©rer le renommage ou l’alias.

Par exemple en Java :

Integer var = 5;
String str = String.valueOf(var);

est la duplication de code de :

Integer nombre = 5;
String chaine = String.valueOf(nombre);

Si tel est le cas, il faut donc que l’algorithme de dĂ©tection teste toutes les possibilitĂ©s de renommage pour ĂȘtre bien certain de ne pas manquer un doublon de code. De plus, il est tout Ă  fait possible que la duplication de code ait Ă©tĂ© modifiĂ©e lĂ©gĂšrement. Pour reprendre notre exemple prĂ©cĂ©dent, il faudrait aussi prendre en compte les cas suivants :

Integer var = 5;
// Du code ne modifiant pas var...
String str = String.valueOf(var);

Dans d’autres cas, il se peut que deux algorithmes diffĂ©rents fassent le mĂȘme travail. Le cas Ă©chĂ©ant, l’algorithme le plus optimisĂ© est sĂ©lectionnĂ© et utilisĂ© pour les deux appels. Cette erreur est souvent commise par les dĂ©butants Ă  la suite d'abus de copier/coller. En plus d’augmenter sensiblement la taille du code source, elle engendre Ă©galement des problĂšmes lors de la maintenance. Pour corriger ce problĂšme, il faut extraire le code dupliquĂ© et le dĂ©placer dans une nouvelle mĂ©thode et remplacer les anciens codes par des appels Ă  cette nouvelle mĂ©thode. Enfin, il est possible de l’éviter en s’imposant les bonnes pratiques de dĂ©veloppement suivantes :

  • Factoriser son code le plus possible (et dĂšs que possible).
  • Travailler selon la technique du test driven development.

Feature Envy

Le smell Feature Envy (littĂ©ralement la « jalousie de fonctionnalitĂ©s ») survient dans une classe quand une mĂ©thode est plus intĂ©ressĂ©e par les membres (attributs et mĂ©thodes) d’une autre classe que les siens. Pour corriger ce genre de problĂšme au sein d’une classe, plusieurs solutions :

  • DĂ©placer une mĂ©thode d’une classe dans une autre si elle utilise plus les donnĂ©es de celle‐ci que les siennes.

Par exemple, dans la classe Rectangle, la mĂ©thode perimetre() peut ĂȘtre totalement dĂ©placĂ©e dans la classe AutreClasse.

public class Rectangle {
   ...
   public Double perimetre() {
        return 2 * AutreClasse.largeur + 2 * AutreClasse.longueur;
   }
}
  • DĂ©placer une partie d’une mĂ©thode dans une autre si elle accĂšde aux donnĂ©es d’une autre classe plus que les siennes. MĂȘme principe avec une mĂ©thode accĂ©dant aux donnĂ©es de plusieurs classes.

Par exemple, dans la classe bateau, la mĂ©thode preparer_bateau() utilise plus d’appels de mĂ©thodes de la classe SPI que ses propres mĂ©thodes.

public class Bateau {
   private SPI spi;
   private Reserve reserve;
   ...
   public void preparer_bateau() {
        this.laver();
        this.verifier_coque();
        reserve.verifier_provisions();
        spi.regler_hauteur();
        spi.regler_largeur();
        spi.verifier_voile();
   }
}

La correction adaptĂ©e serait donc de crĂ©er une mĂ©thode dans SPI regroupant les trois appels et d’appeler cette nouvelle mĂ©thode dans preparer_bateau().

Pour dĂ©tecter le code smell Feature Envy, il faut ĂȘtre capable de localiser les mĂ©thodes utilisant trop les mĂ©thodes d’une classe extĂ©rieure. Pour cela, il faut mesurer la force de couplage qu’ont les mĂ©thodes d’une classe avec les autres mĂ©thodes ou donnĂ©es de classes extĂ©rieures. Lanza et Marinescu proposent une formule conditionnelle de dĂ©tection basĂ©e sur des mĂ©triques[8] :

Avec :

  • 5, une valeur fixĂ©e et expliquĂ©e dans leur ouvrage.
  • LAA (Locality of Attribute Accesses) qui reprĂ©sente la proportion de mĂ©thodes de la classe utilisant accĂ©dant Ă  plus d’attributs de classes extĂ©rieures qu’à ses propres attributs.
  • FDP (Foreign Data Providers) qui reprĂ©sente la proportion d’utilisation d’attributs « extĂ©rieurs » et utilisĂ©s dans trĂšs peu d’autres classes.
  • ATFD (Access to Foreign Data) qui reprĂ©sente la proportion de mĂ©thodes de la classe qui accĂšdent aux attributs directement ou via des accesseurs d’autres classes extĂ©rieures.

Cette mĂ©thode de dĂ©tection est utilisĂ©e dans les outils iPlasma et inFusion. D’autres outils comme JDeodorant, essayent de dĂ©placer les mĂ©thodes dans des autres classes. Ainsi pour chaque mĂ©thode du programme, un algorithme va former une liste de classes candidates oĂč il est possible de dĂ©placer la mĂ©thode. Ensuite, pour chacun de ces candidats, un calcul de distance sera effectuĂ© ainsi qu’un calcul sur le nombre d’appels d’accesseurs. À la fin, la classe sĂ©lectionnĂ©e est celle dont la distance calculĂ©e est minimale et le nombre d’appels d’accesseurs maximal[9] - [10]. Autre approche avec un outil nommĂ© HIST basĂ© sur l’analyse de commits, une mĂ©thode affectĂ©e par le Smell Feature Envy a tendance Ă  changer plus frĂ©quemment avec les mĂ©thodes des autres classes qu’avec celles de sa propre classe[11]. Enfin, il existe Ă©galement un plugin Eclipse permettant de dĂ©tecter cette erreur. Ce greffon nommĂ© Eclipse Metrics[12] calcule un indice de jalousie maximal et dĂšs que cet indice est dĂ©passĂ©, l’utilisateur est informĂ© via un message d’avertissement.

BLOB

Cette erreur est l’impact direct de l’incapacitĂ© Ă  concevoir correctement des architectures logicielles complexes dans un langage de programmation procĂ©durale. En plus d’ĂȘtre totalement inĂ©lĂ©gant, le programme perd en vitesse d’exĂ©cution et la classe est difficilement maintenable. Il est possible de l’éviter en s’imposant les bonnes pratiques de dĂ©veloppement suivantes :

Il n’y a pas de correction miracle pour un tel cas, il faut repenser son code afin de le factoriser. La taille de la classe n’est pas liĂ©e Ă  cette erreur de conception. D’une maniĂšre gĂ©nĂ©rale, voici les corrections typiques

  • Retirer les mĂ©thodes n’ayant aucun impact sur la classe en question et les replacer dans la classe affectĂ©e par l’appel de la mĂ©thode.

Ainsi, dans la classe ci‐dessous, la mĂ©thode afficher_pilote() devra ĂȘtre dĂ©placĂ©e dans la classe Pilote


public class Avion {
   private Pilote pilote;
   ...
   public String afficher_pilote() {...}
}
  • Retirer les attributs prĂ©sents illogiquement dans la classe et les placer dans les classes adaptĂ©es.

Ainsi, dans la classe ci‐dessous, l’attribut matricule_pilote devra ĂȘtre dĂ©placĂ©e dans la classe Pilote


public class Avion {
   private Pilote pilote;
   private String matricule_pilote;
   ...
}
  • Retirer les associations dont l’existence n’est pas nĂ©cessaire.

Ainsi, dans la classe ci‐dessous, la rĂ©fĂ©rence pilote devra ĂȘtre dĂ©placĂ©e dans la classe Equipage


public class Avion {
   private Equipage equipage;
   private Pilote pilote;
   ...
}

Pour la détection, Lanza et Marinescu proposent la formule conditionnelle suivante reposant sur trois métriques[13] :

Avec :

  • 47 et 5, des valeurs fixĂ©es et expliquĂ©es dans leur ouvrage.
  • WMC (Weighted Method Count) qui reprĂ©sente la somme de la complexitĂ© statistique de toutes les mĂ©thodes dans une classe.
  • TCC (Tight Class Cohesion) qui reprĂ©sente le nombre relatif de mĂ©thodes accĂ©dant aux attributs.
  • ATFD (Access to Foreign Data) qui reprĂ©sente le nombre de classes externes qui accĂšdent aux attributs de la classe directement ou via des accesseurs.

Cette méthode de détection est utilisée dans les outils iPlasma et inFusion.

DECOR utilise des fiches de rĂšgles nommĂ©es « Rules Cards »[14]. D’aprĂšs les caractĂ©ristiques de ces « Rules Cards », un BLOB est une classe ayant un LCOM5 (un manque de cohĂ©sion de mĂ©thodes, Lack of Cohesion Of Methods en anglais) supĂ©rieur Ă  20 et un nombre de mĂ©thodes et d’attributs supĂ©rieurs Ă  20. De plus, les classes sont identifiables par des noms suspects comme Process, Control, Manage, System etc[15]...

Pour connaütre le LCOM5 d’une classe, on utilise la formule ci‐dessous[16] :

Avec :

  • l, le nombre d’attributs
  • k, le nombre de mĂ©thodes
  • a, la somme du nombre d’attributs distincts accĂ©dĂ©s par chaque mĂ©thode dans une classe

D’autres outils comme JDeodorant essayent de dĂ©composer la classe en plusieurs afin de dĂ©terminer si la classe est un BLOB[17]. Cette dĂ©composition s’effectue par clustering, s’il est possible de partitionner de maniĂšre optimale les mĂ©thodes dans diffĂ©rentes classes alors c’est un BLOB. Pour former les diffĂ©rents clusters, on utilise alors entre les membres (attributs, mĂ©thodes, etc.) de la classe, la distance de Jaccard dĂ©finie ainsi[18] - [10] :

Enfin, avec HIST, outil basĂ© sur l’analyse de commits, on peut dĂ©tecter un BLOB car c’est une classe qui change rĂ©guliĂšrement dans le temps [19].

Long Parameter List

Le code smell Long Parameter List (longue liste de paramĂštres littĂ©ralement) survient dans les classes contenant une mĂ©thode ayant trop de paramĂštres. Cette erreur est typiquement commise lors de la fusion de plusieurs algorithmes en un seul. Autre possibilitĂ©, lorsqu’un dĂ©veloppeur essaye de rendre une classe trop paramĂ©trable. GĂ©nĂ©ralement, il est fort difficile de comprendre ces listes de paramĂštres tant qu’elles deviennent assez vite contradictoires et difficiles Ă  utiliser concrĂštement.

Voici des exemples de corrections possibles :

  • Retirer les paramĂštres rĂ©sultant d’appels de mĂ©thodes sur un autre objet, l’objet en question peut ĂȘtre placĂ© dans le domaine de sa classe ou utilisĂ© comme paramĂštre.

Par exemple, si les derniers paramùtres de la fonction calcul() sont issus d’un objet Mesures :

public void calcul( ..., int x, int y, int z) {
    ...
}

Il est alors directement possible de passer l’objet Mesure en paramùtre.

public void calcul( ..., Mesures mesures) {
    ...
}
  • Regrouper les paramĂštres pouvant l’ĂȘtre et passer l’objet ainsi crĂ©Ă© dans la mĂ©thode.

Pour reprendre l’exemple prĂ©cĂ©dent, mĂȘme si les paramĂštres x, y et z sont totalement indĂ©pendants, il est possible de crĂ©er un objet pour rĂ©duire le nombre de paramĂštres.

public void calcul( ..., int x, int y, int z) {
    ...
}

Encore une fois, il est envisageable de passer ce nouvel objet créé en paramÚtre.

public Objet creer_objet(int x, int y, int z) {
    ...
}
public void calcul( ..., Objet valeurs) {
    ...
}

Pour ce qui est de la dĂ©tection, il suffit de compter le nombre de paramĂštres d’une mĂ©thode. Chaque outil de dĂ©tection a son nombre maximum autorisĂ©. Par exemple, PMD a pour valeur maximale 10 et Checkstyle 7[20].

Long Method

Le code smell Long Method (longue mĂ©thode littĂ©ralement) survient dans les classes contenant une mĂ©thode ayant trop d’instructions. Cette erreur est gĂ©nĂ©ralement commise par les dĂ©veloppeurs ne dĂ©composant pas suffisamment leurs codes. Pour Ă©viter de telles erreurs, un dĂ©veloppeur peut adopter les mĂȘmes principes de dĂ©veloppement citĂ©s dans la partie sur le Duplicated Code : Travailler en TDD ou factoriser son code en partitionnant le code en petites mĂ©thodes. Pour dĂ©tecter ce code smell, il ne suffit pas de compter le nombre de lignes de codes des mĂ©thodes. En effet, dans certains cas, il est rĂ©ellement nĂ©cessaire d’avoir autant de codes quand il n’est pas fractionnable. On ne peut donc pas crĂ©er des moyens de dĂ©tection comme pour le Long Parameter Method.

MĂ€ntyla suggĂšre d’utiliser pour la dĂ©tection la complexitĂ© cyclomatique ainsi que les mĂ©triques d’Halstead[21].

Cependant, certains outils ne dĂ©tectent ce smell qu’en comptant le nombre de ligne de codes NLOC. C’est le cas de Checkstyle, qui considĂšre qu’une mĂ©thode est longue Ă  partir de 150 lignes et PDM Ă  partir de 100 lignes[20]. JDeodorant utilise des techniques de tranchage pour dĂ©terminer si une mĂ©thode peut ĂȘtre scindĂ©e en plusieurs autres.

Large Class

Le smell Large Class (classe large littĂ©ralement) est une classe contenant trop de responsabilitĂ©s. Cette erreur est souvent commise par le dĂ©veloppeur dĂ©butant nĂ©gligeant les principes de l’orientĂ© objet. La NASA Software Assurance Technology Center a publiĂ© les valeurs seuils recommandĂ©es pour Ă©viter de crĂ©er une Large Class. Selon elle, une classe a trop de fonctionnalitĂ©s quand l’une des conditions suivantes n’est pas valide[22] :

  • Le nombre de mĂ©thodes dans la classe est infĂ©rieur Ă  20
  • Le poids des mĂ©thodes par classe est infĂ©rieur Ă  100
  • Le nombre de mĂ©thodes et le nombre de mĂ©thodes invoquĂ©es par chacune de ces mĂ©thodes est infĂ©rieur Ă  100
  • Le nombre de classes rĂ©fĂ©rencĂ©es dans la classe est infĂ©rieur Ă  5

On peut aussi compter le nombre de lignes de la classe (souvent appelĂ© NLOC pour number of lines of code) et le comparer Ă  un maximum que l’on s’impose. Par exemple, PMD considĂšre qu’une classe est large si elle contient plus de 1000 lignes de codes et Checkstyle 2000 lignes[20]. Cependant, il est possible de faire des exceptions pour les classes contenant des interfaces graphiques pour l’utilisateur (GUI). Pour corriger ce problĂšme, il faut rĂ©duire les responsabilitĂ©s de la classe en question en restructurant le code en diffĂ©rentes classes de faibles responsabilitĂ©s. Outre le gain de clartĂ© aprĂšs la restructuration, la maintenance du programme sera plus aisĂ©e.

Outils existants

Il existe de plus en plus d’outils de dĂ©tection automatique de ces mauvaises pratiques de conception. Voici une liste non exhaustive des principaux outils existants.

DECOR

Proposé par Naouel Moha, DECOR[23] pour Detection&Correction, est un outil qui consiste en la détection et la correction automatique des code smells. Le processus est décomposé en deux parties, DETEX et COREX, qui font la spécificité de cette méthode.

Tout d’abord, la dĂ©tection est assurĂ©e par un ensemble de rĂšgles qu’il faut spĂ©cifier Ă  l’aide d’un langage de haut niveau.

Ensuite, l’utilisateur suggĂšre ses restructurations de codes souhaitĂ©es, de nouveau grĂące Ă  l’utilisation du mĂȘme langage.

Enfin, l’outil se charge d’analyser et corriger automatiquement les dĂ©fauts dans le code, en se basant sur les rĂšgles dĂ©crites au prĂ©alable.

Cette mĂ©thode englobant Ă  la fois la dĂ©tection et la correction prĂ©sente l’avantage d’automatiser l’ensemble du processus sans faire intervenir manuellement le dĂ©veloppeur pour chaque correction dĂ©tectĂ©e.

DECOR est aujourd’hui capable de dĂ©tecter 19 code smells diffĂ©rents parmi lesquels on trouve le Blob, Long Method ou Long Class par exemple[24].

inFusion

L’outil inFusion est une solution commerciale clĂ© en main Ă  destination des dĂ©veloppeurs et basĂ© sur l’outil iPlasma.

Il prĂ©sente l’avantage d’ĂȘtre un outil complet avec sa propre interface pour ĂȘtre utilisĂ© de façon indĂ©pendante.

Il est capable de détecter plus de 20 code smells parmi lesquels Duplicated Code, Blob, Long Method ou Long class.

inFusion gĂšre Ă©galement l’analyse de code Java, C ou C++.

JDeodorant

PrĂ©sentĂ© sous la forme d’un plugin pour l’environnement de dĂ©veloppement Eclipse[25] dĂ©veloppĂ© par les Ă©quipes de l’UniversitĂ© Concordia au Canada et l’UniversitĂ© de MacĂ©doine en GrĂšce.

L’outil qui s’utilise donc directement dans l’éditeur permet de dĂ©tecter des code smells et de proposer la refactorisation appropriĂ©e.

Il est à ce jour capable de détecter 5 cas de code smells, Feature Envy, Type-Checking, Long Method, Blob ou encore Duplicated Code.

JDeodorant[26] possĂšde plusieurs avantages, notamment :

  • Pré‐évaluation des effets de chaque solution proposĂ©e.
  • Guidage de l’utilisateur dans la comprĂ©hension des erreurs de conception.
  • SimplicitĂ© de l’outil, « one-click approach ».

Stench Blossom

L’outil Stench Blossom[27] est un dĂ©tecteur de code smells qui fournit un environnement interactif qui permet aux dĂ©veloppeurs de visualiser rapidement les smells contenus dans leur code.

La rĂ©troaction est synthĂ©tique et visuelle et offre des informations trĂšs dĂ©taillĂ©es sur l’origine de l’erreur sous la forme d’ensemble de pĂ©tales.

Plus l’erreur est importante et plus le pĂ©tale est grand. Le dĂ©veloppeur peut alors voir directement quelle erreur est la plus importante en regardant l’ensemble crĂ©Ă© et corriger son code en consĂ©quence.

Stench Blossom est un plugin Eclipse qui détecte 8 mauvaises odeurs dans des codes Java.

HIST

L’outil HIST, pour Historical Information for Smell deTection [28], est un outil de dĂ©tection de code smells apportant la particularitĂ© d’une approche basĂ©e sur l’historique d’un gestionnaire de versions, en plus de l’analyse statique de code habituelle.

La prĂ©sence de problĂšmes de conception au sein d’un code source oblige les dĂ©veloppeurs Ă  adopter un comportement spĂ©cifique lors d’une modification du programme. Ces comportements sont ensuite dĂ©tectables grĂące Ă  l’historique du gestionnaire de versions. HIST propose donc de repĂ©rer ces refactorisations particuliĂšres via la mise en place de patrons de dĂ©tections spĂ©cifique Ă  un code smells.

HIST prend en charge 5 code smells parmi les plus connus, Divergent Change, Shotgun Surgery, Parallel Inheritance, Blob et Feature Envy.

Par exemple, la dĂ©tection du code smell Blob par l’utilisation d’un historique se base sur le comportement de refactorisation. En effet, quand une classe Blob est prĂ©sente dans un programme, la probabilitĂ© que cette classe soit modifiĂ©e lors d’une refactorisation est Ă©levĂ©e. Il suffit alors de regarder dans le projet une classe qui est rĂ©guliĂšrement modifiĂ©e dans un commit impliquant une autre classe[29]. Comparativement Ă  d’autres outils (notamment DECOR), Hist possĂšde un taux de dĂ©tection plus Ă©levĂ©[30], cependant il nĂ©cessite Ă©galement plus d’informations que le seul code source. De plus, l’analyse de l’historique se prĂ©sente comme une phase supplĂ©mentaire Ă  l’analyse statique, la comparaison n’a donc d’intĂ©rĂȘt tant les deux mĂ©thodes sont complĂ©mentaires.

Autres

Bien sĂ»r, beaucoup d’autres outils existent, parmi lesquels Checkstyle ou pMD.

Bibliographie et références

Références

  1. « bliki: CodeSmell », sur martinfowler.com (consulté le )
  2. Geoffrey Hecht, « DĂ©tection et analyse de l’impact des dĂ©fauts de code dans les applications mobiles », UniversitĂ© Lille-I (thĂšse), UniversitĂ© Lille 1 : Sciences et Technologies ; UniversitĂ© du QuĂ©bec Ă  MontrĂ©al,‎ (lire en ligne, consultĂ© le )
  3. Refactoring: Improving the Design of Existing Code 1999, p. 63-73
  4. Refactoring: Improving the Design of Existing Code 1999, p. 63-64
  5. Refactoring: Improving the Design of Existing Code 1999, p. 66
  6. Detecting Bad Smells in Source Code using Change History Information 2013, p. 269
  7. Refactoring: Improving the Design of Existing Code 1999, p. 65
  8. Object-oriented metrics in practice: using software metrics to characterize, evaluate, and improve the design of object-oriented systems 2007, p. 85-86
  9. Identification of Move Method Refactoring Opportunities 2009, p. 1-2
  10. Automatic detection of bad smells in code: An experimental assessment 2012, p. 5
  11. Detecting Bad Smells in Source Code using Change History Information 2013, p. 271
  12. (en) « Feature Envy », sur sourceforge.net (consulté le ).
  13. Object-oriented metrics in practice: using software metrics to characterize, evaluate, and improve the design of object-oriented systems 2007, p. 80-81
  14. DECOR: A Method for the Specification and Detection of Code and Design Smells 2010, p. 3
  15. Anti-Pattern Detection: Methods, Challenges and Open Issues 2014, p. 3
  16. An Effort to Improve Cohesion Metric Using Inheritance 2013, p. 2
  17. Decomposing object-oriented class modules using an agglomerative clustering technique 2009, p. 4
  18. Anti-Pattern Detection: Methods, Challenges and Open Issues 2013, p. 4-5
  19. Detecting Bad Smells in Source Code using Change History Information 2013, p. 270
  20. Automatic detection of bad smells in code: An experimental assessment 2012, p. 6
  21. An experiment on subjective evolvability evaluation of object-oriented software: explaining factors and interrater agreement 2007, p. 7
  22. Looking for Patterns in Code Bad Smells Relations 2011, p. 2
  23. DECOR: A Method for the Specification and Detection of Code and Design Smells 2010
  24. DECOR: A Method for the Specification and Detection of Code and Design Smells 2010, p. 15
  25. « JDeodorant », sur Eclipse Plugins, Bundles and Products - Eclipse Marketplace (consulté le )
  26. JDeodorant: Identification and Removal of Type-Checking Bad Smells 2009, p. 1-3
  27. Decomposing object-oriented class modules using an agglomerative clustering technique 2010
  28. HIST : Historical Information for Smell deTection 2013
  29. HIST : Historical Information for Smell deTection 2013, p. 270-271
  30. HIST : Historical Information for Smell deTection 2013, p. 274-275

Bibliographie

  • (en) Martin Fowler, « Refactoring: Improving the Design of Existing Code », Addison-Wesley,‎
  • (en) Michele Lanza et Radu Marinescu, « Object-oriented metrics in practice: using software metrics to characterize, evaluate, and improve the design of object-oriented systems », Springer Science & Business Media,‎
  • (en) Fabio Palomba, Gabriele Bavota, Rocco Oliveto et Andrea De Luzia, « Anti-Pattern Detection: Methods, Challenges and Open Issues », Advances in Computers, Chapter 4, vol. 95,‎
  • (en) Naouel Moha, Yann-GaĂ«l GuĂ©hĂ©neuc, Laurence Duchien et Anne-Françoise Le Meur, « DECOR: A Method for the Specification and Detection of Code and Design Smells », IEEE Transactions on Software Engineering, vol. 36, no 1,‎ , p. 20-36 (ISSN 0098-5589, DOI 10.1109/TSE.2009.50)
  • (en) Marios Fokaefs, Nikolaos Tsantalis, Alexander Chatzigeorgiou et Jörg Sander, « Decomposing object-oriented class modules using an agglomerative clustering technique », IEEE International Conference on Software Maintenance,‎ , p. 93-101 (ISSN 1063-6773, DOI 10.1109/ICSM.2009.5306332)
  • (en) Cristina Marinescu, Radu Marinescu, Petru Florin Mihancea, Daniel Ratiu et Richard Wettel, « iplasma: An integrated platform for quality assessment of object-oriented design », International Conference on Software Maintenance,‎ , p. 77-80
  • (en) Nikolaos Tsantalis, ThĂ©odoros Chaikalis et Alexander Chatzigeorgiou, « JDeodorant: Identification and Removal of Type-Checking Bad Smells », IEEE European Conference on Software Maintenance and Reengineering,‎ , p. 329-331 (ISSN 1534-5351, DOI 10.1109/CSMR.2008.4493342)
  • (en) Emerson Murphy-Hill et Andrew P. Black, « Decomposing object-oriented class modules using an agglomerative clustering technique », IEEE International Symposium on Software Visualization,‎ , p. 5-14 (DOI 10.1145/1879211.1879216)
  • (en) Fabio Palomba, Rocco Oliveto, Gabriele Bavota, Andrea De Lucia, Massimiliano Di Penta et Denys Poshyvanyk, « Detecting Bad Smells in Source Code using Change History Information », IEEE International Conference on Automated Software Engineering,‎ , p. 268-278 (DOI 10.1109/ASE.2013.6693086)
  • (en) Fabio Palomba, Rocco Oliveto, Gabriele Bavota, Andrea De Lucia, Massimiliano Di Penta et Denys Poshyvanyk, « Mining Version Histories for Detecting Code Smells », IEEE Transactions on Software Engineering, vol. 41,‎ , p. 462-489 (DOI 10.1109/TSE.2014.2372760)
  • (en) Ankita Mann, Sandeep Dalal et Dhreej Chhillar, « An Effort to Improve Cohesion Metrics Using Inheritance », International Journal of Engineering and Advanced Technology, vol. 2,‎ (ISSN 2250-3005)
  • (en) Francesca Arcelli Fontana, Pietro Braione et Marco Zanoni, « Automatic detection of bad smells in code: An experimental assessment », Journal of Object Technology, vol. 11,‎
  • (en) Bartosz Walter et Pawel Martenka, « Looking for Patterns in Code Bad Smells Relations », IEEE International Conference on Software Testing, Verification and Validation Workshops,‎ , p. 465-466 (DOI 10.1109/ICSTW.2011.89)
  • (en) Nikolaos Tsantalis et Alexander Chatzigeorgiou, « Identification of Move Method Refactoring Opportunities », IEEE Transactions on Software Engineering, vol. 35,‎ , p. 347-367 (ISSN 0098-5589, DOI 10.1109/TSE.2009.1)
  • (en) M.V. MĂ€ntylĂ€, « Identification of Move Method Refactoring Opportunities », IEEE International Symposium on Empirical Software Engineering,‎ (DOI 10.1109/ISESE.2005.1541837)

Voir aussi

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.