Le principe d'ouvert-fermé

Le principe d'ouvert-fermé
Photo by Finn Hackshaw / Unsplash

Ceci est un ancien article qui provient de mon blog perso www.pascallacroix.net. L’article a été mis à jour ici : Concevoir des applications SOLID avec OCP.

Pour démarrer cette année, je vous présente le principe d’ouvert-fermé (ou Open-Closed Principle en anglais – OCP).

Il s’agit d’une philosophie de développement qui propose une manière de travailler. Je souhaite vous la présenter car elle primordiale à mes yeux.

Qu’est-ce-que l’ouvert-fermé?

En fait, par ouvert-fermé, il faut comprendre ouvert aux évolutions et fermé aux modifications.

Cela veut dire qu’une classe a la capacité d’être étendue (ajout de nouvelles fonctionnalités), sans pour autant que le code existant qui implémente un comportement soit modifié.

Appliquer le principe OCP permet d’assurer une architecture évolutive sans allonger la durée des tests et de la maintenance.

Le principe a été énoncé la première fois en 1988 par le Docteur Bertrand Meyer.

Pourquoi utiliser OCP?

OCP impose les règles suivantes:

  • une classe doit être extensibles,
  • pour ajouter une fonctionnalité ou modifier un comportement, il ne faut pas toucher au code existant.

Ceci entraine plusieurs conséquences:

  • L’extensibilité: il faut donc réfléchir en amont aux extensions possibles. Il faut prévoir dans l’architecture des points d’extensions (par héritage, par événements ou autres) ;
  • Le code testé n’est pas modifié: ce qui veut dire que les nouveaux bugs apparaitront dans votre nouveau code ;

Un exemple concret

Dans la pratique, j’utilise le framework ASP.NET MVC pour le développement des applications Web. Ce framework est évolution du framework de ASP.NET de Microsoft.

ASP.NET MVC permet d’ajouter des attributs sur les méthodes d’action des contrôleurs. Ces attributs permettent de modifier le comportement d’une action avant ou/et après son exécution.

Prenons un exemple simple:

  • Nous venons d’écrire une action qui effectue le chargement d’une liste d’utilisateurs en fonction du numéro de la page ;
  • Nous testons notre code (en écrivant par exemple des tests unitaires) ;
  • Plus tard, nous souhaitons ajouter un nouveau comportement à cette action: imposer l’authentification de l’utilisateur avec un rôle précis. Dans ASP.NET MVC, il suffira d’ajouter l’attribut Authorize sur la méthode pour que le framework demande automatiquement à l’utilisateur de s’authentifier lors de l’appel de cette action.

C’est donc ici un exemple d’OCP: le code existant de l’action n’est pas modifié et pour l’étendre, il suffit d’ajouter un attribut avant la méthode.

Voici un exemple en C# pour être plus clair:

public ActionResult Index(int page)
{
List users = _userRepository.GetUsers(page);
return View(users);
}

En appliquant l’attribut de sécurité, cela donne le code suivant:

// On demande d’être authentifié et d’avoir le rôle d’administrateur
[Authorize(Roles="Admin")]
public ActionResult Index(int page)
{
List users = _userRepository.GetUsers(page);
return View(users);
}

Pour en savoir plus sur les attributs et l’extensibilité, je vous invite à consulter l’excellent billet de Rob Conery: http://blog.wekeroad.com/blog/aspnet-mvc-securing-your-controller-actions/.

Pour aller plus loin

J’espère avoir attiré votre attention sur ce principe. Pourquoi pas essayer de le mettre en place dans vos prochains développements?

Voici quelques liens qui vous permettront d’en savoir plus sur OCP: