Abstraction

abstraction n. f. Opération de l'esprit par laquelle on isole une qualité des êtres ou des choses dont elle est la caractéristique /.../ Faire abstraction d'une chose, ne pas en tenir compte./...
Dictionnaire Larousse

Heu... et en informatique ?

Bon, tu n'as qu'à retenir pour l'instant que l'abstraction, c'est un moyen de cacher les détails (la complexité)... On te donne les grandes lignes, mais pas ce qu'il y a à l'intérieur...

Notion de décomposition

Dans le temps, un programme informatique se présentait sous la forme d'un bloc de code monolithique énorme. Ce type de programmation est totalement dépassée, car le code est extrèmement difficile à comprendre et à modifier.

Nous devons donc veiller à décomposer le code en entité qui ont chacune une fonction bien précise, et qui communiquent entre elles.

Et c'est quoi le but ?

La décomposition réduit la complexitéref 1, permet de travailler en équipes (chaque équipe se focalisant sur une partie bien précise du problème), et permet de modifier sans risque l'implémentation1.

J'vois toujours pas...

OK, utilisons un exemple pour comprendre les principes de l'abstraction.

Nous allons réaliser un programme qui permet de chercher des films sur le disque dur, et d'afficher le résultat sous forme de page Web.

Nous pouvons rapidement dégager deux grandes actions de notre programme :

  • Chercher les films.
  • Afficher les résultats.

Différentes notions sont évoquées, ou implicites :

  • Film
  • Disque dur
  • Fichiers
  • Page Web

Comme nous avons au moins deux modules, nous pouvons grouper les actions similaires dans des classes2 Recherche et Affichage.

Contents Haut

Abstraction par paramètres

Nous pouvons commencer par notre recherche de films. Qu'avons nous besoin de savoir ?

  • A la fin, nous devons avoir une liste de films (fichiers).
  • Nous devons dire où démarrer la recherche. Nous lui donnerons un dossier de départ.
  • Pour le reste, peu importe comment se fait la recherche.

Nous allons donc définir la signature suivante  Liste chercherFilms(Dossier dossierDépart)34

Examinons maintenant notre méthode :

  • Liste4 est le type de retour. Cela signifie qu'après avoir exécuté notre méthode nous aurons une liste d'éléments.
  • chercherFilms est le nom de notre méthode.
  • Dossier est le type de paramètre que va reçevoir notre méthode. Nous devrons donc donner un dossier.
  • dossierDépart est le nom du paramètre de type Dossier que nous devons fournir à la méthode.

Paramètres effectifs et paramètres formels

Dans notre signature de méthode, nous avons définis un paramètre nommé dossierDépart. Il s'agit d'un « paramètre formel » (en anglais, “formal parameter”).

Au moment d'exécuter notre méthode, nous lui fournirons un "vrai" dossier, comme le montre l'exemple suivant :

  1. Liste chercherFilms(Dossier dossierDepart){
  2. }
  3.  
  4.   Dossier monDossier := "C:\\test";
  5.   Liste resultat := chercherFilms(monDossier);
  6. }

Nous constatons que le paramètre formel dossierDépart est remplacé par une vraie valeur (C:\test) dont la variable porte le nom monDossier. Il s'agit à présent d'un « paramètre effectif » (en anglais, “actual parameter”), parfois aussi nommé paramètre réel.

L'abstraction par paramètres, ou abstraction par paramétrisation permet donc de remplacer des paramètres actuellement inconnus par leur valeur réelle en temps utile.

Contents Haut

Abstraction par spécifications

L'abstraction par paramètres nous permet de prendre du recul par rapport aux données que nous fournirons à notre méthode, mais cela ne suffit pas pour respecter nos propos du début au niveau de la modularité. Nous devons donc veiller à masquer les différentes lignes de codes à l'intérieur de notre méthode.

Ho lui hé... Y veut pas partager son code!

Le but de masquer ce qui se passe au sein de la méthode n'est absolument pas la protection contre la copie (il existe des décompilateurs assez performants, et à moins d'utiliser des obfuscateurs7 il est très difficile de protéger efficacement le code source). En plus, je suis pleinement convaincu que le partage d'information et la mise à disposition du code source est le meilleur moyen de progresser rapidement, et de détecter plus facilement les bugs.

Le fait de masquer l'implémentation est une protection pour l'utilisateur8.

En effet, si ce dernier sait que la méthode chercherFilms utilise un tableau dans la classe Recherche pour éviter de rechercher à nouveau si il n'y a eu aucune modification, il peut être tenté d'utiliser ce tableau.

Si nous modifions le code de notre classe Recherche et que nous n'utilisons plus ce tableau, ou que nous le destinons à un autre usage, le code de la personne qui utilise notre classe ne fonctionne plus, ou entrave le bon fonctionnement de nos méthodes.

C'est pour cette raison, pour cette indépendance que nous fournit l'abstraction, que nous masquons les éléments internes (masquer la représentation).

Mais si je ne sais pas ce qui se passe dans ta méthode, comment je peux l'utiliser ?

C'est pour cette raison que nous devons spécifier dans quelles conditions utiliser la méthode, et ce qu'elle fait. Le fait de spécifier ces informations est la base de l'abstraction par spécification.

L'abstraction par spécification permet donc une compréhension rapide du code sans devoir regarder l'implémentation, et une indépendance d'implémentation puisque nous pouvons modifier la manière dont nous avons codé à l'intérieur (principe de modifiabilité), pour autant que nos spécifications soient respectées.

L'abstraction par spécification nous permet de coder rapidement et sans se tracasser de l'efficacité (mais en atteignant le but demandé), puis par après optimiser le code quand nous en aurons la possibilité.

Nous devrons veiller dans notre spécification de méthode à être indépendant de toute autre spécification, c'est le principe de localité. Le programmeur qui écrit une implémentation pour cette méthode ne doit avoir besoin que de cette spécification pour savoir ce qu'il peut et ce qu'il doit faire.

Nous verrons par la suite comment spécifier les conditions nécessaires (pré-conditions) et les conditions après traitement (post-conditions).

Contents Haut

Abstraction par les données

Une fois que la recherche est effectuée, la méthode nous renvoie une collection de films sous la forme d'un type Liste.

L'abstraction par type de données nous permet une indépendance au niveau de la manière de stocker les données (la représentation). Le fait de masquer cette représentation nous permet de la modifier par exemple en fonction de critères d'optimisation, sans les utilisateurs de notre code doivent modifier quoi que ce soit dans leur propre code.

Seules les méthodes (les constructeurs sont aussi des méthodes) doivent pouvoir accéder à la représentation9. Le moyen en Java pour interdire l'accès aux variables est le mot clé private1011. C'est le principe d'encapsulation.

Un des avantages de travailler avec une abstraction par type de données est que ce type regroupe toute une série d'opérations que nous pouvons effectuer sur cette liste, et les comportements que nous pouvons en attendre.

Abstraction de l'itération

Comme nous utilisons le type abstrait de données Liste, nous pouvons utiliser toutes les fonctionnalités que ce type met à notre disposition, et parmi elles la possibilité d'énumérer les éléments que la liste contient.

Contents Haut

Résumé

Nous avons vu que l'abstraction en programmation peut prendre différentes formes, l'abstraction par paramètres, l'abstraction par spécification.

Nous avons aussi vu qu'il existait certaines techniques avancées comme l'abstraction procédurale, l'abstraction par les données et l'abstraction par hiérarchie de type, et enfin l'abstraction de l'itération, techniques que nous aborderons dans les pages suivantes.

Contents Haut

English translation

You have asked to visit this site in English. For now, only the interface is translated, but not all the content yet.

If you want to help me in translations, your contribution is welcome. All you need to do is register on the site, and send me a message asking me to add you to the group of translators, which will give you the opportunity to translate the pages you want. A link at the bottom of each translated page indicates that you are the translator, and has a link to your profile.

Thank you in advance.

Document created the 10/10/2009, last modified the 26/10/2018
Source of the printed document:https://www.gaudry.be/en/programmer-abstraction.html

The infobrol is a personal site whose content is my sole responsibility. The text is available under CreativeCommons license (BY-NC-SA). More info on the terms of use and the author.

Notes

  1.  Implémentation : L'implémentation est le code réellement écrit.

  2.  Classe : A ce stade, la seule chose qui nous intéresse est qu'une classe est un moyen de grouper les actions similaires, et certaines données dont elles ont besoin.

  3.  Signature : Dans certains langages, comme par exemple Java, le type de retour ne fait pas partie de la signature.

  4. a,b Liste : Liste est un type de collection qui rassemble des "objets". Nous verrons par la suite que nous pouvons dans certains cas utiliser des types génériques, comme Liste<Film> qui est une liste qui ne contient que des films.

  5.  paramètre formel : corresponds to “formal parameter” en anglais

  6.  paramètre effectif : corresponds to “actual parameter” en anglais

  7.  obfuscateur : Un obfuscateur, ou assombrisseur, est un utilitaire qui transforme le bytecode en un autre bytecode équivalant, mais beaucoup plus difficile à comprendre, par élimination de tous les commentaires, remplacement des noms par d'autres, etc.

  8.  Accès au code : Nous verrons par la suite avec les spécificateurs d'accès qu'il est possible de faire croire au compilateur que le code n'est pas visible, mais de laisser le code source à disposition si quelqu'un veut s'en inspirer.

  9.  Interdire l'accès : Dans certains cas, nous violerons le principe d'encapsulation, comme dans l'exemple des beans, qui n'ont aucune logique interne et ne font que stocker et rendre les données sans jamais les modifier.

  10.  private : Nous découvrirons plus tard qu'il est possible de nuancer les restrictions d'accès au moyen d'autres mots clés comme protected, ou le niveau package (absence de mot clé).

  11.  private et classe : L'usage de private interdit l'accès aux variables depuis une autre classe, mais une autre instance de la méme classe peut y avoir accès, car la responsabilité de la manipulations des données dépend de la classe et non de l'instance.

Contents Haut

References

  1. View the nbsp;document Language of the document:fr Diviser pour régner : lien interne
  2. View the nbsp;document Language of the document:fr ADT : lien interne, Les types abstraits (Abstract Data Types)

These references and links indicate documents consulted during the writing of this page, or which may provide additional information, but the authors of these sources can not be held responsible for the content of this page.
The author This site is solely responsible for the way in which the various concepts, and the freedoms that are taken with the reference works, are presented here. Remember that you must cross multiple source information to reduce the risk of errors.

Contents Haut