Яка різниця між "шаром абстракції" та "рівнем непрямості"?


38

Я не впевнений, чи можна обидва терміни використовувати взаємозамінно. Можливо, є якась академічна відмінність у галузі інформатики, яка не є актуальною для щоденного програмування? Або я можу використовувати обидва терміни взаємозамінно, не помиляючись? Може, це залежить від контексту, в якому я використовую обидва терміни?

Редагувати: З причини, чому я вважаю, що обидва терміни можуть бути взаємозамінними, це запис у Вікіпедії про шар абстракції . Там ви можете знайти цитату Девіда Уіллера "Усі проблеми в інформатиці можна вирішити іншим рівнем непрямості".


7
... окрім проблеми занадто багато рівнів непрямості!
Мейсон Уілер

@MasonWheeler: Ви можете додати ще один, менш непрямий рівень непрямості…
Джон Перді,

C ++ дозволяє додавати шар абстракції без шару непрямості, тому вони не можуть означати те саме.
fredoverflow

Відповіді:


30

Абстракція стосується спрощення, непрямого стосується місця.

  • Абстракціяце механізм, який "приховує" складні деталі об'єкта в плані більш простих, легших для маніпулювання термінами. Хорошим прикладом програмування є різниця в деталях між машинним кодом та різними інструментами для створення додатків, які в кінцевому підсумку базуються на машинному коді. Подумайте про створення додатка для Windows форми за допомогою ID Visual Studio IDE. IDE дозволяє продумувати додаток з точки зору простого маніпулювання предметами способом "Що-ти-бачиш-чи-що-ти". Положення екранного віджета виводиться на візуальне місце у кадрі, який ви можете змінити, перетягуючи віджет навколо. Всередині IDE маніпулює віджетом, використовуючи інший шар абстракції, такий як мова високого рівня (наприклад, C #). Сам C # не маніпулює за допомогою машинного коду, маніпулює за допомогою "загального середовища виконання"

  • Непрямий стосується того, щоб зробити місце розташування предмета прозорим. Якщо ви знаєте URI веб-ресурсу, ви можете отримати доступ до ресурсу, не знаючи його точного місцезнаходження. Ви не маєте доступу до ресурсу безпосередньо, натомість ви отримуєте доступ через канал, який передає ваш запит через низку серверів, програм та маршрутизаторів. Непрямим можна вважати особливий тип абстракції, де місце абстрагується.


2
+1 найкраща відповідь поки! Я збирався написати один, але цей досить близький до того, що я мав на увазі.
Ньютопський

27

Абстракції реалізуються за допомогою непрямості.

Наприклад, віртуальна пам’ять: абстракція - це суміжний адресний простір, що знаходиться повністю у вашому розпорядженні. Ця абстракція реалізована за допомогою опосередкування через таблицю сторінок. Замість прямого доступу до фізичної адреси пам'яті вони переводяться з віртуальної адреси на фізичну адресу.

Щоб додати шар абстракції, потрібно додати шар непрямості. Але додавання непрямості не обов'язково дає вам абстракцію. Наприклад, наявність гетерів і сетерів на кожній змінній є шаром непрямості, але якщо все, що вони роблять, це отримати і встановити прості значення, немає абстракції.


2
Насправді останній приклад не дуже хороший. Звичайні геттери та сетери дійсно додають абстракції. Єдиний, хто знає, вони прості, - клас, який оголошує їх. Якщо ви вирішите змінити реалізацію, будь-який код, побудований на основі абстракції, не впливає.
back2dos

чи можете ви навести якийсь кращий приклад - це непрямість, а не абстракція?
Містер Кодер

1
безумовно, неправильний приклад
Морг.

3
Хто що сказав про заняття? Я також нічого не говорив про зміну видимості змінної. Ніщо не заважає вам отримати доступ до нього безпосередньо; це змінна. Але ви також можете зробити це з рівнем непрямості за допомогою геттера та сеттера. Оскільки семантика використання геттера та сеттера збігається безпосередньо із зміною безпосередньо, абстракції немає.
Остін

2
За винятком того, що геттер і сетер не обов'язково "просто" отримують доступ до змінної. Якщо ви використовуєте геттер і сеттер, ви додаєте абстракцію, оскільки ви могли змінити їх на використання іншої змінної, не знаючи про це користувача, отже, абстракцію.
Домінік МакДоннелл

9

По-перше, давайте спробувати належні визначення термінів:

  1. Шар абстракції означає:

     a) there is large number of positions which use abstraction
          (layer = all the positions together)
     b) each position is hiding some complex stuff, but allows invoking it 
          using only simple code. 
         (abstraction == one-to-one mapping between simple code and complex code)
    
  2. З іншого боку, рівень непрямості означає:

      a) you're counting levels
      b) indirection==there are several steps before you can reach or access the data
      c) level of indirection is just how many steps it takes to access the data
    

Обидва ці речі можуть означати те саме, якщо ви користуєтесь:

  a) step = going from simple code to complex code. 

7

Я розумію, що абстракція здебільшого стосується функцій, а непряме в основному стосується даних. Іншими словами, рівень абстракції - це наскільки глибокий слід вашого стека, а рівень непрямості - скільки покажчиків вам потрібно знеструмити. Принаймні так я використовую терміни.


причому віртуальні функції моделюються як вказівники на функції?
Калет

7

Шар абстракції та рівень непрямості - це окремі поняття. Абстракція - це сукупність та осмислене називання ряду елементів, таких як фрагменти даних або інструкції програми, наприклад, концепція файлу або виклику методу, тоді як опосередкованість - це роз'єднання сутностей для полегшення відстрочки реалізації їх відносин, наприклад, використання JNDI для відокремлення ідентифікації ресурсу в межах програми від фактичного ресурсу, який, зрештою, може бути наданий контейнером додатків.

Часто поняття йдуть рука об руку, і яке з них застосовується до певної конструкції, залежить від того, яка вправа чи дискусія ведеться. Наприклад, важливий абстрактний характер інтерфейсу під час вивчення або документування API; його властивість непрямості важлива при додаванні розширюваності або створення тестів для програми.

Шар абстракції - це сукупність абстракцій і надання їм концептуальної цілісності та послідовності використання. CreateProcess - це ім'я API Win32 для купи коду, який створює та виконує процес. "Ім'я" є важливим для цього контексту, тому що якби ми називали функцію чимось на зразок DoAllocMemThenMakeEnvThenFindEntryPoint ... це дійсно не було б дуже абстрактним. Такий шар, як API Win32, забезпечує бар'єр, через який програмісту можна порадити не ризикувати. Це знімає складність з точки зору абонента ціною зниженої потужності (гнучкість, продуктивність тощо). Цей компроміс підкреслюється частими дискусіями про хиткі абстракції: можливо, нам все ж доведеться робити прямі дзвінки SQL під час використання режиму Hibernate або робити виклики Win32 під час використання .NET.

Що стосується непрямості, то більшість нетривіальних програм функціонує з певною формою кодованої користувачем непрямості, засвідчуючи розділ INPUT-OUTPUT COBOL від перед ковчегом. Під час доступу до такого ресурсу, як база даних, ми можемо побачити вбудовування рядка з'єднання JDBC в код як непрямий рівень 0, з'єднання JNDI (яке делегує вибір ресурсу контейнеру додатків) як рівень 1 і деяку конструкцію Spring, яка відображає додаток JNDI-ідентифікатор до одного з багатьох ресурсів контейнерів, як рівень 2. Кілька рівнів дозволяють багатьом сторонам, що перебувають поза зв'язком (у цьому випадку відносини між виконавчим кодом та базою даних), маніпулювати цим відношенням. Це однаковою мірою стосується внутрішніх компонентів програми, таких як інтерфейси та події.

Ми бачимо, що незалежно від їх інших якостей, абстракція зменшує складність, тоді як опосередкованість збільшує її. Абстракція зменшує потужність, тоді як непряме її збільшує. Непрямий спосіб можна використовувати для відновлення сили абстракції, дозволяючи переохочувати поведінку за замовчуванням за допомогою користувацьких зворотних викликів.


1

Вказівник на вказівник на вказівник на вказівник на вказівник на вказівник на int має шість рівнів непрямості, але жодних шарів абстракції немає.


0

Хорошим прикладом абстрагування є виклик єдиного методу для зберігання елемента в базі даних. Метод резюмує деталі підключення та виклику бази даних. Якщо в прикладі непрямості використовується структура для доступу до переривань. Ви все ще отримуєте доступ до переривання, коли встановлюєте значення в структурі. це просто опосередковано через структуру, надаючи імена членів структури конкретним точкам пам'яті.

Таким чином, абстракція приховує деталі реалізації, де непряма просто забезпечує "непрямий" інтерфейс, за допомогою якого можна отримати доступ до чогось.

Абстракція - це коли вам не потрібно розуміти, що приховується, де з непрямістю ви займаєтесь.


-1

Додавання рівня (або шару) абстракції та додавання рівня непрямості - це просто два способи сказати одне і те ж. Коли ви вирішуєте проблему, ви зазвичай намагаєтеся вирішити пряме рішення. Іноді це неможливо, тому ви намагаєтеся непряме рішення. Це вимагає ввести деяку абстракцію для спрощення проблеми - оскільки це проблема складна, що її неможливо вирішити безпосередньо. Вирішивши проблему непрямим підходом, немає підстав не вважати рішення проблеми знову, але загальніше; Це передбачає запровадження іншого, більш високого рівня абстракції. І це нове, більш загальне рішення є навіть більш опосередкованим, ніж оригінальне непряме рішення - тобто таким чином, щоб було введено інший рівень опосередкованості.


3
це, мабуть, не додає нічого суттєвого щодо балів, пояснених та пояснених у попередніх 7 відповідях
gnat

Спасибі, Гнат Думаю, і шкода, що це цікаве запитання приваблює багато спаму!
ChrisC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.