Różnica między hermetyzacją a abstrakcją


87

Miałem dzisiaj wywiad. Miałem pytanie z OOP , o różnicy między Encapsulation & abstrakcji ?

Odpowiedziałem jej, zgodnie z moją wiedzą, że enkapsulacja polega w zasadzie na wiązaniu członków danych i funkcji składowych w pojedynczą jednostkę o nazwie Class . Natomiast abstrakcja ma na celu ukrycie złożoności implementacji i zapewnienie łatwości dostępu dla użytkowników. Myślałem, że moja odpowiedź będzie w porządku. Zapytała jednak, jeśli celem obu jest ukrycie informacji, to jaka jest rzeczywista różnica między nimi? Nie mogłem jej odpowiedzieć.

Zanim zadam to pytanie, przeczytałem inne wątki w StackOverFlow o różnicy między tymi dwoma koncepcjami OOP . Ale nie jestem w stanie przekonać ankietera.

Czy ktoś może to usprawiedliwić najprostszym przykładem?


13
i wreszcie, czy dostałeś pracę? :)
Adrian Księżarczyk

1
@WPFbee Niefortunnie!
Aimal Khan

3
Nie wiem, dlaczego ludzie porównują abstrakcję i enkapsulację. Dlaczego nie możemy ich zaakceptować jako dwóch różnych koncepcji OOP.
Pan ASquare


@WpfBee Abstrakcja nie ma nic wspólnego z ukrywaniem się, po prostu
sprawdź

Odpowiedzi:


74

Encapsulate ukrywa zmienne lub niektóre implementacje, które mogą być tak często zmieniane w klasie, aby uniemożliwić osobom postronnym dostęp do nich bezpośrednio. Muszą uzyskać do niego dostęp za pomocą metod pobierających i ustawiających.

Abstrakcja też służy do ukrywania czegoś, ale w wyższym stopniu (klasa, interfejs) . Klienci używający klasy abstrakcyjnej (lub interfejsu) nie dbają o to, kto lub która to była, po prostu muszą wiedzieć, co potrafi.


7
Doskonały. Wydaje mi się, że twoja odpowiedź jest skierowana tylko na moje pytanie ankietera. Próbuję powtórzyć twoją odpowiedź na praktycznym przykładzie. Daj mi znać, jeśli uzasadnia to Twoją odpowiedź. Weźmy przykład telewizji. Hermetyzacja to obwody wewnętrzne, diody LED itp., Które razem tworzą telewizor. Abstrakcja to włączanie / wyłączanie, dźwięk, ustawienie kanału i inne przyciski służące do jego obsługi.
WpfBee

Abstrakcja facetów nie ma nic wspólnego z ukrywaniem implementacji ... abstrakcja to metoda polimorficznej interakcji z klasą
Mortalus

1
@Mortalus - Nie zgadzam się z pierwszym stwierdzeniem „abstrakcja nie ma nic wspólnego z ukrywaniem implementacji”. Myślę, że kiedy zaczynamy uczyć się koncepcji abstrakcji, pierwszą rzeczą, której się uczymy, jest to, że ukrywamy złożoność implementacji i udostępniamy interfejs użytkownika do korzystania z niej. Ponieważ użytkownik może nie być zainteresowany złożonością implementacji. Możesz wziąć praktyczny przykład telewizora lub klimatyzacji. Inną rzeczą jest to, że jeśli nie ukrywa implementacji, to dlaczego udostępniamy metodę w klasie abstrakcyjnej, która nie ma treści. Wyraźnie ukrywamy tutaj realizację.
WpfBee

1
@Mortalus - Wspomniałeś również o linku do wiki. To pierwsze stwierdzenie - „W informatyce abstrakcja to proces, w którym dane i programy są definiowane z reprezentacją podobną do ich znaczenia (semantyka), jednocześnie ukrywając szczegóły implementacji. Abstrakcja próbuje zredukować i rozłożyć na czynniki szczegóły tak, aby programista może skupić się na kilku koncepcjach naraz ”. sama w sobie sugeruje, że Abstrakcja ma na celu ukrycie implementacji. Zgadzam się z twoim drugim stwierdzeniem, ale nie z pierwszym.
WpfBee

1
Myślę, że hermetyzacja polega bardziej na budowaniu pojedynczej jednostki, nie chodzi o to, żebyś to ukrywał lub nie. Ponieważ abstrakcja bardziej dotyczy ukrywania rzeczy, popraw, jeśli się mylę.
raj240


12

Abstrakcja - jest procesem (i wynikiem tego procesu) określania wspólnych podstawowych cech zbioru obiektów. Można powiedzieć, że abstrakcja jest procesem uogólniania: wszystkie rozważane obiekty są zawarte w nadzbiór obiektów, z których wszystkie mają określone właściwości (ale różnią się pod innymi względami).

Hermetyzacja - to proces zamykania danych i funkcji manipulujących tymi danymi w jednej jednostce, aby ukryć wewnętrzną implementację przed światem zewnętrznym.

To jest ogólna odpowiedź niezwiązana z konkretnym językiem programowania (jak było pytanie). Tak więc odpowiedź brzmi: abstrakcja i hermetyzacja nie mają ze sobą nic wspólnego. Ale ich implementacje mogą być ze sobą powiązane (powiedzmy, w Javie: Encapsulation - szczegóły są ukryte w klasie, Abstraction - szczegóły nie są w ogóle obecne w klasie lub interfejsie).


11

Hermetyzacja: pakowanie kodu i danych razem w jedną jednostkę. Classjest przykładem hermetyzacji, ponieważ opakowuje metodę i właściwość.

Abstrakcja: ukrywanie wewnętrznych szczegółów i pokazywanie tylko funkcjonalności. Abstrakcja skupia się na tym, co robi obiekt, a nie na tym, jak to robi. Zapewnia ogólny widok klas.

int number = 5;
string aStringNumber = number.ToString(); 

Tutaj ToString () jest abstrakcją. I jak ta numberzmienna mechanizmu została przekonwertowana na łańcuch i zainicjalizowana waStringNumber jest hermetyzacją.

Weźmy przykład kalkulatora z prawdziwego świata. Hermetyzacja to obwody wewnętrzne, bateria itp., Które razem tworzą kalkulator. Abstrakcja to różne przyciski, takie jak włączanie-wyłączanie, jasne i inne przyciski służące do jego obsługi.


7

Abstrakcja: jest zwykle wykonywana w celu zapewnienia polimorficznego dostępu do zestawu klas. Nie można utworzyć instancji klasy abstrakcyjnej, dlatego inna klasa będzie musiała wyprowadzić z niej inną klasę, aby stworzyć bardziej konkretną reprezentację.

Typowym przykładem użycia klasy abstrakcyjnej może być implementacja wzorca projektowego metody szablonu, w którym wprowadzany jest abstrakcyjny punkt iniekcji, tak aby klasa konkretna mogła zaimplementować go na swój własny „konkretny” sposób.

patrz: http://en.wikipedia.org/wiki/Abstraction_(computer_science)

Hermetyzacja: to proces ukrywania złożoności implementacji określonej klasy przed klientem, który będzie z niej korzystał, należy pamiętać, że „klientem” może być program lub wydarzenie, które napisała klasę.

patrz: http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)


1
abstrakcja jest związana z klasą abstrakcyjną?
vishnu viswanath

@vishnuviswanath, tak, możemy zaimplementować abstrakcję za pomocą klasy abstrakcyjnej i interfejsów.
invzbl3

3

Jest świetny artykuł, który porusza różnice między abstrakcją, enkapsulacją i głębokim ukrywaniem informacji: http://www.tonymarston.co.uk/php-mysql/abstraction.txt

Oto wniosek z artykułu:

Abstrakcja, ukrywanie informacji i hermetyzacja to bardzo różne, ale bardzo powiązane pojęcia. Można argumentować, że abstrakcja jest techniką, która pomaga nam zidentyfikować, które konkretne informacje powinny być widoczne, a które ukryte. Hermetyzacja jest zatem techniką pakowania informacji w taki sposób, aby ukryć to, co powinno być ukryte, a uwidocznić to, co ma być widoczne.


2

różnica w obu to po prostu słowo hermetyzacja punktu widzenia
jest używane do ukrywania danych, jeśli naszym celem jest uniemożliwienie klientowi zobaczenia naszej logiki od wewnątrz

Słowo abstrakcja jest używane do ukrywania danych, jeśli naszym celem jest pokazanie klientowi widoku z zewnątrz

Widok z zewnątrz oznacza, że ​​przypuszczam

BubbleSort(){
//code 
swap(x,y);
}

tutaj używamy zamiany w sortowaniu bąbelkowym tylko po to, aby pokazać klientowi, jaką logikę stosujemy, Jeśli zamienimy swap (x, y) na cały kod tutaj, W jednym przypadku nie może zrozumieć naszej logiki


2

Tak, to prawda, że ​​w abstrakcji i enkapsulacji chodzi o ukrywanie się.

  • Używanie tylko istotnych szczegółów i ukrywanie niepotrzebnych danych na poziomie projektu nazywa się abstrakcją . (To jak wybieranie tylko odpowiednich właściwości dla klasy „Samochód”, aby uczynić ją bardziej abstrakcyjną lub ogólną).

  • Hermetyzacja to ukrywanie danych na poziomie wdrożenia . Na przykład, jak faktycznie ukryć dane przed bezpośrednim / zewnętrznym dostępem. Odbywa się to poprzez powiązanie danych i metod z pojedynczą jednostką / jednostką, aby zapobiec dostępowi z zewnątrz. Dlatego hermetyzacja jest również znana jako ukrywanie danych na poziomie implementacji.


3
Czy możesz wyjaśnić, czym ta odpowiedź różni się od 12 innych istniejących odpowiedzi?
Stephen Rauch

2

Kapsułkowanie:

Coś ukrywa, coś w rodzaju kapsułki z lekarstwem. Nie wiemy, co jest w kapsułce, po prostu ją bierzemy. Tak samo jak w programowaniu - po prostu ukrywamy jakiś specjalny kod metody lub właściwości i daje on tylko wyjście, tak samo jak capsule. Krótko mówiąc, hermetyzacja ukrywa dane.

Abstrakcja:

Abstrakcja oznacza ukrywanie logiki lub implementacji. Na przykład, bierzemy tabletki i widzimy ich kolor, ale nie wiemy, jaki jest tego cel i jak to działa na organizm.


0

Abstrakcja

W Javie abstrakcja oznacza ukrywanie informacji przed światem rzeczywistym. Ustanawia umowę między stroną, która mówi, „co powinniśmy zrobić, aby skorzystać z usługi”.

Przykład: W rozwoju API ujawniono światu tylko abstrakcyjne informacje o usłudze, a nie rzeczywistą implementację. Interfejs w Javie może bardzo dobrze pomóc w realizacji tej koncepcji.

Interfejs zapewnia umowę między stronami, np. Producentem i konsumentem. Producent produkuje towary bez informowania konsumenta o sposobie wytwarzania produktu. Ale za pośrednictwem interfejsu Producent informuje wszystkich konsumentów, jaki produkt może kupić. Za pomocą abstrakcji producent może sprzedać produkt swoim konsumentom.

Kapsułkowanie:

Hermetyzacja jest o jeden poziom niższy od abstrakcji. Ta sama firma produkująca produkty próbuje chronić informacje przed innymi grupami produkcyjnymi. Na przykład, jeśli firma produkuje wino i czekoladę, hermetyzacja pomaga chronić informacje o tym, jak każdy produkt jest wytwarzany od siebie nawzajem.

  1. Jeśli mam pakiet indywidualny, jeden na wino, a drugi na czekoladę, i jeśli wszystkie klasy są zadeklarowane w pakiecie jako domyślny modyfikator dostępu, zapewniamy hermetyzację na poziomie pakietu dla wszystkich klas.
  2. W pakiecie, jeśli zadeklarujemy każdą klasę złożoną (pole składowe) jako prywatną i mając publiczną metodę dostępu do tych pól, w ten sposób nadając tym polom hermetyzację na poziomie klasy

0

Jeszcze tylko kilka punktów, aby wyjaśnić,

Nie wolno mylić abstrakcji danych z klasą abstrakcyjną. Oni są różni.

Ogólnie mówimy, że klasa lub metoda abstrakcyjna ma po prostu coś ukryć. Ale nie… To jest złe. Co oznacza słowo abstrakcja? Wyszukiwarka Google mówi, że angielskie słowo abstrakcja oznacza

„Istnieje w myśli lub jako idea, ale nie ma fizycznego ani konkretnego istnienia”.

I tak też jest w przypadku klasy abstrakcyjnej. Nie ukrywa zawartości metody, ale treść metody jest już pusta (nie ma fizycznego ani konkretnego istnienia), ale określa, jak metoda powinna być (istniejąca w myśli lub jako idea) lub metoda powinna znajdować się w calsach .

Kiedy więc faktycznie używasz metod abstrakcyjnych?

  • Kiedy metoda z klasy bazowej będzie się różnić w każdej klasie potomnej, która ją rozszerza.
  • Dlatego chcesz się upewnić, że klasa potomna ma zaimplementowaną tę funkcję.
  • Zapewnia to również, że metoda, aby mieć obowiązkowy podpis, musi mieć n liczby parametrów.

A więc o klasie abstrakcyjnej! - Instancji klasy abstrakcyjnej nie można utworzyć tylko jako rozszerzenie! Ale dlaczego ?

  • Klasa z metodą abstrakcyjną nie może tworzyć własnej instancji, ponieważ zawarte w niej metody abstrakcyjne nie mają żadnej sensownej implementacji.
  • Możesz nawet uczynić klasę abstrakcyjną, jeśli z jakiegoś powodu uznasz, że posiadanie instancji tej klasy ma mniejsze znaczenie.

Klasa abstrakcyjna pomaga nam uniknąć tworzenia nowych jej instancji!

Metoda abstrakcyjna w klasie wymusza na klasie potomnej zaimplementowanie tej funkcji na pewno z podanym podpisem!


0

Pozwólcie, że wyjaśnię to na tym samym przykładzie omówionym powyżej. Prosimy o rozważenie tego samego telewizora.

Kapsułkowanie : Dobrym przykładem jest regulacja, którą możemy wykonać za pomocą pilota - zwiększanie / zmniejszanie głośności, kolor i kontrast - wszystko, co możemy zrobić, to dostosować je do podanej wartości minimalnej i maksymalnej i nie możemy zrobić nic poza tym, co jest przewidziane w pilocie - Wyobraź sobie getter i setter tutaj (funkcja ustawiająca sprawdzi, czy podana wartość jest prawidłowa, jeśli Tak, przetworzy operację, jeśli nie, nie pozwoli nam na wprowadzenie zmian - tak jak nie możemy zmniejszyć głośności powyżej zera, nawet jeśli zmniejszymy głośność przycisk sto razy).

Abstrakcja : Możemy wziąć ten sam przykład tutaj, ale z wyższym stopniem / kontekstem. Przycisk zmniejszania głośności zmniejsza głośność - i to jest informacja, którą przekazujemy użytkownikowi, a użytkownik nie jest świadomy ani nadajnika podczerwieni wewnątrz pilota, ani odbiornika w telewizorze i późniejszego procesu parsowania sygnału i mikroprocesora architektura wnętrza telewizora. Mówiąc prosto, nie jest to potrzebne w kontekście - po prostu podaj to, co jest konieczne. Można tu łatwo odnieść definicję z podręcznika, tj. Ukryć wewnętrzną implementację i podać tylko to, co zrobi, a nie jak to zrobić!

Mam nadzieję, że to trochę wyjaśnia!


0

Gdybym to ja stanął przed wywiadem, powiedziałbym, że z perspektywy użytkownika końcowego abstrakcja i hermetyzacja są dość podobne. To nic innego jak ukrywanie informacji. Z punktu widzenia programisty, abstrakcja rozwiązuje problemy na poziomie projektowania, a kapsułkowanie rozwiązuje problem na poziomie implementacji


0

Krótko mówiąc, Abstractiondzieje się to na poziomie klasy poprzez ukrycie implementacji i implementację interfejsu, aby móc współdziałać z instancją klasy. Zważywszy, że Encapsulationjest używany do ukrywania informacji; na przykład, uczynienie zmiennych składowych prywatnymi, aby zakazać bezpośredniego dostępu i zapewnienie im pobierających i ustawiających elementy w celu wskazania dostępu.


0

Tak !!!! Jeśli powiem, że kapsułkowanie jest rodzajem zaawansowanej abstrakcji konkretnego zakresu ,

Ilu z was przeczytało / zagłosowało na moją odpowiedź. Sprawdźmy, dlaczego mówię w ten sposób.

Muszę wyjaśnić dwie rzeczy przed złożeniem wniosku.

Jeden to ukrywanie danych, a drugi to abstrakcja

Ukrywanie danych

W większości przypadków nie dajemy bezpośredniego dostępu do naszych danych wewnętrznych. Nasze dane wewnętrzne nie powinny wychodzić bezpośrednio, ponieważ osoba zewnętrzna nie ma bezpośredniego dostępu do naszych danych wewnętrznych. Chodzi o bezpieczeństwo, ponieważ musimy chronić wewnętrzne stany konkretnego obiektu.


Abstrakcja

Dla uproszczenia ukrywanie wewnętrznych implementacji nazywa się abstrakcją. W abstrakcji skupiamy się tylko na rzeczach niezbędnych. Zasadniczo mówimy w abstrakcji o „co robić”, a nie o „jak to zrobić”. Bezpieczeństwo można również osiągnąć poprzez abstrakcję, ponieważ nie zamierzamy podkreślać tego, „jak wdrażamy”. Łatwość konserwacji zostanie zwiększona, ponieważ możemy zmienić implementację, ale nie wpłynie to na naszego użytkownika końcowego.


Powiedziałem: „Hermetyzacja jest rodzajem zaawansowanej abstrakcji konkretnego zakresu”. Czemu? ponieważ możemy postrzegać hermetyzację jako ukrywanie danych + abstrakcję

hermetyzacja = ukrywanie danych + abstrakcja

W przypadku hermetyzacji musimy ukryć dane, aby osoba z zewnątrz nie mogła ich zobaczyć i musimy zapewnić metody, których można użyć do uzyskania dostępu do danych. Metody te mogą mieć walidacje lub inne cechy wewnątrz tych rzeczy, również ukryte dla osoby z zewnątrz. Więc tutaj ukrywamy implementację metod dostępu i nazywa się to abstrakcją.

Dlatego powiedziałem, jak powyżej, hermetyzacja jest rodzajem abstrakcji.

Więc gdzie jest różnica ?

Różnica polega na tym, że abstrakcja jest ogólna, jeśli ukrywamy coś przed użytkownikiem ze względu na prostotę, łatwość konserwacji i bezpieczeństwo oraz

hermetyzacja jest specyficzna dla bezpieczeństwa stanów wewnętrznych, gdzie ukrywamy stan wewnętrzny (ukrywanie danych) i udostępniamy metody dostępu do danych oraz implementację tych metod także ukrytych przed osobą zewnętrzną (abstrakcja).


-2

Abstrakcja: jakie są minimalne funkcje i zmienne, które powinny być ujawniane poza naszą klasą.

Hermetyzacja: jak osiągnąć ten wymóg, czyli jak go wdrożyć.


Hermetyzacja nie jest środkiem do osiągnięcia abstrakcji. Są to 2 nieco różne koncepcje, ale mają subtelny związek.
varsh

Myślę, że oba nie są różnymi koncepcjami, bez u można osiągnąć hermetyzację z klasą abstrakcyjną.
K Kishore Kumar Reddy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.