Дырявая абстракция - Leaky abstraction

В разработка программного обеспечения, а дырявая абстракция является абстракция это дает утечку деталей, которые предполагается абстрагировать.[1]

Как придумано Джоэл Спольски, то Закон дырявых абстракций состояния:[2]

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

Это утверждение подчеркивает особенно проблемную причину дефектов программного обеспечения: зависимость разработчика программного обеспечения от непогрешимости абстракции.

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

История

Термин «дырявая абстракция» был популяризирован в 2002 г. Джоэл Спольски.[2][3][неудачная проверка ] Более ранняя статья Kiczales описывает некоторые проблемы с несовершенными абстракциями и представляет потенциальное решение проблемы, позволяя настраивать саму абстракцию.[4]

Влияние на разработку программного обеспечения

По мере того как системы становятся более сложными, разработчикам программного обеспечения приходится полагаться на все больше абстракций. Каждая абстракция пытается скрыть сложность, позволяя разработчику писать программное обеспечение, которое «обрабатывает» множество вариантов современных вычислений.

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

Примеры

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

  • В TCP / IP стек протоколов - это комбинация TCP, который пытается обеспечить надежную доставку информации, работая поверх IP, который предоставляет только "максимальные усилия". Когда IP теряет пакет, TCP должен повторно передать его, что требует дополнительного времени. Таким образом, TCP обеспечивает абстракцию надежного соединения, но детали реализации просачиваются в виде потенциально изменчивой производительности (при повторной передаче данных страдают как пропускная способность, так и задержка).
  • Итерация над большим двумерным множество может иметь совершенно другую производительность, если выполняется по горизонтали, а не по вертикали, в зависимости от порядка, в котором элементы хранятся в памяти. Одно направление может значительно увеличиться промахи в кеше и ошибки страницы, оба из которых сильно задерживают доступ к памяти.
  • В SQL язык абстрагируется от процедурных шагов для запроса база данных, позволяя просто определить, чего он хочет. Но некоторые запросы SQL в тысячи раз медленнее, чем другие логически эквивалентные запросы. На еще более высоком уровне абстракции ORM Системы, которые изолируют объектно-ориентированный код от реализации сохраняемости объектов с использованием реляционной базы данных, по-прежнему заставляют программиста думать в терминах баз данных, таблиц и собственных SQL-запросов, как только производительность запросов, сгенерированных ORM, становится проблемой.
  • Хотя сетевые файловые системы вроде NFS и SMB Позвольте обрабатывать файлы на удаленных машинах, как если бы они были локальными, соединение с удаленной машиной может замедлиться или прерваться, и файл перестанет действовать, как если бы он был локальным.
  • В ASP.NET Платформа программирования веб-форм, не путать с ASP.NET MVC, абстрагирует разницу между кодом HTML для обработки щелчка по гиперссылке () и кодом для обработки нажатия кнопки. Однако ASP.NET необходимо скрыть тот факт, что в HTML нет возможности отправить форму по гиперссылке. Для этого он генерирует несколько строк JavaScript и прикрепляет по щелчку обработчик гиперссылки. Однако, если у конечного пользователя отключен JavaScript, приложение ASP.NET работает неправильно. Кроме того, нельзя наивно думать об обработчиках событий в ASP.NET так же, как в среде графического интерфейса рабочего стола, такой как Windows Forms; из-за асинхронной природы Интернета обработка обработчиков событий в ASP.NET требует обмена данными с сервером и перезагрузки формы.

Интерфейс Git - еще один пример дырявой абстракции, как описано в этой статье.[5]

Смотрите также

Рекомендации

  1. ^ Сейбел, Питер (1 ноября 2006 г.). Практический Common Lisp. Апресс. п. 96. ISBN  978-1-4302-0017-8.
  2. ^ а б Спольски, Джоэл (2002). "Закон дырявых абстракций". Получено 2010-09-22.
  3. ^ arvindpdmn (23.08.2019). «Дырявые абстракции». Девопедия. Получено 2020-07-07.
  4. ^ Кичалес, Грегор (1992). «К новой модели абстракции в разработке программного обеспечения» (PDF). Архивировано из оригинал (PDF) на 2011-06-04. Получено 2010-02-03.
  5. ^ «Контроль версий (Git)». недостающий семестр вашего cs образования. Получено 2020-07-31.