Уровень абстракции (программирование): различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
→‎Примеры: стилевые правки
обновление
Строка 27: Строка 27:
</ref>
</ref>
это часто неверно цитируется с заменой «окольного пути» на «абстракцию». Продолжение от Кевлина Хенни гласит «…за исключением проблем с большим уровнем косвенности.»
это часто неверно цитируется с заменой «окольного пути» на «абстракцию». Продолжение от Кевлина Хенни гласит «…за исключением проблем с большим уровнем косвенности.»

=== [https://github.com/HowProgrammingWorks/AbstractionLayers/tree/master/JavaScript Cлои Абстракций / Abstraction Layer] в JavaScript ===
Абстракция - обобщенное решение задачи, которое в отличие от конкретного решения, подходит для широкого круга задач.

Примеры абстракций: алгоритмы, массивы, дерево, сокет, файлы и т. д. - все что связано с многозадачностью. Почти все в JavaScript является абстракцией.

Абстракция делиться на слои.

На примере <code>[https://github.com/HowProgrammingWorks/AbstractionLayers/blob/master/JavaScript/badServer.js badServer.js]</code> просматриваются разные смешанные слоя абстракции и можно заметить такие функциональные блоки:
# Слой доступа к данным (в этом примере - работы с файловой системой)
# Парсинг, сериализация и десериализация
# Сервер HTTP 3.1. Кеширование ответов 3.2. Работа с Cookie 3.3. Склеивание буфера 3.4. Логирование вызовов 3.5. Маршрутизация обработки запросов
# Бизнес-логика, относящаяся к предметной области
# Управление зависимостями
# Конфигурирование (например, порт и хост)
# Подстановка переменных в шаблоны
На этом же примере видно, что структура кода очень важна. Лучше не смешивать разные слоя абстракции и не сцеплять функциональные блоки, так как код становиться однородным.

На примере <code>[https://github.com/HowProgrammingWorks/AbstractionLayers/blob/master/JavaScript/goodServer.js goodServer.js]</code> мы можем увидеть преимущество расслоения и грамотное проектирование структуры кода.Такой код более читабельный и занимает меньше места, его проще поддерживать и расширять.


== Иерархия уровней ==
== Иерархия уровней ==

Версия от 16:25, 10 января 2018

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

Примеры

Примеры моделей программного обеспечения, использующих уровни абстракции, включают в себя семиуровневую модель OSI для протоколов передачи данных компьютерных сетей, библиотеку графических примитивов OpenGL, модель ввода-вывода на основе потоков байтов из Unix, применяемую в MS DOS, Linux и во многих других современных операционных системах.

В операционной системе Unix большинство типов операций ввода-вывода рассматриваются как потоки байтов, считываемые или записываемые на устройство. Эта модель потока байтов используется для ввода-вывода в файл, сокет и компьютерный терминал, чтобы обеспечить независимость от устройства ввода-вывода. Для чтения и записи в устройство на уровне приложения программа вызывает функцию открытия устройства, которое может соответствовать реальному устройству, например, терминалу или виртуальному устройству, например, сетевому порту или файлу в файловой системе. Физические характеристики устройства передаются операционной системе, которая, в свою очередь, предоставляет абстрактный интерфейс, позволяющий программисту считывать и записывать байты в устройство. Операционная система затем выполняет действия, необходимые для работы с конкретным устройством.

Большинство графических библиотек, например, OpenGL, предоставляют в качестве интерфейса абстрактную графическую модель. Библиотека отвечает за трансляцию команд программы в специальные команды устройства, необходимые для прорисовки графических элементов и объектов. Специальные команды для графопостроителя отличаются от команд для монитора, но графическая библиотека скрывает зависящие от устройства детали реализации, предоставляя абстрактный интерфейс, содержащий набор примитивов, общеупотребимых для рисования графических объектов.

В проблемно-ориентированном проектировании крупномасштабная структура (предметной области) может использовать шаблон уровни ответственности (англ. responsibility layers). Например, модель предметной области может быть разделена на уровни (сверху вниз) «Поддержка принятия решений», «Операции» и «Производственные возможности», при котором сущности более высокого уровня опираются на сущности более низкого, но нижний уровень не зависит от верхнего[1].

Известный афоризм Дэвида Уилера гласит: Все проблемы в информатике можно решить на другом уровне окольным путём;[2] это часто неверно цитируется с заменой «окольного пути» на «абстракцию». Продолжение от Кевлина Хенни гласит «…за исключением проблем с большим уровнем косвенности.»

Cлои Абстракций / Abstraction Layer в JavaScript

Абстракция - обобщенное решение задачи, которое в отличие от конкретного решения, подходит для широкого круга задач.

Примеры абстракций: алгоритмы, массивы, дерево, сокет, файлы и т. д. - все что связано с многозадачностью. Почти все в JavaScript является абстракцией.

Абстракция делиться на слои.

На примере badServer.js просматриваются разные смешанные слоя абстракции и можно заметить такие функциональные блоки:

  1. Слой доступа к данным (в этом примере - работы с файловой системой)
  2. Парсинг, сериализация и десериализация
  3. Сервер HTTP 3.1. Кеширование ответов 3.2. Работа с Cookie 3.3. Склеивание буфера 3.4. Логирование вызовов 3.5. Маршрутизация обработки запросов
  4. Бизнес-логика, относящаяся к предметной области
  5. Управление зависимостями
  6. Конфигурирование (например, порт и хост)
  7. Подстановка переменных в шаблоны

На этом же примере видно, что структура кода очень важна. Лучше не смешивать разные слоя абстракции и не сцеплять функциональные блоки, так как код становиться однородным.

На примере goodServer.js мы можем увидеть преимущество расслоения и грамотное проектирование структуры кода.Такой код более читабельный и занимает меньше места, его проще поддерживать и расширять.

Иерархия уровней

Часто уровни абстракции организуются в иерархию уровней абстракции. Сетевая модель OSI содержит семь уровней абстракции. Каждый уровень модели OSI ISO рассматривает отдельную часть требований по организации связи, сокращая таким образом сложность соответствующих инженерных решений.

Дырявые абстракции

В идеале абстракция полностью защищает вышележащий уровень от деталей реализации нижележащего. Тем не менее, в более или менее сложных случаях добиться идеала почти невозможно, что и выразил Джоэл Спольски в виде закона дырявых абстракций  (англ.)[3][4]:

Все нетривиальные абстракции дырявы.

Архитектура компьютера

С точки зрения архитектуры компьютера система часто представляется моделью из пяти уровней абстракции: компьютерная техника (см. слой аппаратных абстракций), прошивка, язык ассемблера, ядро операционной системы и приложения.[5]

Примечания

  1. Evans E. Responsibility Layers // Domain-Driven Design - Tackling Complexity in the Heart of Software. — Addison-Wesley, 2003. — ISBN 978-0-321-12521-7.
  2. Diomidis Spinellis. Another level of indirection. In Andy Oram and Greg Wilson, editors, Beautiful Code: Leading Programmers Explain How They Think, chapter 17, pages 279—291. O’Reilly and Associates, Sebastopol, CA, 2007.
  3. Spolsky, Joel The Law of Leaky Abstractions (2002). Дата обращения: 22 сентября 2010.
  4. Спольски, Джоэл Закон Дырявых Абстракций.
  5. Tanenbaum, Andrew S. Structured Computer Organization. — Englewood Cliffs, New Jersey : Prentice-Hall, 1979. — ISBN 0-13-148521-0.

Ссылки