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