# Séparation des préoccupations

La séparation des préoccupations (ou séparation des responsabilités), traduction du concept d’informatique théorique separation of concerns (SoC) en anglais, est un principe de conception visant à segmenter un programme informatique en plusieurs parties, afin que chacune d’entre elles isole et gère un aspect précis de la problématique générale. C'est une bonne pratique largement reconnue et mise en œuvre dans l'ingénierie logicielle.
Une préoccupation (de l’anglais concern) est un ensemble d’informations et de responsabilités (traitements sur les informations) qui entre en jeu dans le code d’un programme informatique. Le concept de préoccupation peut concrètement recouvrir des aspects informatiques très variés, à des échelles de toute taille.
Un programme qui intègre les principes de séparation des préoccupations est souvent appelé un programme modulaire, car il sépare son code en différent modules (quelle que soit l'implémentation concrète de ces modules). La modularité, et donc la séparation des préoccupations, est obtenue en encapsulant des informations dans une section de code qui a une interface bien définie. L’encapsulation du code dans des modules amène un masquage de l’information. L'architecture en couches dans les systèmes d’information constitue un autre mode de réalisation de la séparation des préoccupations (par exemple dans l'architecture trois tiers : couche de présentation, couche de traitement dite couche de services, et couche d'accès aux données).
L’application du principe de séparation des préoccupations simplifie le développement et la maintenance des programmes informatiques. Quand les préoccupations sont strictement et clairement séparées, les différentes parties du code peuvent être réutilisées, étendues ou modifiées indépendamment des autres, ce qui améliore la maintenabilité et la sécurité de la base de code. Cela permet aussi d’intervenir sur une partie du code sans nécessairement avoir besoin de connaissances sur les autres parties.

## Implémentations

Presque tous les paradigmes de programmation fournissent des outils pour réaliser une séparation des préoccupations. Par exemple, des langages orientés objet comme C#, C++, Delphi ou Java peuvent séparer les préoccupations dans des objets ou des classes. L’application de patrons de conception (design pattern) tels que MVC ou MVP permettent, à l'échelle macroscopique, de séparer les problématiques de contenu, de présentation et de traitement des données. Une architecture orientée services (SOA) peut également être considérée comme une implémentation de séparation des préoccupations, à un niveau d'abstraction encore plus élevé. Les langages procéduraux, comme le C et le Pascal, peuvent séparer les préoccupations dans des procédures ou des fonctions. La programmation orientée aspect peut séparer les préoccupations en aspects et objets. Les langages fonctionnels utilisent souvent les fonctions regroupées en modules.

## Hors du champ de l'informatique

Le principe de séparation des préoccupations est fécond, et pourrait être généralisé et appliqué à d’autres pratiques conceptuelles hors du champ de l’informatique, comme l’urbanisme, l’architecture ou le design de l’information. Le but étant de mieux comprendre, concevoir, et gérer des systèmes complexes et interdépendants, afin qu’une partie du traitement de l'information puisse être isolée à diverses fins : optimisation, sécurisation, réutilisation, débogage.