Jaka jest różnica między „warstwą abstrakcji” a „poziomem pośrednictwa”?

38

Nie jestem pewien, czy oba terminy mogą być używane zamiennie. Może jest jakieś akademickie rozróżnienie w informatyce, które nie ma znaczenia w codziennym programowaniu? Czy mogę używać obu terminów zamiennie, nie będąc w błędzie? Może zależy to od kontekstu, w którym używam obu terminów?

Edycja: Powodem, dla którego uważam oba terminy za możliwe do wymiany, jest wpis w Wikipedii o warstwie Abstrakcja . Tam można znaleźć cytat Davida Wheelersa: „Wszystkie problemy w informatyce można rozwiązać przez inny poziom pośredni”.

Theo Lenndorff
źródło
7
... z wyjątkiem problemu zbyt wielu poziomów pośrednich!
Mason Wheeler
@MasonWheeler: Możesz dodać kolejny, mniej pośredni poziom pośredni…
Jon Purdy
C ++ pozwala dodać warstwę abstrakcji bez warstwy pośredniej, więc nie mogą oznaczać tego samego.
fredoverflow

Odpowiedzi:

30

Abstrakcja dotyczy uproszczenia, pośrednia - lokalizacji.

  • Abstrakcjato mechanizm, który „ukrywa” skomplikowane szczegóły obiektu w kategoriach prostszych, łatwiejszych w obsłudze terminów. W programowaniu dobrym przykładem jest różnica w szczegółach między kodem maszynowym a różnymi narzędziami do tworzenia aplikacji, które ostatecznie są oparte na kodzie maszynowym. Rozważ utworzenie aplikacji Windows Form za pomocą Visual Studio IDE. IDE pozwala myśleć o aplikacji w kategoriach łatwych w obsłudze elementów w sposób „co widzisz”. Pozycja widżetu ekranowego jest wyodrębniana do wizualnej lokalizacji w ramce, którą można zmienić, przeciągając widżet dookoła. Wewnętrznie IDE manipuluje widgetem przy użyciu innej warstwy abstrakcji, takiej jak język wysokiego poziomu (na przykład C #). Sam C # nie jest manipulowany za pomocą kodu maszynowego, jest manipulowany za pomocą „Common Runtime Environment”

  • Pośrednie odnosi się do uczynienia lokalizacji przedmiotu przezroczystym. Jeśli znasz identyfikator URI zasobu internetowego, możesz uzyskać dostęp do zasobu, nie znając jego dokładnej lokalizacji. Nie uzyskujesz bezpośredniego dostępu do zasobu, zamiast tego uzyskujesz dostęp poprzez kanał, który przekazuje twoje żądanie przez serię serwerów, aplikacji i routerów. Pośrednictwo może być uważane za szczególny rodzaj abstrakcji, gdy lokalizacja jest abstrakcyjna.

Jay Elston
źródło
2
+1 najlepsza odpowiedź do tej pory! Już miałem napisać jeden, ale ten jest wystarczająco blisko tego, co miałem na myśli.
Newtopian,
27

Abstrakcje są wdrażane przy użyciu pośrednich.

Na przykład pamięć wirtualna: abstrakcja to ciągła przestrzeń adresowa całkowicie do Państwa dyspozycji. Ta abstrakcja jest implementowana za pomocą pośrednictwa za pomocą tabeli stron. Zamiast bezpośredniego dostępu do adresów pamięci fizycznej, są one tłumaczone z adresu wirtualnego na adres fizyczny.

Aby dodać warstwę abstrakcji, musisz dodać warstwę pośrednią. Ale dodanie pośrednictwa niekoniecznie daje abstrakcję. Na przykład posiadanie metod pobierających i ustawiających dla każdej pojedynczej zmiennej jest warstwą pośrednią, ale jeśli wszystko, co robią, to pobieranie i ustawianie prostych wartości, nie ma abstrakcji.

Austin
źródło
2
W rzeczywistości ostatni przykład nie jest zbyt dobry. Zwykłe gettery i setery dodają abstrakcji. Jedyne, co wiedzą, są jasne, to klasa, która je deklaruje. Jeśli zdecydujesz się zmienić implementację, nie wpłynie to na żaden kod zbudowany na podstawie abstrakcji.
back2dos,
czy możesz podać lepszy przykład, który jest pośredni, ale nie abastracyjny?
Pan Coder,
1
zdecydowanie zły przykład
Morg.
3
Kto powiedział coś o zajęciach? Nie powiedziałem też nic o zmianie widoczności zmiennej. Nic nie powstrzymuje cię przed bezpośrednim dostępem do niego; to zmienna. Ale możesz to również zrobić na poziomie pośrednim przez gettera i setera. Ponieważ semantyka używania gettera i settera jest taka sama, jak bezpośredni dostęp do zmiennej, nie ma abstrakcji.
Austin,
2
Tyle że getter i setter niekoniecznie „po prostu” uzyskują dostęp do zmiennej. Jeśli korzystasz z metody pobierającej i ustawiającej, dodajesz abstrakcję, ponieważ możesz zmienić ją tak, aby używała innej zmiennej bez wiedzy użytkownika, a zatem abstrakcji.
Dominique McDonnell,
9

Najpierw wypróbujmy odpowiednie definicje terminów:

  1. Warstwa abstrakcji oznacza:

     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. Z drugiej strony poziom pośredni oznacza:

      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
    

Obie te rzeczy mogą oznaczać to samo, o ile używasz:

  a) step = going from simple code to complex code. 
tp1
źródło
7

Rozumiem, że abstrakcja odnosi się głównie do funkcji, a pośrednictwo głównie do danych. Innymi słowy, poziom abstrakcji określa głębokość śladu stosu, a poziom pośredni określa liczbę wskaźników, które należy odrzucić. Przynajmniej tak używam terminów.

Karl Bielefeldt
źródło
z funkcjami wirtualnymi modelowanymi jako wskaźniki do funkcji?
Caleth,
7

Warstwa abstrakcji i poziom pośrednictwa to odrębne pojęcia. Abstrakcja to agregacja i znaczące nazewnictwo szeregu elementów, takich jak fragmenty danych lub instrukcji programu, na przykład koncepcja wywołania pliku lub metody, natomiast pośrednictwo to oddzielenie jednostek w celu ułatwienia odroczenia realizacji ich relacji, na przykład użycie JNDI do oddzielenia identyfikacji zasobu w programie od rzeczywistego zasobu, który może być ostatecznie dostarczony przez kontener aplikacji.

Często koncepcje idą w parze, a to, które stosuje się do konkretnego konstruktu, zależy od tego, jakie ćwiczenie lub dyskusja jest w toku. Na przykład abstrakcyjny charakter interfejsu jest ważny podczas uczenia się lub dokumentowania API; jego właściwość pośrednia jest ważna podczas dodawania rozszerzalności lub tworzenia testów dla aplikacji.

Warstwa abstrakcji jest agregacją abstrakcji i daje im konceptualną integralność i spójność użytkowania. CreateProcess to nazwa interfejsu API win32 dla zestawu kodu, który buduje i wykonuje proces. „Nazwa” ma znaczenie w tym kontekście, ponieważ jeśli nazwiemy funkcję coś takiego jak DoAllocMemThenMakeEnvThenFindEntryPoint ... to naprawdę nie byłby bardzo abstrakcyjny. Warstwa, taka jak Win32 API, stanowi barierę, przez którą programiści mogą nie być zapuszczani. Usuwa złożoność z punktu widzenia dzwoniącego kosztem zmniejszenia mocy (elastyczność, wydajność itp.). Ten kompromis jest podkreślany przez częste dyskusje na temat nieszczelnych abstrakcji: może być konieczne wykonywanie bezpośrednich wywołań SQL podczas korzystania z Hibernacji lub wywoływanie Win32 podczas korzystania z .NET.

Jeśli chodzi o pośrednictwo, większość nietrywialnych programów działa z pewną formą pośrednictwa kodowanego przez użytkownika, o czym świadczy sekcja WEJŚCIA-WYJŚCIA COBOL-a sprzed arki. Podczas uzyskiwania dostępu do zasobu, takiego jak baza danych, możemy zobaczyć osadzenie ciągu połączenia JDBC w kodzie jako pośredni Poziom 0, połączenie JNDI (które deleguje wybór zasobu do kontenera aplikacji) jako Poziom 1 i niektóre konstrukcje Spring, które odwzorowują identyfikator JNDI aplikacji dla jednego z wielu zasobów kontenera jako Poziom 2. Wiele poziomów pozwala wielu stronom zewnętrznym na relację (w tym przypadku relację między wykonaniem kodu a bazą danych) na manipulowanie tą relacją. Dotyczy to również wewnętrznych składników programu, takich jak interfejsy i zdarzenia.

Widzimy, że bez względu na ich inne cechy abstrakcja zmniejsza złożoność, a pośrednia ją zwiększa. Abstrakcja zmniejsza moc, podczas gdy pośrednictwo ją zwiększa. Pośredni może być użyty do przywrócenia mocy abstrakcji poprzez umożliwienie zastąpienia domyślnego zachowania niestandardowymi wywołaniami zwrotnymi.

mikemay
źródło
1

Wskaźnik do wskaźnika do wskaźnika do wskaźnika do wskaźnika do wskaźnika do int ma sześć poziomów pośrednich, ale nie ma żadnych warstw abstrakcji.

gnasher729
źródło
0

Dobrym przykładem abstrakcji jest wywołanie pojedynczej metody do przechowywania elementu w bazie danych. Metoda wyodrębnia szczegóły podłączenia i wywołania bazy danych. Gdy przykładem pośrednictwa jest użycie struktury do uzyskania dostępu do przerwań. Nadal masz dostęp do przerwania, gdy ustawiasz wartości w strukturze. dzieje się to pośrednio przez struct, nadając nazwy członków struct określonym punktom w pamięci.

Tak więc abstrakcja ukrywa szczegóły implementacji, gdzie pośrednictwo zapewnia po prostu „pośredni” interfejs, przez który można uzyskać dostęp do czegoś.

Abstrakcja ma miejsce wtedy, gdy nie musisz rozumieć, co jest ukryte, gdzie robisz to za pomocą pośrednictwa.

Charles Lambert
źródło
-1

Dodanie poziomu (lub warstwy) abstrakcji i poziomu pośredniego to po prostu dwa sposoby mówienia tego samego. Kiedy rozwiązujesz problem, zwykle próbujesz bezpośredniego rozwiązania. Czasami nie jest to możliwe, więc wypróbuj rozwiązanie pośrednie. Wymaga to wprowadzenia pewnej abstrakcji w celu uproszczenia problemu - ponieważ problem jest złożony, nie można go rozwiązać bezpośrednio. Po rozwiązaniu problemu przez podejście pośrednie nie ma powodu, aby nie rozważać ponownego rozwiązania problemu, ale bardziej ogólnie; Będzie to wymagało wprowadzenia kolejnego, wyższego poziomu abstrakcji. A to nowe, bardziej ogólne rozwiązanie jest jeszcze bardziej pośrednie niż oryginalne rozwiązanie pośrednie - tj. Dlatego wprowadzono kolejny poziom pośredni.

ChrisC
źródło
3
wydaje się, że nie dodaje to nic istotnego w stosunku do punktów poczynionych i wyjaśnionych w poprzednich 7 odpowiedziach
gnat
Dzięki Gnat. Rozumiem twój punkt widzenia i szkoda, że ​​to interesujące pytanie przyciąga dużo spamu!
ChrisC,