Confundido sobre la definición de 'abstracción' en OOP

16

Estoy tratando de entender la definición de 'abstracción' en OOP.

Me he encontrado con algunas definiciones principales. ¿Son todos válidos? ¿Uno de ellos está equivocado? Estoy confundido. (Reescribí la definición con mis propias palabras).

Definición 1:

La abstracción es el concepto de tomar algún objeto del mundo real y convertirlo en términos de programación. Como la creación de una Humanclase y dándole int health, int age, String name, etc. propiedades y eat()etc. métodos.

Definición 2:

Una definición más general. La abstracción es un concepto que tiene lugar en cualquier parte de un sistema de software donde está involucrado 'hacer que las cosas sean más generales / más simples / abstractas' . Algunos ejemplos:

  • Una jerarquía de herencia, donde las clases más altas son más simples o más generales, y definen una implementación más general y abstracta. Mientras que las clases más bajas en la jerarquía son más concretas y definen implementaciones más detalladas.

  • Usar la encapsulación para ocultar los detalles de implementación de una clase de otras clases, haciendo así que la clase sea más 'abstracta' (más simple) para el mundo del software externo.

Definición 3

Otra definición general: la abstracción es el concepto de mover el foco de los detalles y la implementación concreta de las cosas, a los tipos de cosas (es decir, clases), las operaciones disponibles (es decir, métodos), etc., haciendo así la programación más simple, más general, y más abstracto (Esto puede tener lugar en cualquier lugar y en cualquier contexto en el sistema de software). Se lleva a cabo, por ejemplo, al encapsular, porque encapsular significa ocultar los detalles de la implementación y solo mostrar los tipos de cosas y sus definiciones más generales y abstractas. El ejemplo de Anotehr sería usar un Listobjeto en Java. este objeto en realidad usa los detalles de implementación de an ArrayListo a LinkedList, pero esta información se abstrae usando el nombre más general List.

¿Alguna de estas definiciones es correcta? (Me refiero a la definición más convencional y aceptada ).

Aviv Cohn
fuente
La abstracción es definir una "cosa" como un cierto TIPO de cosa (Animal => Perro) para reducirla aún más (Perro => Caniche).
Christine

Respuestas:

22

La abstracción es uno de los 3 pilares de la Programación Orientada a Objetos (OOP). Literalmente significa percibir una entidad en un sistema o contexto desde una perspectiva particular. Eliminamos detalles innecesarios y solo nos enfocamos en aspectos que son necesarios para ese contexto o sistema en consideración.

Aquí hay una buena explicación:

Usted como persona tiene diferentes relaciones en diferentes roles. Cuando estás en la escuela, entonces eres un "Estudiante" . Cuando estás en el trabajo, eres un "Empleado" . Cuando se encuentra en una institución gubernamental, puede ser visto como un "ciudadano" . Por lo tanto, se reduce a qué en qué contexto estamos mirando una entidad / objeto. Entonces, si estoy modelando un sistema de nómina , lo veré como un empleado (PRN, tiempo completo / tiempo parcial, designación) . Si estoy modelando un Sistema de Inscripción de Curso , entonces consideraré sus aspectos y características como Estudiante (Número de Lista, Edad, Género, Curso Inscrito) . Y si estoy modelando un Sistema de Información de Seguridad Socialluego veré sus datos como ciudadano (como fecha de nacimiento, género, país de nacimiento, etc.)

Recuerde que la abstracción (centrarse en los detalles necesarios) es diferente de la encapsulación (ocultar detalles del mundo exterior). La encapsulación significa ocultar los detalles del objeto y proporcionar una interfaz decente para que las entidades del mundo exterior interactúen con ese objeto o entidad. Por ejemplo, si alguien quiere saber mi nombre, entonces no puede acceder directamente a mis células cerebrales para saber cuál es mi nombre. En cambio, esa persona preguntará mi nombre. Si un conductor quiere acelerar un vehículo, entonces hay una interfaz (pedal del acelerador, marcha, etc.) para ese propósito.

La primera definición no está muy clara. Def 2 es bueno, pero tiende a confundir al novato cuando trata de vincular Abstracción con Encapsulación y Herencia. Def 3 es la mejor de las 3 definiciones, ya que define claramente lo que es la abstracción con precisión.

Maxood
fuente
3
¿Entonces diría que es como una generalización en lugar de una especificación?
Robert Rocha
1
@samyismyhero ¡Exactamente! Buscamos atributos genéricos y el comportamiento de los objetos para la abstracción.
Maxood
[Animal => Perro] es una abstracción. Usted define qué partes posibles puede tener un "Animal" para crear un "Perro". (Cola, patas, pelaje, etc.). Luego, puede usar la clase "Perro" para definir un Poodle, Pit Bull, etc. Entonces, está declarando razas de perros basadas en la clase "Perro" en lugar de un "Animal".
Christine
3

La definición 1 definitivamente no es una abstracción. Eso describe más de cerca el modelado .

Las definiciones 2 y 3 describen lo mismo. Y ambas son descripciones bastante buenas de una abstracción.

Eufórico
fuente
¡Es lo que pensaba! abstract class Shapejajaja
Robert Rocha
2

Cada una de estas definiciones está bien.

La abstracción es donde te enfocas solo en aquellos detalles que son importantes para tu propósito.

En el primer caso, usted (actualmente) no puede incluir personas reales en su código; te enfocas en detalles particulares de una persona que sirven a tu propósito. En otro programa, es posible que deba centrarse en diferentes detalles. Estas serían diferentes abstracciones de una persona, y cada una puede ser igualmente válida en su contexto. .

Las definiciones segunda y tercera continúan esta idea, aplicándola a entidades de software.

andy256
fuente