Протекающая абстракция

Материал из wikixw
Перейти к навигации Перейти к поиску

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

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

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

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

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

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

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

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

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

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

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

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

Стек протоколов TCP / IP представляет собой комбинацию протокола TCP, который пытается обеспечить надежную доставку информации, выполняемую поверх IP, который обеспечивает обслуживание только по принципу "наилучших усилий". Когда IP теряет пакет, TCP должен повторно передать его, что требует дополнительного времени. :Таким образом, TCP обеспечивает абстракцию надежного соединения, но детали реализации просачиваются в виде потенциально изменяющейся производительности (пропускная способность и задержка страдают при повторной передаче данных), и соединение все еще может полностью прерваться.

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

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

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

Инверсия абстракции

Пруф[править]

devopedia.org/leaky-abstractions