Слой абстракции и уровень косвенности - это разные понятия. Абстракция - это агрегация и осмысленное именование ряда элементов, таких как фрагменты данных или программные инструкции, например концепция вызова файла или метода, тогда как косвенное обращение - это разделение сущностей для облегчения отсрочки реализации их отношений, например, использование JNDI для отделения идентификации ресурса в программе от фактического ресурса, который в конечном итоге может быть предоставлен контейнером приложения.
Часто концепции идут рука об руку, и то, какое из них применимо к конкретной конструкции, зависит от того, какое упражнение или обсуждение ведутся. Например, абстрактная природа интерфейса важна при изучении или документировании API; его свойство косвенности важно при добавлении расширяемости или создании тестов для приложения.
Слой абстракции - это агрегация абстракций и придание им концептуальной целостности и последовательности использования. CreateProcess - это имя Win32 API для набора кода, который создает и выполняет процесс. «Имя» имеет важное значение для этого контекста, потому что если бы мы назвали функцию чем-то вроде DoAllocMemThenMakeEnvThenFindEntryPoint ... это действительно было бы не очень абстрактно. Слой, такой как Win32 API, обеспечивает барьер, через который программист может посоветовать не рисковать. Это устраняет сложность с точки зрения вызывающего абонента за счет снижения энергопотребления (гибкость, производительность и т. Д.). Этот компромисс подчеркивается частым обсуждением неплотных абстракций: нам все еще может потребоваться сделать прямые вызовы SQL при использовании Hibernate или вызовы Win32 при использовании .NET.
Что касается косвенного обращения, большинство нетривиальных программ работают с некоторой формой пользовательского кодированного косвенного обращения, о чем свидетельствует раздел INBUT-OUTPUT COBOL, который был до ковчега. При доступе к ресурсу, такому как база данных, мы можем видеть встраивание строки соединения JDBC в код как косвенное указание уровня 0, соединение JNDI (которое делегирует выбор ресурса в контейнер приложения) в качестве уровня 1 и некоторую конструкцию Spring, которая отображает идентификатор JNDI приложения для одного из многих контейнерных ресурсов уровня 2. Множество уровней позволяют множеству сторон, внешних по отношению к отношениям (в данном случае отношениям между выполнением кода и базой данных), манипулировать этими отношениями. Это в равной степени относится и к внутренним программным компонентам, таким как интерфейсы и события.
Мы видим, что независимо от других качеств абстракция уменьшает сложность, а косвенность увеличивает ее. Абстракция уменьшает силу, тогда как косвенность увеличивает ее. Косвенное обращение можно использовать для восстановления силы абстракции, позволяя переопределять поведение по умолчанию с помощью пользовательских обратных вызовов.