Hermetyzacja czy abstrakcja?

137

Oto krótkie definicje hermetyzacji i abstrakcji.

Abstrakcja:

Proces abstrakcji w Javie służy do ukrycia pewnych szczegółów i pokazania tylko podstawowych cech obiektu. Innymi słowy, dotyczy zewnętrznego widoku obiektu (interfejsu). Jedynym dobrym przykładem, jaki widzę w różnych witrynach, jest interfejs.

Kapsułkowanie:

Chodzi w zasadzie o ukrycie stanu obiektu za pomocą modyfikatorów typu private, public, protected itp. Ujawniamy stan za pomocą metod publicznych tylko w razie potrzeby.

To, co osiągamy za pomocą modyfikatorów private, publicukrywa również niepotrzebne szczegóły z zewnątrz, co jest niczym innym jak pojęciem abstrakcji

Zatem z powyższego wyjaśnienia wygląda na to, że hermetyzacja jest częścią abstrakcji lub możemy powiedzieć, że jest podzbiorem abstrakcji. Ale dlaczego w takim razie wymyślono pojęcie hermetyzacji, skoro moglibyśmy zająć się nim tylko z abstrakcją? Jestem pewien, że powinna istnieć jakaś zasadnicza różnica, która je odróżnia, ale większość materiałów w sieci mówi prawie to samo o nich obu.

Chociaż to pytanie również zostało poruszone na tym forum wcześniej, ale piszę je ponownie z określonymi wątpliwościami. Niektóre odpowiedzi mówią również, że abstrakcja to koncepcja, a hermetyzacja to implementacja. Ale nie kupuję tego - jeśli to prawda, to myślę, że te dwie różne koncepcje mają na celu zmylić nas.

Aktualizacja: - Po 5 latach wymyśliłem własną odpowiedź, która jest sednem odpowiedzi w tym poście i poniżej

  1. różnica między abstrakcją a hermetyzacją?
  2. przykład enkapsulacji a abstrakcja w świecie rzeczywistym
M Sach
źródło
Hermetyzacja, jak zdefiniowano powyżej, jest narzędziem abstrakcji, jednak myślę o niej w kategoriach tego, co zawiera klasa (funkcjonalność / dane niezależnie od dostępu), gdzie jako abstrakcja jest bardziej poczuciem oderwania od obaw związanych z konkretnymi implementacjami, tj. niezależnie od tego, w jaki sposób jest zrobione, a co dokładnie jest zrobione, można to zrobić z wikipediiAn 'abstraction' (noun) is a concept that acts as a super-categorical noun for all subordinate concepts, and connects any related concepts as a group, field, or category.
TI
Hermetyzacja polega raczej na wiązaniu odpowiednich szczegółów (danych i zachowań, które operują na danych) związanych z kontekstem. Można to również osiągnąć bez specyfikatorów dostępu, takich jak private public, ponieważ zapewniają one tylko ukrywanie informacji / danych, które robimy, ponieważ dobrą praktyką jest ochrona danych instancji.
user3227986

Odpowiedzi:

98

Hermetyzacja to strategia stosowana jako część abstrakcji. Hermetyzacja odnosi się do stanu obiektów - obiekty hermetyzują swój stan i ukrywają go z zewnątrz; zewnętrzni użytkownicy klasy oddziałują z nią za pośrednictwem jej metod, ale nie mogą uzyskać bezpośredniego dostępu do stanu klas. Klasa usuwa więc szczegóły implementacji związane z jej stanem.

Abstrakcja jest terminem bardziej ogólnym, można ją również osiągnąć poprzez (między innymi) tworzenie podklas. Na przykład interfejs Listw bibliotece standardowej jest abstrakcją dla sekwencji elementów indeksowanych według ich pozycji, konkretne przykłady a Listto an ArrayListlub a LinkedList. Kod, który wchodzi w interakcję ze Liststreszczeniami dotyczącymi szczegółów, jakiego rodzaju listy używa.

Abstrakcja często nie jest możliwa bez ukrycia stanu podstawowego przez hermetyzację - jeśli klasa ujawnia swój stan wewnętrzny, nie może zmienić swojego wewnętrznego działania, a zatem nie można jej wyodrębnić.

Martin Probst
źródło
8
Hermetyzacja oznacza, że ​​grupa powiązanych właściwości, metod i innych elementów członkowskich jest traktowana jako pojedyncza jednostka lub obiekt. msdn.microsoft.com/en-us/library/dd460654.aspx
raberana
1
Hermetyzacja prowadzi do abstrakcji.
Martin
124

Abstrakcja to pojęcie opisywania czegoś prostszymi słowami, tj. Abstrahowania szczegółów, aby skupić się na tym, co ważne (jest to również widoczne w sztuce abstrakcyjnej, na przykład, gdzie artysta koncentruje się na elementach składowych obrazu, takich jak kolor lub kształty). Ta sama idea przekłada się na OOP dzięki zastosowaniu hierarchii dziedziczenia, w której bardziej abstrakcyjne koncepcje znajdują się na górze, a bardziej konkretne pomysły na dole opierają się na ich abstrakcjach. Na najbardziej abstrakcyjnym poziomie nie ma żadnych szczegółów implementacji i być może bardzo niewiele cech wspólnych, które są dodawane w miarę zmniejszania się abstrakcji.

Na przykład na górze może znajdować się interfejs z pojedynczą metodą, a na następnym poziomie znajduje się kilka klas abstrakcyjnych, które mogą, ale nie muszą, wypełniać niektóre szczegóły dotyczące najwyższego poziomu, ale rozgałęzia się poprzez dodanie własnych metod abstrakcyjnych , to dla każdej z tych klas abstrakcyjnych są konkretne klasy zapewniające implementacje wszystkich pozostałych metod.

Hermetyzacja to technika . Może, ale nie musi, mieć na celu pomoc w abstrakcji, ale z pewnością dotyczy ukrywania informacji i / lub organizacji. Wymaga to grupowania danych i funkcji w jakiś sposób - oczywiście dobra praktyka OOP wymaga, aby były one grupowane według abstrakcji. Istnieją jednak inne zastosowania, które tylko pomagają w utrzymaniu itp.

Robert
źródło
13
Twoja definicja abstrakcji jest najlepsza, jaką kiedykolwiek widziałem i czuję, że po raz pierwszy w życiu kliknęła mi w głowie i nabrała sensu. Wiem, że minęły ponad 3 lata, odkąd to opublikowałeś, ale dziękuję.
Casey Crookston
1
Wow… Abstrakcja… wyrażona w kategoriach sztuki… czerwień może oznaczać złość, to wszystko, co musieliśmy wiedzieć! Dziękuję za takie spojrzenie na koncepcję :-)
SlowLearner
Hermetyzacja służy do osiągnięcia „luźnego łączenia i wysokiej spójności”.
Sorter
28

hermetyzacja jest częścią abstrakcji lub możemy powiedzieć, że jest jej podzbiorem

To są różne koncepcje.

  • Abstrakcja to proces oczyszczania wszystkich niepotrzebnych / nieistotnych atrybutów obiektu i zachowania tylko tych cech, które najlepiej pasują do Twojej domeny.

    Np. Dla osoby: decydujesz się zachować imię i nazwisko oraz numer PESEL. Wiek, wzrost, waga itp. Są ignorowane jako nieistotne.

    Od abstrakcji zaczyna się Twój projekt.

  • Hermetyzacja to kolejny krok, w którym rozpoznaje operacje odpowiednie dla atrybutów, które zaakceptowałeś do zachowania podczas procesu abstrakcji. Jest to powiązanie danych z operacją, która na nich działa.
    Tj. Dane i metody są połączone razem.
Cratylus
źródło
Czy można powiedzieć, że abstrakcja jest rodzajem koncepcji projektowej, a enkapsulacja dotyczy głównie realizacji projektu, który uzgodniliśmy podczas abstrakcji?
M Sach
1
W enkapsulacji zdefiniować operacje, które mogą / muszą być stosowane do data.This może być częścią projektu jako well.Eg odzyskać SSN, ale nie go modyfikować
Kratylos
25

Kapsułkowanie ukrywanie zbędne dane w kapsule lub jednostce

Abstrakcja jest pokazywanie jest kluczowa cechę przedmiotu

Hermetyzacja służy do ukrycia jej elementu członkowskiego przed zewnętrzną klasą i interfejsem.Za pomocą modyfikatorów dostępu udostępnionych w języku c #, takich jak public, private, protected itp. Przykład:

Class Learn
{
  private int a;         // by making it private we are hiding it from other
  private void show()   //class to access it
  {
   console.writeline(a);
  }
}

Tutaj mamy zawijane dane w jednostce lub kapsule, tj. Class.

Abstrakcja jest przeciwieństwem hermetyzacji.

Abstrakcja służy do pokazania użytkownikowi ważnych i istotnych danych. najlepszy przykład ze świata rzeczywistego W telefonie komórkowym można zobaczyć różne rodzaje funkcji, jak aparat fotograficzny, odtwarzacz mp3, funkcja dzwonienia, funkcja nagrywania, multimedia itp. To jest abstrakcja, ponieważ widzisz tylko istotne informacje, a nie ich wewnętrzną inżynierię.

 abstract class MobilePhone
    {
        public void Calling();       //put necessary or essential data
        public void SendSMS();       //calling n sms are main in mobile
    }

    public class BlackBerry : MobilePhone   // inherited main feature
    {
        public void FMRadio();            //added new
        public void MP3();
        public void Camera();
        public void Recording();

    }
varsha
źródło
zgadzam się. ci faceci są czymś w rodzaju przeciwieństw. good oop ma tendencję do abstrahowania rzeczy, które się nie zmieniają i [ujmowania rzeczy, które się zmieniają] [1]. [1]: principles-wiki.net/...
Promień Tayek
15

Abstrakcja to bardzo ogólny termin, a abstrakcja w oprogramowaniu nie ogranicza się do języków obiektowych. Definicja słownikowa: „akt traktowania czegoś jako ogólnej jakości lub cechy, poza konkretnymi rzeczywistościami, określonymi przedmiotami lub rzeczywistymi instancjami”.

Asembler może być traktowany jako abstrakcja kodu maszynowego - asembler wyraża podstawowe szczegóły i strukturę kodu maszynowego, ale uwalnia cię od konieczności myślenia o zastosowanych opkodach, układzie kodu w pamięci, wykonywaniu skoków do właściwy adres itp.

Interfejs API twojego systemu operacyjnego jest abstrakcją maszyny bazowej. Twój kompilator zapewnia warstwę abstrakcji, która chroni Cię przed szczegółami języka asemblera. Stos TCP / IP wbudowany w system operacyjny oddziela szczegóły transmisji bitów w sieci. Jeśli przejdziesz do surowego krzemu, ludzie, którzy zaprojektowali twój procesor, zrobili to, korzystając ze schematów obwodów zapisanych w kategoriach „diody” i „tranzystory”, które są abstrakcjami dotyczącymi przemieszczania się elektronów przez kryształy półprzewodników.

W oprogramowaniu wszystko jest abstrakcją. Tworzymy programy, które symulują lub modelują jakiś aspekt rzeczywistości, ale z konieczności nasze modele zawsze odrywają niektóre szczegóły „prawdziwej rzeczy”. Budujemy warstwa po warstwie na warstwie abstrakcji, bo tylko tak możemy cokolwiek zrobić. (Wyobraź sobie, że próbujesz stworzyć, powiedzmy, rozwiązanie sudoku i musiałeś go zaprojektować, używając tylko kryształów półprzewodnikowych. „OK, potrzebuję tu kawałka krzemu typu N…”)

Dla porównania, „hermetyzacja” to bardzo specyficzny i ograniczony termin. Niektóre z innych odpowiedzi na to pytanie podały już dobre definicje.

Alex D.
źródło
14

Odpowiadając na moje pytanie po 5 latach, ponieważ czuję, że nadal potrzebuję więcej szczegółów

Abstrakcja:

Definicja techniczna: - Abstrakcja to pojęcie mające na celu ukrycie niepotrzebnych szczegółów (złożonych lub prostych) i pokazanie tylko podstawowych cech obiektu. Nie ma tu implementacji, to tylko koncepcja

Co to oznacza w praktyce: - Kiedy mówię, że moja firma potrzebuje jakiegoś nośnika / urządzenia, aby pracownicy mogli połączyć się z klientem. Jest to najczystsza forma abstakcji (jak interfejs w Javie), ponieważ tym urządzeniem / medium może być telefon, internet, skype, osobiście lub e-mail itp. Nie wchodzę w szczegóły dotyczące urządzenia / medium

Nawet jeśli powiem, że moja firma potrzebuje jakiegoś nośnika / urządzenia, aby pracownicy mogli łączyć się z klientem za pośrednictwem połączenia głosowego. Następnie mówię też abstrakcyjnie, ale na nieco niższym poziomie, ponieważ urządzenie / medium może być telefonem, skype lub czymś innym itp

Teraz, gdy mówię, że moja firma potrzebuje telefonu, aby pracownicy mogli łączyć się z klientem za pomocą połączenia głosowego. Następnie mówię abstrakcyjnie, ale na nieco niższym poziomie, ponieważ telefon może być dowolnej firmy, takiej jak iPhone, Samsung, Nokia itp.

Hermetyzacja: - Chodzi w zasadzie o ukrycie stanu (informacji) obiektu za pomocą modyfikatorów typu private, public, protected itp. Ujawniamy stan za pomocą metod publicznych tylko w razie potrzeby.

Co to oznacza w praktyce: - Teraz, gdy mówię, że moja firma potrzebuje iPhone'a, aby pracownicy mogli łączyć się z klientem za pośrednictwem połączenia głosowego. Teraz mówię o jakimś konkretnym obiekcie (takim jak iPhone). Mimo że nie zamierzam tu również wchodzić w szczegóły dotyczące iPhone'a, ale iPhone ma pewne informacje / implementację stanu / konkrety z nim związane, gdzie urządzenie / medium nie ma. Kiedy mówię konkretny obiekt, w rzeczywistości oznacza to każdy obiekt, który ma jakąś (niekompletną, jak klasa abstrakcyjna java) implementację / informacje z nim związane.

Więc iphone użył tutaj hermetyzacji jako strategii do ukrycia swojego stanu / informacji i ujawnienia tylko tych, które według niego powinny być ujawnione. Tak więc zarówno abstrakcja, jak i hermetyzacja ukrywają niepotrzebne szczegóły, ale abstrakcja na poziomie koncepcji i hermetyzacja faktycznie na poziomie wdrożenia

To jest sedno oparte na odpowiedziach w tym poście i poniżej

  1. różnica między abstrakcją a hermetyzacją?
  2. przykład enkapsulacji a abstrakcja w świecie rzeczywistym
M Sach
źródło
5

Hermetyzacja - proces ukrywania elementów klasy, aby uniemożliwić bezpośredni dostęp z zewnątrz. Osiąga się to za pomocą modyfikatora „private”, który zapobiega bezpośredniemu dostępowi do niektórych członków klasy (pola danych lub metody) z innych klas lub obiektów, jednocześnie zapewniając dostęp do tych prywatnych elementów członkowskich przez członków publicznych (Interface). To sprawia, że ​​członkowie klasy są chronieni jak ludzkie organy ukryte / zamknięte pod skórą lub tarczą.

Abstrakcja - Pisząc program OOP, należy przestrzegać zasady, która mówi: „do klasy należy włączać tylko te komponenty, które są interesujące w zadaniu programu”. Na przykład: obiekt uczeń ma wiele znaków jako człowiek: imię, wiek, wagę, kolor włosów, kolor oczu itp. Ale kiedy tworzysz klasę w OOP do pracy z uczniami, powinieneś uwzględnić tylko te znaki, które naprawdę sprawa dla bazy danych uczniów: imię i nazwisko, wiek, specjalność, poziom, oceny ... itd. w C ++ możesz stworzyć klasę abstrakcyjną używając modyfikatora "virtual" z dowolnymi metodami w klasie, co spowoduje, że nie będzie można jej używać bezpośrednio, ale możesz wyprowadza z niego inne klasy i tworzy implementację dla jej członków z dodaniem wymaganych członków na podstawie zadania.

Czerwony
źródło
4

Tak to zrozumiałem:

W programowaniu obiektowym mamy coś, co nazywa się klasami . Do czego służą? Mają przechowywać jakiś stan i pewne metody zmiany tego stanu, tj. Hermetyzują stan i jego metody.

To (klasa) nie dba o widoczność własną lub treści. Jeśli zdecydujemy się ukryć stan lub niektóre metody, jest to ukrywanie informacji .

Teraz weźmy scenariusz dziedziczenia . Mamy klasę bazową i kilka klas pochodnych (dziedziczonych). Więc co robi tutaj klasa bazowa? To jest abstrakcyjne niektórych rzeczy z klas pochodnych.

Wszystkie są różne, prawda? Ale mieszamy je, aby napisać dobre programy zorientowane obiektowo. Mam nadzieję, że to pomoże :)

abhilash
źródło
3

Abstrakcja wyznacza specyficzną dla kontekstu, uproszczoną reprezentację czegoś; ignoruje szczegóły nieistotne z kontekstu i zawiera szczegóły ważne z kontekstu.

Hermetyzacja ogranicza dostęp z zewnątrz do części czegoś i łączy stan tej rzeczy z procedurami, które używają tego stanu.


Weźmy na przykład ludzi. W kontekście chirurgii użyteczna abstrakcja ignoruje przekonania religijne danej osoby i obejmuje jej ciało. Co więcej, ludzie zamykają swoje wspomnienia w procesach myślowych, które wykorzystują te wspomnienia. Abstrakcja nie musi mieć hermetyzacji; na przykład obraz przedstawiający osobę nie ukrywa swoich części ani nie wiąże procedur ze swoim stanem. A hermetyzacja nie musi mieć skojarzonej abstrakcji; na przykład prawdziwi ludzie (nie abstrakcyjni) otaczają swoje narządy swoim metabolizmem.

Shaun Luttin
źródło
1

UWAGA: udostępniam to. Nie oznacza to, że tutaj nie jest dobra odpowiedź, ale dlatego, że łatwo zrozumiałem.

Odpowiedź:

Kiedy klasa jest konceptualizowana, jakie właściwości możemy w niej mieć, biorąc pod uwagę kontekst. Jeśli projektujemy klasę Animal w kontekście ogrodu zoologicznego, ważne jest, abyśmy mieli atrybut animalType opisujący zwierzęta domowe lub dzikie. Ten atrybut może nie mieć sensu, gdy projektujemy klasę w innym kontekście.

Podobnie, jakie zachowania będziemy mieć na zajęciach? Tutaj również stosowana jest abstrakcja. Co trzeba tu mieć, a co będzie przedawkowaniem? Następnie odcięliśmy część informacji od klasy. Ten proces polega na zastosowaniu abstrakcji.

Kiedy prosimy o różnicę między hermetyzacją a abstrakcją, powiedziałbym, że hermetyzacja wykorzystuje abstrakcję jako pojęcie. Więc jest to tylko hermetyzacja. Nie, abstrakcja jest nawet pojęciem stosowanym jako część dziedziczenia i polimorfizmu.

Przejdź tutaj, aby uzyskać więcej wyjaśnień na ten temat.

Yubaraj
źródło
1

Spróbujmy zrozumieć w inny sposób.

Co może się stać, jeśli nie ma abstrakcji i co może się stać, jeśli nie ma enkapsulacji.

Jeśli nie ma abstrakcji, możesz powiedzieć, że obiekt jest mniej używany. Nie możesz zidentyfikować obiektu ani uzyskać dostępu do jego funkcji. Weź przykład telewizora, jeśli nie masz opcji włączania, zmiany kanału, zwiększania lub zmniejszania głośności itp., To jaki jest pożytek z telewizora i jak go używasz?

Jeśli nie ma enkapsulacji lub nie jest ona poprawnie zaimplementowana, możesz niewłaściwie użyć obiektu. Tam dane / komponenty mogą zostać niewłaściwie wykorzystane. Weź ten sam przykład telewizora. Jeśli nie dokonano enkapsulacji głośności telewizora, kontroler głośności może być niewłaściwie używany, powodując, że spadnie poniżej lub przekroczy jego limit (0-40 / 50).

satya
źródło
1

Hermetyzacja chroni wewnętrzne zachowanie obiektu / wystąpienia przed bytem zewnętrznym. Dlatego należy zapewnić kontrolę, aby potwierdzić, że dostarczane dane nie będą szkodzić wewnętrznemu systemowi instancji / obiektu, aby przetrwać jego istnienie.

Dobry przykład, Divider to klasa, która ma dwie zmienne instancji dividend i divisor oraz metodę getDividedValue.

Czy możesz pomyśleć, że jeśli dzielnik jest ustawiony na 0, wewnętrzny system / zachowanie (getDivided) się zepsuje.

Tak więc wewnętrzne zachowanie obiektu można chronić, rzucając wyjątek za pomocą metody.

Ranjit Kumar
źródło
0

w prostym zdaniu mogę powiedzieć: istotą abstrakcji jest wydobycie podstawowych właściwości, pomijając nieistotne szczegóły. Ale dlaczego mielibyśmy pomijać nieistotne szczegóły? Głównym czynnikiem motywującym jest zapobieganie ryzyku zmiany. Możesz uznać, że abstrakcja to to samo, co hermetyzacja. Ale hermetyzacja oznacza zamknięcie jednego lub więcej elementów w kontenerze, bez ukrywania szczegółów. Jeśli argumentujesz, że „wszystko, co zostało zamknięte, było również ukryte”. To oczywiście nieprawda. Na przykład, mimo że informacje mogą być zawarte w strukturach rekordów i tablicach, informacje te zwykle nie są ukryte (chyba że są ukryte za pomocą innego mechanizmu).

Alireza Rahmani Khalili
źródło