Le refactoring est l'une des partiques XP-eXtreme-Programming|fr] les plus importantes. Cette pratique consiste en une opération de maintenance du code informatique. Le but est d'améliorer la lisibilité, la simplicité et la maintenabilité d'un code source. Cette opération doit être réalisée de façon continue et automatique afin d'avoir en permanance un code clair et maintenable.
Au final, le refactoring permet d'éviter la duplication de code, la présence de code mort, l'écriture de code non nécessaire ainsi que d'avoir un code facile à lire et compréhensible très rapidement. Bien évidemment, votre code doit être correctement testé (tests unitaires, fonctionnels) afin d'éviter l'intégration de regressions suite à un refactoring.
Ceci passe par 5 pratiques :
- Extract method - But : éviter la duplication de code, avoir des méthodes unitaires testables
def printCart(): printBanner() #print details print "name %s" % _name print "amount %d" % _getAmount()
donne après refactoring :
def printCart(): printBanner() printDetails() def printDetails(): print "name %s" % _name print "amount %d" % _getAmount()
- Pull Up method - But : éviter la duplication de code par l'utilisation de classes abstraites, gagner en lisibilité
class Employee: def __init__(self, name): self._name = name class Engineer(Employee): def getName(self): return self._name class Director(Employee): def getName(self): return self._name
donne après refactoring :
class Employee: def __init__(self, name): self._name = name def getName(self): return self._name
- Rename method - But : gagner en lisibilité
class Employee: def __init__(self, name, wage): self._name = name self._wage = wage def getWage(self): return self._wage
donne après refactoring :
class Employee: def __init__(self, name, monthlyWage): self._name = name self._monthlyWage = monthlyWage def getMonthlyWage(self): return self._monthlyWage
- Add parameter - But : gagner en lisibilité, simplifier l'écriture de tests unitaires
class Employee: def __init__(self, name, monthlyWage, dateOfAppointment): self._name = name self._monthlyWage = monthlyWage self._dateOfAppointment = dateOfAppointment def getLengthOfService(self): return datetime.datetime.now() - self._dateOfAppointment
donne après refactoring :
def getLengthOfService(self, now): return now - self._dateOfAppointment
- Replace Temp with Query - But : eéviter le code mort, non utilisé, éviter l'utilisation de variables temporaires
def getTotalPrice(): basePrice = _quantity * _itemPrice if basePrice > 1000: return basePrice * 0.95 else: return basePrice * 0.98
donne après refactoring :
def getTotalPrice(): if getBasePrice() > 1000: return getBasePrice() * 0.95 return getBasePrice() * 0.98 def getBasePrice(: return _quantity * _itemPrice