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

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Инве́рсия абстра́кции (abstraction inversion) — ошибка проектирования программного модуля, когда в сложном модуле для пользователя закрыты простые, но нужные функции. В результате пользователю приходится писать простую функциональность, надстраивая её над сложной, иногда с использованием недокументированных возможностей и побочных эффектов, в то время когда она уже написана.

Последствия[править | править исходный текст]

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

Как обойти[править | править исходный текст]

Разработчикам модуля:

  • Если в модуле есть сходные функции (например, критическая секция и мютекс), тщательно выясните, что писать с нуля, и что делать «обёрткой».
  • Не заставляйте пользователей писать то, что у вас написано.

Пользователям модуля:

  • Выбирайте, какой модуль использовать. Иногда более новая версия имеет эту проблему, в то время как более старая свободна от неё.

Неправильное применение термина[править | править исходный текст]

  • Этим словом неправильно называют сложный модуль с простым интерфейсом (что, как правило, желательно).
  • Иногда это навешивают как «ярлык» на ненравящуюся архитектуру.

Примеры[править | править исходный текст]

  • В объектно-ориентированных языках программирования простые конструкции приходится реализовывать сложными путями. Например, чтобы создать поток в Java, нужно подключить интерфейс Runnable и переопределить метод run(). Иногда это служит единственным объяснением классу.
  • Во многих библиотеках работы с графикой в Windows палитра реализуется через WinAPI (даже если библиотека WinAPI не используется). В этом случае могут быть проблемы с созданием палитровых рисунков с количеством цветов, близким к 256 (так как Windows резервирует несколько цветов в палитре для собственных нужд).