Jaka jest różnica między „ukrywaniem danych” a „enkapsulacją”?

29

Czytam „Współbieżność Java w praktyce” i powiedziano: „Na szczęście te same techniki obiektowe, które pomagają pisać dobrze zorganizowane, możliwe do utrzymania klasy - takie jak enkapsulacja i ukrywanie danych - mogą również pomóc w tworzeniu bezpiecznych wątków klasy ”.

Problem nr 1 - Nigdy nie słyszałem o ukrywaniu danych i nie wiem, co to jest.

Problem nr 2 - Zawsze myślałem, że enkapsulacja korzysta z prywatnego vs. publicznego i faktycznie ukrywa dane.

Czy możesz wyjaśnić, czym jest ukrywanie danych i czym różni się od enkapsulacji?

dhblah
źródło
2
Przeczytaj kod Complete 2nd edition . Odpowiesz na wiele twoich pytań.
Shiplu Mokaddim
Jeśli chodzi o ukrywanie informacji, zobacz: javaworld.com/jw-05-2001/jw-0518-encapsulation.html
Dave Jarvis,
Ten link ma użyteczny wgląd w te informacje. Ukrywanie zasady projektowania określa, że ​​decyzja projektowa powinna być ukryta przed resztą systemu, aby zapobiec niezamierzonemu sprzężeniu. Powinien informować o sposobie kapsułkowania rzeczy, ale oczywiście nie musi. Enkapsulacja to funkcja języka programowania.
Abhijeet,

Odpowiedzi:

19

Ukrywanie danych i informacji to szersze pojęcia, które można znaleźć w informatyce i inżynierii oprogramowania. Odnosi się do faktu, że ta część programu komputerowego, która może ulec zmianie, nie może być dostępna z innych modułów / od klientów.

Hermetyzacja jest terminem występującym w paradygmacie obiektowym i odnosi się do przechowywania danych w polach prywatnych i modyfikowania ich tylko metodami.

A zatem enkapsulacja może być postrzegana jako sposób na osiągnięcie ukrywania danych w systemach obiektowych .

m3th0dman
źródło
1
Dziękuję za odpowiedź. Nadal nie rozumiem, dlaczego jeśli ukrywanie danych jest takie samo, ale tylko nieco szersze niż hermetyzacja, jest o tym mowa w książce, jakby miały podobną szerokość, a nie jedną.
dhblah,
Autorzy prawdopodobnie różnią się od ukrywania danych i ukrywania informacji w tym sensie, że ukrywanie danych jedynie ukrywa struktury danych - pola prywatne - podczas gdy ukrywanie informacji może odnosić się do hermetyzacji szczegółów implementacji (na przykład algorytmów) komunikacji realizowanej tylko za pośrednictwem interfejsów.
m3th0dman
2
Możesz mieć jeden bez drugiego - spójrz na Python, gdzie w ogóle nie ma żadnych danych (nie ma czegoś takiego jak prywatny lub chroniony atrybut).
Latty
@ Punkt Lattyware jest bardzo prawdziwy i ważny. Można również zastosować enkapsulację (z twojej definicji, której sprzeciwiam się z powodu tego, co tu opisuję) bez ukrywania czegokolwiek, a mianowicie przez ślepe odsłonięcie trywialnego gettera i setera dla każdego członka. To niczego nie ukrywa i niczego nie zapobiega, ale spełnia powszechną definicję enkapsulacji listu.
1
Hermetyzacja nie utrzymuje danych w polu prywatnym, to więcej ukrywa informacji. Ogólnie rzecz biorąc, enkapsulacja to koncepcja łączenia (enkapsulacji) informacji / danych i metod w klasę.
nbro
6

Hermetyzacja i ukrywanie danych to powiązane terminy. Ważne jest, aby zrozumieć, że powstają one w związku z abstrakcją . Booch i in. glin. w obiektowej analizie i projektowaniu za pomocą aplikacji wyjaśnia,

Abstrakcja i enkapsulacja są koncepcjami komplementarnymi: abstrakcja koncentruje się na obserwowalnym zachowaniu obiektu, podczas gdy enkapsulacja koncentruje się na implementacji, która powoduje takie zachowanie. Hermetyzację najczęściej osiąga się poprzez ukrywanie informacji (nie tylko ukrywanie danych), czyli proces ukrywania wszystkich tajemnic obiektu, które nie przyczyniają się do jego zasadniczych cech; zazwyczaj struktura obiektu jest ukryta, podobnie jak implementacja jego metod.

theD
źródło
5

Tworzenie klasy obejmuje pojęcie enkapsulacji. Kiedy tworzysz klasę, umieszczasz w niej dane i zachowania, a klasa staje się jedną jednostką, którą nazywamy obiektem. Ukrywanie danych jest więc częścią enkapsulacji.

Aleko Gharibashvili
źródło
4

Z Wikipedii :

W języku programowania enkapsulacja jest używana w odniesieniu do jednego z dwóch powiązanych, ale odrębnych pojęć, a czasem do ich kombinacji:

  • Mechanizm językowy do ograniczania dostępu do niektórych składników obiektu.
  • Konstrukcja językowa, która ułatwia wiązanie danych z metodami (lub innymi funkcjami) działającymi na tych danych.

Niektórzy badacze i naukowcy zajmujący się językiem programowania wykorzystują pierwsze znaczenie samodzielnie lub w połączeniu z drugim jako cechę wyróżniającą programowanie obiektowe, podczas gdy inne języki programowania, które zapewniają zamknięcie leksykalne, opisują enkapsulację jako cechę języka ortogonalnego do orientacji obiektowej.

Druga definicja jest motywowana faktem, że w wielu językach OOP ukrywanie komponentów nie jest automatyczne lub może zostać zastąpione; dlatego ukrywanie informacji jest definiowane jako osobne pojęcie przez tych, którzy preferują drugą definicję.

Michael Borgwardt
źródło
Dzięki za odpowiedź. Dalsze pytania: 1) czy język programowania Java ma funkcje, do których odnosi się drugie pojęcie związane z enkapsulacją? 2) Nie rozumiem, dlaczego przesłanianie ukrywania danych ma znaczenie. Np. W java możesz uzyskać dostęp do dowolnego pola (publicznego lub prywatnego) poprzez refleksję.
dhblah,
@ Software Engeneering Learner: klasy jako konstrukcje kodu źródłowego reprezentują drugie pojęcie. Jeśli chodzi o ukrywanie informacji, chodzi o to, że ograniczenie zakresu danych często opiera się na określonych i oddzielnych mechanizmach językowych.
Michael Borgwardt,
2

Często są one stosowane zamiennie w dyskusji i często myślę, że współpracują ze sobą, aby osiągnąć ten sam cel, i chociaż poniższe elementy mogą nie być całkowicie dokładne, może zapewnić pewne znaczące rozróżnienie, jeśli trzeba wprowadzić rozróżnienie:

Mówiąc o enkapsulacji, często jest ona implementowana jako mechanizm proceduralny / funkcjonalny. Istnieje pewien rodzaj ochrony dla stanu bazowego, a dostęp przez tę ochronę wymaga przestrzegania pewnych protokołów, aby uzyskać dostęp (odczyt lub zmiana pożądanego stanu). Hermetyzacja oferuje również możliwość wystąpienia efektów ubocznych z powodu dostępu (takich jak zmiana stanu kaskadowego lub powiadomienie / wywołanie zdarzenia / wydanie sygnału, gdy interesująca rzecz zostanie odczytana lub zmieniona), dzięki czemu można zainicjować działania następcze. Ponownie często myślę o enkapsulacji jako koncepcji, która jest realizowana jako procedura.

Widzę, że koncepcja ukrywania danych ma podobny cel do enkapsulacji; mechanizm ten ma jednak charakter strukturalny i działa na innym poziomie. W praktyce, zamiast zapewniać mechanizm ochronny i efekt uboczny poprzez procedurę, stan jest chroniony i wpływa na to mechanizmy strukturalne języka i środowiska wykonawczego. Tego rodzaju osłony byłyby klauzulami widoczności, definicjami typów, dziedziczeniem i tym podobnymi. Efekty uboczne, które można wykorzystać z obiektów chronionych strukturalnie, są znowu czymś zależnym od języka i środowiska wykonawczego: być może aktywacja obiektu, liczba referencji lub coś podobnego.

JustinC
źródło
0

Często są, może zwykle, używane zamiennie. Ale zauważ, że powyższy cytat Boocha mówi: „Hermetyzację najczęściej osiąga się poprzez ukrywanie informacji…”, tj. Najczęściej, ale nie zawsze w każdym przypadku.

Zauważ, że Python pozwala na zwijanie danych w klasach, ale nie zezwala na zmienne prywatne. Można więc powiedzieć, że Python zapewnia enkapsulację bez ukrywania danych.

Możesz zrobić to samo w Javie, wykonując wszystkie zmienne składowe public, ale oprócz zadawania każdemu zawału serca stracisz korzyść z ukrywania danych ... tj. Zachowując semantykę obiektu poprzez ograniczenie dostępu do jego stanu.

Obrabować
źródło
0

W OO enkapsulacja to miejsce, w którym informacja jest przechowywana w obiekcie. Na przykład, a Personma nameklientów i Osoba (tj. Ty) wie, że Osoba ma imię, albo za pośrednictwem pól publicznych, albo metod dostępu. I miejmy nadzieję, że nie trzeba również przechowywać nazw w globalnej tablicy nazw itp. Jest to więc duży krok, aby uniknąć niemożliwego do zarządzania kodu spaghetti. Ale klient nadal musi wiedzieć coś o tym, jak Osoba obsługuje nazwy: np. Spacja lub przecinek?

Ukrywanie danych to miejsce, w którym Personznajduje się pole nazwy, ale przynajmniej w teorii nikt nie wie . Pole jest prywatne bez publicznych metod dostępu. Klienci mogą przekazać nazwę z rekordu bazy danych, XML, HTTP POST, cokolwiek, ale wewnętrzne działanie tego, jak Osoba obsługuje nazwę, to „czarna skrzynka”. Przyszłe implementacje Person mogą zmieniać, na przykład przejść na posiadanie a firstNamei a lastName.

W idealnym świecie ukrywanie danych jest lepsze niż enkapsulacja, ale nie wszystkie światy są idealne. :-)

użytkownik949300
źródło