Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

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

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

История [ править ]

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

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

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

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

Примеры [ править ]

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

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

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

См. Также [ править ]

  • Инверсия абстракции
  • Принцип инверсии зависимостей
  • Существенная сложность
  • Модульное программирование
  • Разделение проблем

Ссылки [ править ]

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