Mylić z definicją „abstrakcji” w OOP

16

Próbuję zrozumieć definicję „abstrakcji” w OOP.

Natknąłem się na kilka głównych definicji. Czy wszystkie są ważne? Czy któryś z nich się myli? Jestem zmieszany. (Ponownie napisałem definicję własnymi słowami).

Definicja 1:

Abstrakcja to koncepcja pobierania jakiegoś obiektu ze świata rzeczywistego i konwertowania go na warunki programowania. Takie jak tworzenie Humanklasę i dając go int health, int age, String nameitp właściwości i eat()itp metody.

Definicja 2:

Bardziej ogólna definicja. Abstrakcja to koncepcja, która ma miejsce w dowolnym miejscu w systemie oprogramowania, w którym chodzi o „uczynienie rzeczy bardziej ogólnymi / prostszymi / abstrakcyjnymi” . Kilka przykładów:

  • Hierarchia dziedziczenia, w której wyższe klasy są prostsze lub bardziej ogólne i definiują bardziej ogólne i abstrakcyjne wdrożenie. Natomiast niższe klasy w hierarchii są bardziej konkretne i definiują bardziej szczegółowe implementacje.

  • Wykorzystanie enkapsulacji do ukrycia szczegółów implementacji klasy przed innymi klasami, czyniąc ją bardziej „abstrakcyjną” (prostszą) dla zewnętrznego świata oprogramowania.

Definicja 3

Inna ogólna definicja: abstrakcja to koncepcja przeniesienia uwagi ze szczegółów i konkretnej implementacji rzeczy na rodzaje rzeczy (tj. Klasy), dostępne operacje (tj. Metody) itp., Dzięki czemu programowanie jest prostsze, bardziej ogólne, i bardziej abstrakcyjne. (Może to mieć miejsce w dowolnym miejscu i dowolnym kontekście w systemie oprogramowania). Odbywa się to na przykład podczas enkapsulacji, ponieważ enkapsulacja oznacza ukrywanie szczegółów implementacji i pokazywanie tylko typów rzeczy oraz ich bardziej ogólnych i abstrakcyjnych definicji. Innym przykładem byłoby użycie Listobiektu w Javie. ten obiekt faktycznie używa szczegółów implementacji an ArrayListlub a LinkedList, ale ta informacja jest abstrakcyjna przy użyciu bardziej ogólnej nazwy List.

Czy którakolwiek z tych definicji jest poprawna? (Mam na myśli najbardziej konwencjonalną i przyjętą definicję).

Aviv Cohn
źródło
Abstrakcja definiuje „rzecz” jako określony TYP rzeczy (Zwierzę => Pies), aby zawęzić ją jeszcze bardziej (Pies => Pudel).
Christine,

Odpowiedzi:

22

Abstrakcja jest jednym z 3 filarów programowania obiektowego (OOP). To dosłownie oznacza postrzeganie bytu w systemie lub kontekście z określonej perspektywy. Usuwamy niepotrzebne szczegóły i skupiamy się tylko na aspektach, które są niezbędne w danym kontekście lub rozważanym systemie.

Oto kilka dobrych wyjaśnień:

Ty jako osoba masz różne relacje w różnych rolach. Kiedy jesteś w szkole, jesteś „uczniem” . Kiedy jesteś w pracy, jesteś „pracownikiem” . Kiedy przebywasz w instytucji rządowej, możesz być postrzegany jako „obywatel” . Sprowadza się to zatem do tego, w jakim kontekście patrzymy na byt / obiekt. Więc jeśli modeluję system płac , będę patrzeć na ciebie jak na pracownika (PRN, pełny etat / część etatu, wyznaczenie) . Jeśli modeluję system rejestracji na kurs , wezmę pod uwagę twoje aspekty i cechy jako ucznia (numer rolki, wiek, płeć, zapisany kurs) . A jeśli modeluję system informacyjny zabezpieczenia społecznegowtedy spojrzę na twoje dane jako obywatela (np. DOB, płeć, kraj urodzenia itp.)

Pamiętaj, że abstrakcja (koncentracja na niezbędnych szczegółach) różni się od enkapsulacji (ukrywanie szczegółów przed światem zewnętrznym). Hermetyzacja oznacza ukrywanie szczegółów obiektu i zapewnienie przyzwoitego interfejsu dla bytów w świecie zewnętrznym do interakcji z tym obiektem lub bytem. Na przykład, jeśli ktoś chce poznać moje imię, to nie może uzyskać bezpośredniego dostępu do moich komórek mózgowych, aby poznać moje imię. Zamiast tego osoba ta zapyta o moje imię. Jeśli kierowca chce przyspieszyć pojazd, do tego celu służy interfejs (pedał przyspieszenia, bieg itp.).

Pierwszy def nie jest zbyt jasny. Def 2 jest dobry, ale zwykle myli początkującego, gdy próbuje połączyć abstrakcję z enkapsulacją i dziedziczeniem. Def 3 to najlepsza z 3 definicji, ponieważ precyzyjnie definiuje, czym jest abstrakcja.

Maxood
źródło
3
Powiedziałbyś więc, że to jest jak uogólnienie zamiast specyfikacji?
Robert Rocha,
1
@samyismyhero Dokładnie! Szukamy ogólnych atrybutów i zachowania obiektów do abstrakcji.
Maxood,
[Animal => Dog] to abstrakcja. Ty określasz, jakie możliwe części może mieć „zwierzę”, aby stworzyć „psa”. (Ogon, nogi, futro itp.). Następnie możesz użyć klasy „Pies”, aby zdefiniować Pudla, Pit Bulla itp. Dlatego deklarujesz rasy psów na podstawie klasy „Pies” zamiast „Zwierząt”.
Christine,
3

Definicja 1 zdecydowanie nie jest abstrakcją. To dokładniej opisuje modelowanie .

Definicje 2 i 3 opisują to samo. Oba są całkiem dobrym opisem abstrakcji.

Euforyk
źródło
Tak myślałem! abstract class Shapelol!
Robert Rocha,
2

Każda z tych definicji jest w porządku.

Abstrakcja polega na skupieniu się tylko na tych szczegółach, które są ważne dla twojego celu.

W pierwszym przypadku (obecnie) nie możesz włączyć prawdziwych ludzi do swojego kodu; skupiasz się na konkretnych szczegółach osoby, która spełnia twoje zadanie. W innym programie może być konieczne skupienie się na różnych szczegółach. Byłyby to różne abstrakcje osoby i każda z nich może być równie ważna w swoim kontekście .

Druga i trzecia definicja kontynuują ten pomysł, stosując go do bytów oprogramowania.

andy256
źródło