Инверсия абстракции
В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
В компьютерном программировании инверсия абстракции — это антишаблон, возникающий, когда пользователям конструкции нужны функции, реализованные внутри нее, но не предоставляемые ее интерфейсом . В результате пользователи повторно реализуют необходимые функции в терминах интерфейса, который, в свою очередь, использует внутреннюю реализацию тех же функций. Это может привести к реализации функций более низкого уровня в терминах функций более высокого уровня, отсюда и термин «инверсия абстракции».
Возможные негативные последствия:
- Пользователь такой повторно реализованной функции может серьезно недооценить ее эксплуатационные расходы.
- Пользователь конструкции вынужден скрывать ее реализацию сложными механическими деталями.
- Многие пользователи пытаются решить одну и ту же проблему, что увеличивает риск ошибки.
Примеры
[ редактировать ]Предполагаемые примеры из профессиональных кругов программирования включают:
- В Ada выбор конструкции рандеву в качестве примитива синхронизации заставил программистов реализовывать более простые конструкции, такие как семафоры, на более сложной основе. [1]
- В Applesoft BASIC целочисленная арифметика была реализована поверх арифметики с плавающей запятой , и не было побитовых операторов и поддержки копирования растровой графики (хотя язык поддерживал векторную графику на растровом оборудовании Apple II). Из-за этого игры и другие программы, написанные на BASIC, работали медленнее.
- Как и Applesoft BASIC, Lua имеет тип с плавающей запятой в качестве единственного числового типа. [2] при настройке для настольных компьютеров, [3] и до Lua 5.2 в нем не было побитовых операторов. [4]
- Создание объекта для представления функции является трудоемким процессом в объектно-ориентированных языках, таких как Java и C++ (особенно до C++11 и Java 8), в которых функции не являются объектами первого класса . В C++ можно сделать объект «вызываемым», перегрузив
()
оператор, но по-прежнему часто необходимо реализовать новый класс, такой как Functors в STL . ( Лямбда-функция C++11 значительно упрощает создание объекта, представляющего функцию.) - Том Лорд предположил, что система контроля версий Subversion платит за инверсию абстракции, заключающуюся в реализации базы данных, доступной только для записи, в базе данных для чтения/записи с низкой производительностью. [5]
- Использование хранимых процедур для манипулирования данными в реляционной базе данных без предоставления программистам права развертывать такие процедуры приводит к повторной реализации запросов за пределами базы данных. Например, извлекаются большие наборы данных (в крайнем случае — целые таблицы), а фактическая фильтрация происходит в коде приложения. Альтернативно, тысячи строк обновляются (вставляются или даже извлекаются) одна за другой вместо выполнения запроса из нескольких строк.
- от Microsoft WinUI 3 систематически заменяет строку заголовка создаваемых ею окон на собственную, которая игнорирует настройки цвета конечного пользователя и вместо этого всегда отображается серым. Для применения цвета, выбранного конечным пользователем, к строке заголовка требуется использование дополнительного кода настройки в Windows 11 и полная замена пользовательской строки заголовка другой настраиваемой в Windows 10. [6]
Примеры, распространенные за пределами профессиональных кругов программирования, включают:
- Использование функций поиска в электронных таблицах для репликации функциональности базы данных.
- Использование вариантов типов данных в качестве счетчиков циклов в Microsoft Visual Basic, где также доступен целочисленный тип.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Критика определения DIN Kernel Lisp версии 1.2, сноска 2. Архивировано 6 мая 2018 г. в Wayback Machine Ады - говорится (без ссылок), что этот термин возник из критики рандеву и, по-видимому, является одним из самых ранних применений.
- ^ Программирование на Lua: 2.3 - Номера доступны 12 октября 2009 г.
- ^ lua-users c2: Доступ с плавающей запятой 12 октября 2009 г.
- ^ lua-users c2: Доступ к побитовым операторам 15 января 2013 г.
- ^ sourcefrog: Том Лорд о Subversion
- ^ Настройка строки заголовка — Приложения для Windows | Microsoft Обучение
Внешние ссылки
[ редактировать ]- Инверсия абстракции в репозитории шаблонов Портленда - обширное обсуждение, большая часть которого касается «инверсии абстракции» в смысле «скрытой сложности».