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.
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 :
} }
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 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).
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.
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.
Deutsche Übersetzung
Sie haben gebeten, diese Seite auf Deutsch zu besuchen. Momentan ist nur die Oberfläche übersetzt, aber noch nicht der gesamte Inhalt.Wenn Sie mir bei Übersetzungen helfen wollen, ist Ihr Beitrag willkommen. Alles, was Sie tun müssen, ist, sich auf der Website zu registrieren und mir eine Nachricht zu schicken, in der Sie gebeten werden, Sie der Gruppe der Übersetzer hinzuzufügen, die Ihnen die Möglichkeit gibt, die gewünschten Seiten zu übersetzen. Ein Link am Ende jeder übersetzten Seite zeigt an, dass Sie der Übersetzer sind und einen Link zu Ihrem Profil haben.
Vielen Dank im Voraus.
Dokument erstellt 10/10/2009, zuletzt geändert 26/10/2018
Quelle des gedruckten Dokuments:https://www.gaudry.be/de/programmer-abstraction.html
Die Infobro ist eine persönliche Seite, deren Inhalt in meiner alleinigen Verantwortung liegt. Der Text ist unter der CreativeCommons-Lizenz (BY-NC-SA) verfügbar. Weitere Informationen auf die Nutzungsbedingungen und dem Autor.
- ↑ Implémentation : L'implémentation est le code réellement écrit.
- ↑ 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.
- ↑ Signature : Dans certains langages, comme par exemple Java, le type de retour ne fait pas partie de la signature.
- ↑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.
- ↑ paramètre formel : entspricht “formal parameter” en anglais
- ↑ paramètre effectif : entspricht “actual parameter” en anglais
- ↑ 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.
- ↑ 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.
- ↑ 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.
- ↑ 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é).
- ↑ 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.
Referenzen
Diese Verweise und Links verweisen auf Dokumente, die während des Schreibens dieser Seite konsultiert wurden, oder die zusätzliche Informationen liefern können, aber die Autoren dieser Quellen können nicht für den Inhalt dieser Seite verantwortlich gemacht werden.
Der Autor Diese Website ist allein dafür verantwortlich, wie die verschiedenen Konzepte und Freiheiten, die mit den Nachschlagewerken gemacht werden, hier dargestellt werden. Denken Sie daran, dass Sie mehrere Quellinformationen austauschen müssen, um das Risiko von Fehlern zu reduzieren.