Запутался в определении «абстракции» в ООП

16

Я пытаюсь понять определение «абстракции» в ООП.

Я столкнулся с несколькими основными определениями. Они все действительны? Один из них не прав? Я не совсем понимаю. (Я переписал определение своими словами).

Определение 1:

Абстракция - это концепция взятия какого-либо объекта из реального мира и преобразования его в термины программирования. Такие , как создание Humanкласса и придав ему int health, int age, String nameи т.д. свойства и eat()т.д. методы.

Определение 2:

Более общее определение. Абстракция - это концепция, которая имеет место в любой части программной системы, где требуется «сделать вещи более общими / простыми / абстрактными» . Несколько примеров:

  • Иерархия наследования, где более высокие классы являются более простыми или более общими и определяют более общую и абстрактную реализацию. В то время как низшие классы в иерархии являются более конкретными и определяют более подробные реализации.

  • Использование инкапсуляции, чтобы скрыть детали реализации класса от других классов, что делает класс более «абстрактным» (более простым) для внешнего мира программного обеспечения.

Определение 3

Другое общее определение: абстракция - это концепция переноса фокуса с деталей и конкретной реализации вещей на типы вещей (то есть классов), доступные операции (то есть методы) и т. Д., Что делает программирование более простым, более общим, и более абстрактно. (Это может иметь место в любом месте и в любом контексте в программной системе). Это происходит, например, при инкапсуляции, потому что инкапсуляция означает скрывать детали реализации и показывать только типы вещей и их более общие и абстрактные определения. Другой пример - использование Listобъекта на Java. этот объект на самом деле использует детали реализации a ArrayListили a LinkedList, но эта информация абстрагируется с использованием более общего имени List.

Является ли какое-либо из этих определений правильным? (Я имею в виду наиболее общепринятые и принятые определения).

Авив Кон
источник
Абстракция определяет «вещь» как определенный ТИП вещи (Animal => Dog), чтобы сузить ее еще больше (Dog => Poodle).
Кристина

Ответы:

22

Абстракция является одним из 3 столпов объектно-ориентированного программирования (ООП). Это буквально означает воспринимать сущность в системе или контексте с определенной точки зрения. Мы вынимаем ненужные детали и фокусируемся только на тех аспектах, которые необходимы для рассматриваемого контекста или системы.

Вот хорошее объяснение:

У вас как человека разные отношения в разных ролях. Когда вы в школе, тогда вы «ученик» . Когда вы на работе, вы «сотрудник» . Когда вы находитесь в государственном учреждении, вы можете рассматриваться как «гражданин» . Таким образом, все сводится к тому, в каком контексте мы смотрим на сущность / объект. Поэтому, если я моделирую систему начисления заработной платы , я буду рассматривать вас как сотрудника (PRN, полный рабочий день / неполный рабочий день, назначение) . Если я моделирую систему регистрации на курсы , то я буду рассматривать ваши аспекты и характеристики как студента (число учеников, возраст, пол, записанный курс) . И если я моделирую информационную систему социального обеспечениятогда я рассмотрю ваши данные как гражданин (например, DOB, пол, страна рождения и т. д.)

Помните, что абстракция (фокусируясь на необходимых деталях) отличается от инкапсуляции (сокрытие деталей от внешнего мира). Инкапсуляция означает скрытие деталей объекта и обеспечение достойного интерфейса для сущностей во внешнем мире для взаимодействия с этим объектом или сущностью. Например, если кто-то хочет знать мое имя, он не может напрямую получить доступ к моим клеткам мозга, чтобы узнать, как меня зовут. Вместо этого этот человек либо спросит мое имя. Если водитель хочет ускорить транспортное средство, для этого есть интерфейс (педаль акселератора, передача и т. Д.).

1-е определение не очень понятно. Определение 2 хорошо, но оно сбивает с толку новичка, который пытается связать абстракцию с инкапсуляцией и наследованием. Определение 3 является лучшим из трех определений, поскольку оно четко определяет, что такое абстракция.

Maxood
источник
3
Так вы бы сказали, что это как обобщение, а не спецификация?
Роберт Роча
1
@ samyismyhero Точно! Мы ищем общие атрибуты и поведение объектов для абстракции.
Максуд
[Animal => Dog] - это абстракция. Вы определяете, какие возможные части "Животное" может создать "Собака". (Хвост, ноги, мех и т. Д.). Затем вы можете использовать класс «Собака» для определения пуделя, питбуля и т. Д. Итак, вы объявляете породы собак на основе класса «Собака» вместо «Животное».
Christine
3

Определение 1 определенно не является абстракцией. Это более подробно описывает моделирование .

Определения 2 и 3 описывают одно и то же. И оба являются довольно хорошими описаниями абстракции.

Euphoric
источник
Это то, о чем я думал! abstract class Shapeлол!
Роберт Роча
2

Каждое из этих определений в порядке.

Абстракция - это место, где вы концентрируетесь только на тех деталях, которые важны для вашей цели.

В первом случае вы (в настоящее время) не можете включать в свой код реальных людей; Вы сосредотачиваетесь на определенных деталях человека, который служит вашей цели. В другой программе вам может понадобиться сосредоточиться на разных деталях. Это будут разные абстракции человека, и каждый может быть одинаково действительным в своем контексте .

Второе и третье определения продолжают эту идею, применяя ее к программным объектам.

andy256
источник