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?
źródło
Odpowiedzi:
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.
źródło
Ten obraz dobrze podsumowuje różnicę między nimi:
Źródło tutaj
źródło
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).
źródło
Hermetyzacja: pakowanie kodu i danych razem w jedną jednostkę.
Class
jest 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.
Tutaj ToString () jest abstrakcją. I jak ta
number
zmienna 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.
źródło
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)
źródło
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:
źródło
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
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
źródło
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.
źródło
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.
źródło
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.
źródło
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?
A więc o klasie abstrakcyjnej! - Instancji klasy abstrakcyjnej nie można utworzyć tylko jako rozszerzenie! Ale dlaczego ?
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!
źródło
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!
źródło
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
źródło
Krótko mówiąc,
Abstraction
dzieje się to na poziomie klasy poprzez ukrycie implementacji i implementację interfejsu, aby móc współdziałać z instancją klasy. Zważywszy, żeEncapsulation
jest 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.źródło
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ę
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).
źródło
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ć.
źródło