Инве́рсия абстра́кции
(
англ.
abstraction inversion
) — ошибка
проектирования
программного модуля
, когда в сложном модуле для пользователя закрыты некоторые простые, но необходимые функции. В результате пользователь модуля вынужден реализовывать простую функциональность на основе интерфейса модуля, иногда с использованием
недокументированных возможностей
и побочных эффектов, в то время когда она уже реализована внутри модуля. То есть, реализовывать более низкоуровневые функции на основе высокоуровневых, откуда и происходит термин «инверсия абстракции».
Содержание
Последствия
Функция, реализованная с инверсией абстракции, может иметь неожиданно высокие требования по памяти и времени вычисления.
Пользователям приходится писать то, что уже написано, увеличивая риск возникновения ошибок.
Не заставляйте пользователей писать то, что у вас написано.
Пользователям модуля:
Выбирайте версию модуля. Иногда проблема имеется только в более новой версии.
Неправильное применение термина
Этим словом неправильно называют сложный модуль с простым интерфейсом (что, как правило, желательно).
Иногда это навешивают как «ярлык» на ненравящуюся архитектуру.
Примеры
В
объектно-ориентированных языках программирования
простые конструкции приходится реализовывать сложными путями. Например, чтобы создать
поток
в
Java
, нужно подключить интерфейс
Runnable
и переопределить метод
run()
. Иногда это служит единственным объяснением классу.
Во многих библиотеках работы с графикой в
Windows
палитра
реализуется через
WinAPI
(даже если библиотека WinAPI не используется). В этом случае могут быть проблемы с созданием палитровых рисунков с количеством цветов, близким к 256 (так как Windows резервирует несколько цветов в палитре для собственных нужд).
Примечания
Литература
Alan Burns, Andy Wellings.
Concurrent and Real-Time Programming in Ada. — Cambridge University Press, 2007. — С. 253.