Refactoring : La bonne longueur pour une méthode

Un objectif important du refactoring est d’obtenir des méthodes courtes. Pourquoi ? Parce qu’un code court est plus simple à lire et à maintenir, provoquera moins d’erreurs et sera plus modulaire. D’accord, ça c’est facile à comprendre.

Mais qu’appelle-t-on une méthode courte ? Quand sait-on qu’une méthode est assez courte ? Quelle unité de longueur doit-on utiliser ? La réponse à cette question est moins évidente qu’il n’y parait.

Dans son livre « Coder proprement », centré sur le refactoring en Java, Robert C. Martin propose qu’une méthode mesure au plus 3 lignes. Il évoque aussi la méthode idéale qui doit tenir en une seule ligne. Reek, un outil de qualité de code pour Ruby place la barre à 5 lignes de code maximum par méthode. D’autres outils du même genre auront des valeurs différentes.
Qui a raison ? Personne. Car personne ne sait vraiment ce qu’est au juste une ligne de code. On retiendra seulement que « les plus courtes sont les meilleures ».

Bon d’accord, plus c’est court, mieux c’est, mais comment savoir si une méthode est trop longue ? Robert Martin donne une réponse à laquelle j’adhère totalement, après l’avoir experimentée : Une méthode doit faire une seule chose. Si vos méthodes ne font qu’une chose, il y a fort à parier que vous avez trouvé la bonne taille.

Voyons un exemple. La méthode Ruby qui suit est courte, simple et assez claire. Elle est tirée d’un de mes programmes, Genit, un framework web statique, qui est en phase de démarrage. Comme son nom l’indique, la méthode à pour but de sauvegarder sur disque un document au format html :

def save_as_html document, filename
  filename.gsub! /markdown$/, 'html'
  file = File.join(@working_dir, 'www', filename)
  File.open(file, "w") {|out| out.puts document.to_html }
end

À première vue, ça va. Mais en y regardant de plus près, on voit que la méthode save_as_html fait en réalité 4 choses distinctes :

  1.  elle force l’extension du nom de fichier en ‘html’
  2.  elle fabrique le nom complet du futur fichier
  3.  elle transforme un document au format html
  4. elle sauvegarde un fichier

Cette petite méthode est donc beaucoup trop longue, et je vais devoir me casser un peu la tête pour sortir un meilleur code. Vous pourrez le voir en consultant les sources de Genit (quand je m’y serais mis…)

Bon refactoring !

Article(s) en relation

Refactoring : un exemple simple en Ruby

Publicités

, ,

  1. Poster un commentaire

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :