Шар абстракції та рівень непрямості - це окремі поняття. Абстракція - це сукупність та осмислене називання ряду елементів, таких як фрагменти даних або інструкції програми, наприклад, концепція файлу або виклику методу, тоді як опосередкованість - це роз'єднання сутностей для полегшення відстрочки реалізації їх відносин, наприклад, використання JNDI для відокремлення ідентифікації ресурсу в межах програми від фактичного ресурсу, який, зрештою, може бути наданий контейнером додатків.
Часто поняття йдуть рука об руку, і яке з них застосовується до певної конструкції, залежить від того, яка вправа чи дискусія ведеться. Наприклад, важливий абстрактний характер інтерфейсу під час вивчення або документування API; його властивість непрямості важлива при додаванні розширюваності або створення тестів для програми.
Шар абстракції - це сукупність абстракцій і надання їм концептуальної цілісності та послідовності використання. CreateProcess - це ім'я API Win32 для купи коду, який створює та виконує процес. "Ім'я" є важливим для цього контексту, тому що якби ми називали функцію чимось на зразок DoAllocMemThenMakeEnvThenFindEntryPoint ... це дійсно не було б дуже абстрактним. Такий шар, як API Win32, забезпечує бар'єр, через який програмісту можна порадити не ризикувати. Це знімає складність з точки зору абонента ціною зниженої потужності (гнучкість, продуктивність тощо). Цей компроміс підкреслюється частими дискусіями про хиткі абстракції: можливо, нам все ж доведеться робити прямі дзвінки SQL під час використання режиму Hibernate або робити виклики Win32 під час використання .NET.
Що стосується непрямості, то більшість нетривіальних програм функціонує з певною формою кодованої користувачем непрямості, засвідчуючи розділ INPUT-OUTPUT COBOL від перед ковчегом. Під час доступу до такого ресурсу, як база даних, ми можемо побачити вбудовування рядка з'єднання JDBC в код як непрямий рівень 0, з'єднання JNDI (яке делегує вибір ресурсу контейнеру додатків) як рівень 1 і деяку конструкцію Spring, яка відображає додаток JNDI-ідентифікатор до одного з багатьох ресурсів контейнерів, як рівень 2. Кілька рівнів дозволяють багатьом сторонам, що перебувають поза зв'язком (у цьому випадку відносини між виконавчим кодом та базою даних), маніпулювати цим відношенням. Це однаковою мірою стосується внутрішніх компонентів програми, таких як інтерфейси та події.
Ми бачимо, що незалежно від їх інших якостей, абстракція зменшує складність, тоді як опосередкованість збільшує її. Абстракція зменшує потужність, тоді як непряме її збільшує. Непрямий спосіб можна використовувати для відновлення сили абстракції, дозволяючи переохочувати поведінку за замовчуванням за допомогою користувацьких зворотних викликів.