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
, public
ukrywa 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
An '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.
private
public
, ponieważ zapewniają one tylko ukrywanie informacji / danych, które robimy, ponieważ dobrą praktyką jest ochrona danych instancji.Odpowiedzi:
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
List
w bibliotece standardowej jest abstrakcją dla sekwencji elementów indeksowanych według ich pozycji, konkretne przykłady aList
to anArrayList
lub aLinkedList
. Kod, który wchodzi w interakcję zeList
streszczeniami 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ć.
źródło
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.
źródło
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.
Tj. Dane i metody są połączone razem.
źródło
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:
Tutaj mamy zawijane dane w jednostce lub kapsule, tj. Class.
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ę.
źródło
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.
źródło
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
źródło
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.
źródło
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 :)
źródło
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.
źródło
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.
źródło
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).
źródło
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.
źródło
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).
źródło