Magazine Internet

Pratique XP : le refactoring

Publié le 05 novembre 2008 par François Mottet

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

Retour à La Une de Logo Paperblog

A propos de l’auteur


François Mottet 8 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte