Дырявая абстракция
Эта статья нуждается в дополнительных цитатах для проверки . ( март 2011 г. ) |
В разработке программного обеспечения дырявая абстракция — это абстракция , из которой утекают детали, которые она должна абстрагировать. [1]
сформулированный Джоэлом Спольски , Закон дырявых абстракций, гласит: [2]
Все нетривиальные абстракции в той или иной степени дырявы.
Это утверждение подчеркивает особенно проблемную причину дефектов программного обеспечения: уверенность разработчика программного обеспечения в безошибочности абстракции.
В статье Спольски приводятся примеры абстракции, которая работает большую часть времени, но в которой нельзя игнорировать детали базовой сложности, что приводит к утечке сложности из абстракции обратно в программное обеспечение, которое ее использует.
История
[ редактировать ]Термин «дырявая абстракция» был популяризирован в 2002 году Джоэлом Спольски . [2] [3] В статье Кичалеса 1992 года описаны некоторые проблемы, связанные с несовершенными абстракциями, и представлено потенциальное решение проблемы, позволяющее настраивать саму абстракцию. [4]
Влияние на разработку программного обеспечения
[ редактировать ]Поскольку системы становятся более сложными, разработчикам программного обеспечения приходится полагаться на большее количество абстракций. Каждая абстракция пытается скрыть сложность, позволяя разработчику писать программное обеспечение, которое «обрабатывает» множество вариантов современных вычислений.
Однако этот закон утверждает, что разработчики надежного программного обеспечения в любом случае должны изучить основные детали абстракции.
Примеры
[ редактировать ]Спольски В статье приводится множество примеров дырявых абстракций, которые создают проблемы при разработке программного обеспечения:
- Стек протоколов TCP/IP представляет собой комбинацию TCP , которая пытается обеспечить надежную доставку информации, работающую поверх IP , который предоставляет только услуги «наилучшего качества». Когда IP теряет пакет, TCP должен передать его повторно, что занимает дополнительное время. Таким образом, TCP обеспечивает абстракцию надежного соединения, но детали реализации просачиваются в виде потенциально изменяющейся производительности (когда данные должны быть переданы повторно), страдает пропускная способность и задержка, и соединение все равно может полностью разорваться.
- Итерация по большому двумерному массиву может иметь совершенно разную производительность, если выполняется горизонтально, а не вертикально, в зависимости от порядка, в котором элементы хранятся в памяти. Одно направление может значительно увеличить количество промахов в кэше и ошибок страниц , которые значительно задерживают доступ к памяти.
- Язык SQL абстрагирует процедурные этапы запроса к базе данных , позволяя пользователю просто определить, что он хочет. Но некоторые SQL-запросы выполняются в тысячи раз медленнее, чем другие логически эквивалентные запросы. На еще более высоком уровне абстракции системы ORM , которые изолируют объектно-ориентированный код от реализации персистентности объектов с использованием реляционной базы данных, по-прежнему заставляют программиста думать в терминах баз данных, таблиц и собственных SQL-запросов, как только выполнение Запросы, генерируемые ORM, становятся проблемой.
- Хотя сетевые файловые системы, такие как NFS и SMB, позволяют обращаться с файлами на удаленных машинах так, как если бы они были локальными, соединение с удаленной машиной может замедлиться или прерваться, и файл перестанет вести себя так, как если бы он был локальным.
- Платформа программирования веб-форм ASP.NET , которую не следует путать с ASP.NET MVC, абстрагирует разницу между скомпилированным внутренним кодом для обработки щелчка по гиперссылке (
<a>
) и код для обработки нажатия кнопки. Однако ASP.NET необходимо скрывать тот факт, что в HTML нет возможности отправить форму по гиперссылке. Для этого он генерирует несколько строк JavaScript и присоединяет onclick к гиперссылке обработчик . Однако если у конечного пользователя отключен JavaScript, приложение ASP.NET будет работать со сбоями. Более того, нельзя наивно думать об обработчиках событий в ASP.NET так же, как в среде настольного графического интерфейса, такой как Windows Forms ; из-за асинхронной природы Интернета обработка обработчиков событий в ASP.NET требует обмена данными с сервером и перезагрузки формы.
В 2020 году Массачусетского технологического института преподаватели информатики Аниш, Хосе и Джон утверждали, что интерфейс командной строки для git — это дырявая абстракция, в которой для эффективного использования необходимо понимать лежащий в основе «красивый дизайн» модели данных git. из git. [5]
См. также
[ редактировать ]- Инверсия абстракции
- Принцип инверсии зависимостей
- Существенная сложность
- Модульное программирование
- Разделение интересов
Ссылки
[ редактировать ]- ^ Сейбель, Питер (1 ноября 2006 г.). Практический Common Lisp . Апресс. п. 96. ИСБН 978-1-4302-0017-8 .
- ^ Перейти обратно: а б Спольски, Джоэл (2002). «Закон дырявых абстракций» . Проверено 22 сентября 2010 г.
- ^ арвиндпдмн (23 августа 2019 г.). «Дырявые абстракции» . Девопедия . Проверено 7 июля 2020 г.
- ^ Кицалес, Грегор (1992). «На пути к новой модели абстракции в разработке программного обеспечения» (PDF) . Архивировано из оригинала (PDF) 4 июня 2011 г. Проверено 3 февраля 2010 г.
- ^ «Контроль версий (Git)» . недостающий семестр вашего обучения в области компьютерных наук . Проверено 31 июля 2020 г.