Abstraction

Sommaire du document

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émentation[1].

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 classes[2] Recherche et Affichage.

 

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)[3][4]

Examinons maintenant notre méthode :

  • Liste[4] 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 dossierDé;part){
  2. }
  3.  
  4. Dossier monDossier ;:= "C:\\test";
  5. Liste;sultat ;:= 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.

 

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 obfuscateurs[7] 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'utilisateur[8].

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).

 

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ésentation[9]. Le moyen en Java pour interdire l'accès aux variables est le mot clé private[10][11]. 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.

 

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.

 

Réseaux sociaux

Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher les interactions avec les réseaux sociaux sur ces pages.

 

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 : correspond à “formal parameter » en anglais

  6.  paramètre effectif : correspond à “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.

 

Références

  1. Consulter le document html Langue du document: fr Diviser pour régner : lien interne
  2. Consulter le document html Langue du document: fr ADT : lien interne, Les types abstraits (Abstract Data Types)

Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.

 

Astuce pour imprimer les couleurs des cellules de tableaux : http://www.gaudry.be/ast-rf-450.html
Aucun commentaire pour cette page

© Ce document issu de l′infobrol est enregistré sous le certificat Cyber PrInterDeposit Digital Numbertection. Enregistrement IDDN n° 5329-10654
Document créé le 10/10/09 23:46, dernière modification le Mercredi 28 Juin 2017, 15:26
Source du document imprimé : http:///www.gaudry.be/programmer-abstraction.html
St.Gaudry©07.01.02
Outils (masquer)
||
Recherche (afficher)
Recherche :

Utilisateur (masquer)
Apparence (afficher)
Stats (afficher)
15838 documents
455 astuces.
550 niouzes.
3107 definitions.
447 membres.
8121 messages.

Document genere en :
0,12 seconde

Mises à jour :
Mises à jour du site
Citation (masquer)
Celui qui aime la lecture possède tout à sa portée.

William Godwin
 
l'infobrol
Nous sommes le Vendredi 21 Juillet 2017, 06:35, toutes les heures sont au format GMT+1.00 Heure, heure d'été (+1)