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

В компьютерном программировании , абстракция инверсия является анти-модель , возникающая , когда пользователи о необходимости построения функций , реализованных в ней , но не подвергается его интерфейс . В результате пользователи повторно реализуют требуемые функции в терминах интерфейса, который, в свою очередь, использует внутреннюю реализацию тех же функций. Это может привести к реализации функций более низкого уровня в терминах функций более высокого уровня, отсюда и термин «инверсия абстракции».

Возможные побочные эффекты:

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

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

Предполагаемые примеры из профессиональных кругов программирования включают:

  • В 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, где также доступен целочисленный тип.

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

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

  1. ^ Критика DIN Kernel Lisp Definition Version 1.2, сноска 2 Архивировано 6 мая 2018 г. на Wayback Machine - говорит (без ссылок), что этот термин происходит от критики рандеву Ada, по-видимому, является одним из самых ранних применений.
  2. ^ Программирование на Lua: 2.3 - Числа, просмотренные 12 октября 2009 г.
  3. ^ lua-users c2: Floating Point, дата обращения 12.10.2009.
  4. ^ lua-users c2: Побитовые операторы, просмотренные 15 января 2013 г.
  5. ^ sourcefrog: Том Лорд о Subversion

Внешние ссылки [ править ]

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