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 :
- Utiliser le paradigme Diviser pour mieux régner.
- CrĂ©er des classes abstraites ou qui Ă©tendent dâautres classes.
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
- « bliki: CodeSmell », sur martinfowler.com (consulté le )
- 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 )
- Refactoring: Improving the Design of Existing Code 1999, p. 63-73
- Refactoring: Improving the Design of Existing Code 1999, p. 63-64
- Refactoring: Improving the Design of Existing Code 1999, p. 66
- Detecting Bad Smells in Source Code using Change History Information 2013, p. 269
- Refactoring: Improving the Design of Existing Code 1999, p. 65
- Object-oriented metrics in practice: using software metrics to characterize, evaluate, and improve the design of object-oriented systems 2007, p. 85-86
- Identification of Move Method Refactoring Opportunities 2009, p. 1-2
- Automatic detection of bad smells in code: An experimental assessment 2012, p. 5
- Detecting Bad Smells in Source Code using Change History Information 2013, p. 271
- (en) « Feature Envy », sur sourceforge.net (consulté le ).
- Object-oriented metrics in practice: using software metrics to characterize, evaluate, and improve the design of object-oriented systems 2007, p. 80-81
- DECOR: A Method for the Specification and Detection of Code and Design Smells 2010, p. 3
- Anti-Pattern Detection: Methods, Challenges and Open Issues 2014, p. 3
- An Effort to Improve Cohesion Metric Using Inheritance 2013, p. 2
- Decomposing object-oriented class modules using an agglomerative clustering technique 2009, p. 4
- Anti-Pattern Detection: Methods, Challenges and Open Issues 2013, p. 4-5
- Detecting Bad Smells in Source Code using Change History Information 2013, p. 270
- Automatic detection of bad smells in code: An experimental assessment 2012, p. 6
- An experiment on subjective evolvability evaluation of object-oriented software: explaining factors and interrater agreement 2007, p. 7
- Looking for Patterns in Code Bad Smells Relations 2011, p. 2
- DECOR: A Method for the Specification and Detection of Code and Design Smells 2010
- DECOR: A Method for the Specification and Detection of Code and Design Smells 2010, p. 15
- « JDeodorant », sur Eclipse Plugins, Bundles and Products - Eclipse Marketplace (consulté le )
- JDeodorant: Identification and Removal of Type-Checking Bad Smells 2009, p. 1-3
- Decomposing object-oriented class modules using an agglomerative clustering technique 2010
- HIST : Historical Information for Smell deTection 2013
- HIST : Historical Information for Smell deTection 2013, p. 270-271
- 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)