AndreyMelnikov.MyBlog # мой блог: IT-марафон.

Все мои посты

Вселенная программирования. Ключевые концепции ч5 - Абстракция данных.

Заключительная из рассматриваемых ключевых концепций программирования – абстракция данных.

На самом деле, умение правильно выстраивать и далее работать с абстракциями, уже само по себе очень мощный скилл для программиста. Это, как с языками программирования. Есть низкоуровневые, например, Ассемблер, а есть высокоуровневые, например, Питон.
Так вот, суть абстракции - скрыть реализацию мелких деталей, оставив на поверхности самые главные составляющие общей картины.
Простыми словами, абстракция – это высокоуровневое представление какой-либо системы в виде модели. Ну а если не простыми словами, то читаем дальше:)

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

В этом случае для программной системы мы имеем:

  • Гарантию, что абстракция данных работает корректно, т.к интерфейс задает набор авторизованных операций над структурой данных, и никакие другие действия над ней недопустимы.
  • Система может быть разделена на множества отдельных абстракций, реализованных независимо.
  • Мы имеем возможность разделить процесс разработки между большим кол-вом людей. За каждую абстракцию отвечает свой разработчик.

Парадигма ООП базируется на абстракциях данных с наследованием и полиморфизмом.
Можно получить четыре способа организации абстракций данных, если скомпоновать их ключевые характеристики в зависимости от:

  • использования или не использования именованного состояния.
  • объединения физических данных в одну сущность (класс/пакет) или сохранения их разделенными (АТД – абстрактный класс или интерфейс).

Первые два варианта наиболее часто встречаются нам на практике:

1) Объект. Объединив пакет с именованным состоянием, получаем классический, объект в Java или Python: внутренние поля-идентификаторы задают состояние, а методы - это выполняемые над ним операции.

2) Абстрактный тип данных (АТД) – очень хорошая реализация концепции абстракции данных для ООП. Это Противоположный случай, когда мы используем абстрактный тип данных, отделённый от операций (например, тип Integer в Java). Целые числа представляются конкретными значениями (1, 2, 3, …), которые можно передавать в качестве аргументов внешним операциям (+, -, *, / …). Притом какие-либо промежуточные состояния значений (непосредственных чисел 1,2,3,…), не допускаются. Таким образом, мы имеем классический АТД.

А вот два других случая встречаются реже:

3) АТД с именованным состоянием (например, частично реализованный класс).

4) Декларативный объект (когда есть только описание объекта, но состояния он не содержит)

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

Я также могу привести собственный пример использования концепции абстракции данных. Вот ссылочка на мой гитхаб, где я организовывал различные структуры данных, через концепцию АТД.

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

Назад к списку постов