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

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

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

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

Примеры

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

  • В Ада, выбор рандеву Конструировать как примитив синхронизации, заставляя программистов реализовывать более простые конструкции, такие как семафоры на более сложной основе.[1]
  • В Applesoft BASIC, целое число арифметика была реализована поверх арифметика с плавающей запятой, и не было побитовые операторы и нет поддержки болтовня из растровая графика (хотя язык поддерживает векторную графику на растровом оборудовании Apple II). Из-за этого игры и другие программы, написанные на BASIC, работали медленнее.
  • Как и Applesoft BASIC, Lua имеет тип с плавающей точкой как единственный числовой тип[2] при настройке для настольных компьютеров,[3] и до Lua 5.2 в нем не было побитовых операторов.[4]
  • Создание объекта для представления функции обременительно в объектно-ориентированный языки, такие как Ява и C ++ (особенно до C ++ 11 и Java 8), в которых функции не первоклассные объекты. В C ++ можно сделать объект «вызываемым», перегрузив () оператор, но по-прежнему часто необходимо реализовать новый класс, например Функторы в STL. (C ++ 11 лямбда-функция значительно упрощает создание объекта, представляющего функцию.)
  • Том Лорд предположил, что Subversion Система управления версиями оплачивает инверсию абстракции при реализации базы данных только для записи в базе данных для чтения / записи с низкой производительностью.[5]
  • С помощью хранимые процедуры манипулирование данными в реляционной базе данных без предоставления программистам права развертывать такие процедуры приводит к повторной реализации запросов вне базы данных. Например, выбираются большие наборы данных (в крайнем случае - целые таблицы), а фактическая фильтрация происходит в коде приложения. В качестве альтернативы, тысячи строк обновляются (вставляются или даже выбираются) одна за другой вместо выполнения многострочного запроса.

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

  • Использование функций поиска в электронной таблице для воспроизведения функциональности базы данных
  • Использование вариантных типов данных в качестве счетчиков циклов в Microsoft Visual Basic, где также доступен целочисленный тип.

Смотрите также

Рекомендации

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

внешняя ссылка

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