web-dev-qa-db-fra.com

Qu'est-ce que l'abstraction signifie en programmation?

J'apprends le python et je ne suis pas sûr de comprendre la déclaration suivante: "La fonction (y compris son nom) peut capturer notre fragmentation mentale, ou abstraction, du problème."

C'est la partie en gras que je ne comprends pas la signification en termes de programmation. La citation vient de http://www.openbookproject.net/thinkcs/python/english3e/functions.html

Comment penser comme un informaticien, 3 édition.

Je vous remercie !

43
copper

L'abstraction est un concept fondamental dans toutes les sciences informatiques. Sans abstraction, nous programmerions toujours en code machine ou, pire encore, ne disposerions pas d'ordinateurs. Donc, à mon humble avis, c'est une très bonne question.

Qu'est-ce que abstraction _

Abstrait quelque chose signifie donnez des noms à des choses, de sorte que le nom capture l'essentiel de ce que fait une fonction ou tout un programme.

Un exemple est donné dans le livre que vous référencez, où il est dit 

Supposons que nous travaillons avec des tortues et qu’une opération courante dont nous avons besoin est dessiner des carrés. "Dessine un carré" est une abstraction, ou un morceau mental, d'un certain nombre de petites étapes. Écrivons donc une fonction pour capturer le fichier motif de ce “bloc de construction”:

Oubliez un instant les tortues et pensez simplement à dessiner un carré. Si je vous dis de dessiner un carré (sur papier), vous savez immédiatement quoi faire: 

  • dessine un carré => _ {dessine un rectangle avec tous les côtés de la même longueur. 

Vous pouvez le faire sans autre question car vous savez par cœur ce qu'est un {carré} _ sans que je vous le dise étape par étape. Ici, le mot carré est le abstraction de "dessine un rectangle avec tous les côtés de la même longueur".

Les abstractions sont profondes

Mais attendez, comment savez-vous ce qu’est un rectangle? Voilà une autre abstraction pour ce qui suit:

  • rectangle => trace deux lignes parallèles, de même longueur, puis ajoute deux autres lignes parallèles perpendiculaires aux deux autres lignes, toujours de la même longueur mais éventuellement de longueur différente des deux premières . 

Bien sûr, cela continue encore et encore - lignes, parallèle, perpendiculaire, connexion sont tous (abstractions} de bien concepts connus.

Maintenant, imaginez que chaque fois que vous voulez dessiner un rectangle ou un carré, vous devez donner la définition complète d’un rectangle, ou expliquer des lignes, des lignes parallèles, des lignes perpendiculaires et des lignes de connexion - cela prendrait beaucoup trop de temps.

Le vrai pouvoir de l'abstraction

C’est le premier puissance des abstractions: qui facilite beaucoup la conversation et l’accomplissement des tâches. 

Le second pouvoir des abstractions provient de la propriété Nice de composabilité: une fois que vous avez défini des abstractions, vous pouvez composer deux ou plusieurs abstractions pour former une nouvelle abstraction plus grande: disons que vous êtes fatigué de dessiner des carrés, mais vous voulez vraiment dessiner un maison. Supposons que nous ayons déjà défini le triangle, nous pouvons donc définir:

  • maison => dessine un carré avec un triangle dessus

Ensuite, vous voulez un village:

  • village => dessine plusieurs maisons l'une à côté de l'autre

Oh, attends, nous voulons une ville - et nous avons un nouveau concept rue:

  • ville => dessinez plusieurs villages proches les uns des autres, remplissez les espaces vides avec plus de maisons, mais laissez de la place pour rues
  • rue => (une définition de rue)

etc...

Comment cela s'applique-t-il à la programmation?

Si, au cours de la planification de votre programme (un processus appelé analyse et conception), vous trouvez de bonnes abstractions au problème que vous essayez de résoudre, vos programmes deviennent plus courts, donc plus faciles à écrire et - peut-être plus surtout - plus facile à lire. Pour ce faire, essayez d’appréhender les principaux concepts qui définissent vos problèmes - comme dans l’exemple (simplifié) de dessin d’une maison, c’était carrés et triangles, dessiner un village c’était maisons

En programmation, nous définissons les abstractions comme des fonctions (et quelques autres constructions comme des classes et des modules, mais concentrons-nous sur les fonctions pour le moment). Une fonction essentiellement noms un ensemble d'instructions simples; une fonction est donc essentiellement une abstraction - voir les exemples dans votre livre pour plus de détails.

La beauté de tout ça

En programmation, les abstractions peuvent faire ou défaire la productivité. C'est pourquoi souvent, les fonctions couramment utilisées sont rassemblées dans bibliothèques qui peuvent être réutilisées par d'autres. Cela signifie que vous n'avez pas à vous soucier des détails, vous devez seulement comprendre comment utiliser les abstractions toutes faites. Évidemment, cela devrait vous faciliter la tâche afin que vous puissiez travailler plus rapidement et donc être plus productif:

Exemple:

Imaginez qu’il existe une bibliothèque graphique appelée "nicepic" qui contient des fonctions prédéfinies pour toutes les abstractions décrites ci-dessus: rectangles, carrés, triangles, maison, village. 

Supposons que vous souhaitiez créer un programme basé sur les abstractions ci-dessus, qui trace une belle image d’une maison. Tout ce que vous avez à écrire est le suivant:

import nicepic
draw_house()

Donc, ce ne sont que deux lignes de code pour obtenir quelque chose de beaucoup plus élaboré. N'est-ce pas merveilleux?

J'espère que cela t'aides.

132
miraculixx

Les classes abstraites sont un excellent moyen de comprendre l’abstraction.

Supposons que nous écrivions un programme qui modélise une maison. La maison va avoir plusieurs pièces différentes, que nous allons représenter comme des objets. Nous définissons une classe pour une salle de bains, une cuisine, un salon, une salle à manger, etc.

Cependant, toutes ces chambres sont des chambres et partagent donc plusieurs propriétés (nombre de portes/fenêtres, pieds carrés, etc.) MAIS, une chambre ne peut jamais exister par elle-même ... il y aura toujours quelques types de la pièce.

Il est alors logique de créer une classe abstraite appelée Room, qui contiendra les propriétés que toutes les salles partagent, puis que les classes Kitchen, Living Room, etc. héritent de la classe abstract Room.

Le concept de pièce est abstrait et n'existe que dans notre tête, car toute pièce qui existe {en fait n'existe pas simplement une pièce; c'est une chambre ou un salon ou une salle de classe.

Nous voulons que notre code représente ainsi notre "découpage mental". Cela rend tout plus ordonné et plus facile à gérer.

6
dursk

Comme défini sur wikipedia: Abstraction_ (computer_science)

L'abstraction essaie de décomposer les détails d'un modèle commun afin que les programmeurs peuvent travailler au plus près du niveau de la pensée humaine, en laissant de côté détails qui importent dans la pratique, mais ne sont pas exigeants pour le problème étant résolu.

Fondamentalement, il supprime les détails du problème. Par exemple, dessiner un carré nécessite plusieurs étapes, mais je veux juste une fonction qui dessine un carré.

3
Justin Poehnelt

Le meilleur moyen de décrire quelque chose est d'utiliser des exemples:

Une fonction n’est rien de plus qu’une série de commandes permettant d’effectuer des tâches. Fondamentalement, vous pouvez organiser un morceau de code qui ne fait qu'une seule chose. Cette seule chose peut être réutilisée maintes et maintes fois dans votre programme.

Maintenant que votre fonction effectue cette opération, vous devez la nommer de manière à ce qu'elle soit immédiatement identifiable. Une fois que vous l'avez nommé, vous pouvez le réutiliser partout en appelant simplement son nom.

def bark():
  print "woof!"

Ensuite, pour utiliser cette fonction, vous pouvez simplement faire quelque chose comme:

bark();

Qu'advient-il si nous voulions que cela aboie 4 fois? Eh bien, vous pouvez écrire aboyer (); 4 fois.

bark();
bark();
bark();
bark();

Ou vous pouvez modifier votre fonction pour accepter un type d’entrée, pour changer son fonctionnement.

def bark(times):
    i=0
    while i < times:
        i = i + 1
        print "woof"

Ensuite, nous pourrions l'appeler une fois:

bark(4);

Lorsque nous commençons à parler de programmation orientée objet (POO), l’abstraction signifie autre chose. Vous découvrirez cette partie plus tard :) 

1
Steven Leggett

Supposons que vous écriviez une fonction qui reçoit un groupe de texte en paramètre, puis lit les informations d'identification dans un fichier de configuration, puis vous connecte à un serveur SMTP à l'aide de ces informations d'identification et envoie un courrier en utilisant ce texte. 

La fonction doit être nommée sendMail (text) , pas parseTextReadCredentialsInFileConnectToSmtpThenSend (text) car il est plus facile de représenter ce qu'il fait ainsi, à vous-même et lors de la présentation de l'API à des collègues ou à des utilisateurs ... bien que le deuxième nom soit plus précis, le premier est une meilleure abstraction.

0
bedane

Dans une phrase simple, je peux dire: L'essentiel de l'abstraction consiste à extraire des propriétés essentielles tout en omettant les détails non essentiels. Mais pourquoi devrions-nous omettre des détails inutiles? Le facteur de motivation clé est la prévention du risque de changement.