web-dev-qa-db-fra.com

Confus au sujet de la définition de «abstraction» dans OOP

J'essaie de comprendre la définition de "l'abstraction" dans la POO.

J'ai rencontré quelques définitions principales. Sont-ils tous valables? Est-ce que l'un d'eux a tort? Je suis confus. (J'ai réécrit la définition avec mes propres mots).

Définition 1:

L'abstraction est le concept de prendre un objet du monde réel et de le convertir en termes de programmation. Par exemple, créer une classe Human et lui donner les propriétés int health, int age, String name, Etc. et les méthodes eat() etc. .

Définition 2:

Une définition plus générale. L'abstraction est un concept qui se déroule n'importe où dans un système logiciel où 'rendant les choses plus générales/plus simples/abstraites' est impliqué. Quelques exemples:

  • Une hiérarchie d'héritage, où les classes supérieures sont plus simples ou plus générales, et définissent une implémentation plus générale et abstraite. Alors que les classes inférieures de la hiérarchie sont plus concrètes et définissent des implémentations plus détaillées.

  • Utiliser l'encapsulation pour cacher les détails de l'implémentation d'une classe aux autres classes, rendant ainsi la classe plus "abstraite" (plus simple) pour le monde logiciel extérieur.

Définition

Une autre définition générale: l'abstraction est le concept de déplacer le focus des détails et de la mise en œuvre concrète des choses, vers les types de choses (par exemple les classes), les opérations disponibles (par exemple les méthodes), etc., rendant ainsi la programmation plus simple, plus générale, et plus abstrait. (Cela peut avoir lieu n'importe où et dans n'importe quel contexte dans le système logiciel). Elle a lieu par exemple lors de l'encapsulation, car l'encapsulation signifie cacher les détails de l'implémentation et n'afficher que les types de choses et leurs définitions plus générales et abstraites. Un exemple anotehr serait d'utiliser un objet List en Java. cet objet utilise en fait les détails d'implémentation d'un ArrayList ou d'un LinkedList, mais ces informations sont abstraites en utilisant le nom plus général List.

L'une de ces définitions est-elle correcte? (Je fais référence à la définition la plus conventionnelle et acceptée).

18
Aviv Cohn

L'abstraction est l'un des 3 piliers de la programmation orientée objet (POO). Cela signifie littéralement de percevoir une entité dans un système ou un contexte dans une perspective particulière. Nous supprimons les détails inutiles et nous nous concentrons uniquement sur les aspects nécessaires au contexte ou au système considéré.

Voici une bonne explication:

En tant que personne, vous avez des relations différentes dans des rôles différents. Lorsque vous êtes à l'école, vous êtes alors "étudiant". Lorsque vous êtes au travail, vous êtes un "Employé". Lorsque vous êtes dans une institution gouvernementale, vous pouvez être considéré comme un "Citoyen". Cela se résume donc à ce dans quel contexte regardons-nous une entité/un objet. Donc, si je modélise un système de paie , je vais vous regarder comme un ( Employé (PRN, Temps plein/Temps partiel, Désignation) . Si je modélise un Système d'inscription aux cours , alors je considérerai vos aspects et caractéristiques comme --- Étudiant (numéro de rôle, âge, sexe, cours inscrit) . Et si je modélise un Système d'Information de Sécurité Sociale alors je regarderai vos détails comme --- Citoyen (comme DOB, sexe, pays de naissance, etc.)

Rappelez-vous que l'abstraction (en se concentrant sur les détails nécessaires) est différente de l'encapsulation (en cachant les détails du monde extérieur). L'encapsulation signifie cacher les détails de l'objet et fournir une interface décente aux entités du monde extérieur pour interagir avec cet objet ou cette entité. Par exemple, si quelqu'un veut connaître mon nom, il ne peut pas accéder directement à mes cellules cérébrales pour savoir quel est mon nom. Au lieu de cela, cette personne demandera mon nom. Si un conducteur souhaite accélérer un véhicule, il existe une interface (pédale d'accélérateur, vitesse, etc.) à cet effet.

La 1ère déf. N'est pas très claire. La Def 2 est bonne mais elle a tendance à confondre le débutant car elle essaie de lier l'abstraction à l'encapsulation et à l'héritage. Def 3 est la meilleure des 3 définitions car elle définit clairement ce qu'est l'abstraction avec précision.

23
Maxood

La définition 1 n'est certainement pas une abstraction. Cela décrit plus précisément modélisation .

Les définitions 2 et 3 décrivent la même chose. Et les deux sont de très bonnes descriptions d'une abstraction.

3
Euphoric

Chacune de ces définitions est très bien.

L'abstraction est l'endroit où vous vous concentrez uniquement sur les détails qui sont importants pour votre objectif.

Dans le premier cas, vous (actuellement) ne pouvez pas inclure de vraies personnes dans votre code; vous vous concentrez sur des détails particuliers d'une personne qui répondent à votre objectif. Dans un autre programme, vous devrez peut-être vous concentrer sur différents détails. Ce seraient des abstractions différentes d'une personne, et chacune peut être également valable dans leur contexte.

Les deuxième et troisième définitions poursuivent cette idée en l'appliquant aux entités logicielles.

2
andy256