OOP Flashcards
Czym jest abstrakcja ?
Abstrakcja jest modelem rzeczywistego obiektu lub zjawiska, ograniczonego do pewnego kontekstu, przez co dokładnie przedstawia szczegóły związane z tym kontekstem, ale pomija pozostałe.
Obiekty programu nie reprezentują jednak swoich rzeczywistych pierwowzorów w pełni (i rzadko muszą). Zamiast tego, modelują one atrybuty i zachowanie prawdziwych obiektów w pewnym kontekście, ignorując resztę.
Hermetyzacja
Hermetyzacja to zdolność obiektu do ukrywania części swojego stanu i zachowania przed innymi obiektami, eksponując reszcie programu tylko ograniczony interfejs.
Hermetyzować coś oznacza uczynić to coś prywatnym , a tym samym dostępnym wyłącznie w obrębie metod swojej klasy. Istnieje nieco mniej restrykcyjny poziom dostępu zwany chronionym , który czyni składową klasy dostępną także podklasom.
Interfejs ogólnie
- typ abstrakcyjny posiadający jedynie operacje a nie dane.
- nie może być utworzony obiekt tego typu
- referencja może wskazywać na dowolny obiekt klasy implementującej interfejs
- interfejs udostępnia operacje, nie zawiera ich implementacji i danych
- klasy mogą implementować wiele interfejsów, bez problemów wielkrotnego dziedziczenia
- pozwala na hermetyzacje obiektów, utworzonych w oparciu o klasy zawierające implementacje
- kontrakt gwarantujący zestaw zachowań
Dziedziczenie
- możliwość tworzenia nowych klas na bazie istniejących
- możliwość ponownego wykorzystania kodu - jeśli potrzebujesz stowrzyć klasę która rozszerza obecną
- podklasa przejmie metody i pola klasy bazowej (metody które są inne niż private)
- problem z hermetyzacja - przejmuję metody z interfejsu rodzica
Polimorfizm
- zdolność programu do wykrywania faktycznej klasy obiektu i wywoływania jego implementacji nawet gdy typ jest nieznany w danym kontekście.
- zdolności obiektów różnych klas do bycia traktowanymi jako instancje tej samej klasy, najczęściej klasy bazowej lub interfejsu.
Czym jest zależność pomiędzy obiektami ?
- najbardziej podstawowy i najsłabszy związek między klasami
- jeśli pewne zmiany w definicji jednej z nich mogą skutkować modifikacjami drugiej
- gdy ktoś zmieni metodę getKnowledge() klasy Course to kod się popsuje
Asocjacja
- relacja w której jeden obiekt korzysta z innego lub wchodzi w interakcje z innym obiektem
- rodzaj zależności, w której obiekt zawsze ma dostęp do obiektu z którym wchodzi w interakcję
- stosowana do przedstawienia takich elementów jak na przykład pole klasy
- jeśli zmieni się kod remember() w klasie Student to zepsuje klase profesor
- Student jest cześcią klasy Professor
Agregacja
- szczególny rodzaj asocjacji
- reprezentuje relacje one - to many oraz many-to-many
- zazwyczaj obiekt “posiada” zestaw innych obiektów
- jeden obiekt służy za kontener
- komponent może istnieć bez kontenera
Kompozycja
- szczególny rodzaj agregacji
- obiekt składa się z jednej lub więcej instancji innego
- ## obiekt może istnieć tylko jak cześć kontenera
Jakie są rodzaje polimorfizmu ?
- Compile-Time polymorphism
- mehod overloading
- static polymoprhism - Runtime Polymoprhism
- method overriding
-
Polymorphims szczegóły działania
- Java cechuje się silnym typowaniem , kod programu musi zawsze określać typ obiektu podczas deklaracji zmiennych
- możemy również **zadeklarować zmienną której typem jest nadklasa i przypisać jej instancję jednej z podklas **
Dancer breakdancer = new Breakdancer("Mati", 19); // Konwersja rozszerzająca do typu podstawowego Dancer electricBoogieDancer = new ElectricBoogieDancer("Zuzia", 20); // Konwersja rozszerzająca do typu podstawowego List<dancer> disco = Arrays.asList(dancer, breakdancer, electricBoogieDancer); for (Dancer d : disco) { d.dance(); // Wywołanie metody polimorficznej }
- odbywa się tutaj niejawna konwersja rozszerzająca przez kompilator - odwołanie do obiektu jest traktowanie jak odwołanie do klasy bazwoej
- Dancer ma wiele form
- każda z form może mieć własne unikalne zachowanie
Zalety polimorfizmu
- ogólne metody i klasy, które mogą pracować z różnymi typami obiektów, a nie tylko z jednym konkretnym.
- jednen interfejsu do operowania na różnych typach obiektów
- dodawanie nowych klas, które implementują dany interfejs lub dziedziczą po danej klasie bazowej, bez konieczności modyfikowania istniejącego kodu korzystającego z tego interfejsu lub klasy bazowej.
5. Ułatwienie testowania
6. wsparcie SOLID
Wady dziedziczenia
1.** Zbyt złożona hierarchia klas**: Nadmierne korzystanie z dziedziczenia może prowadzić do skomplikowanych hierarchii klas, co może utrudniać zrozumienie i utrzymanie kodu.
- Brak hermetyzacji: Dziedziczenie narusza hermetyzację, ponieważ podklasa może uzyskać dostęp do chronionych członków klasy nadrzędnej. Może to prowadzić do nieprzewidywalnych efektów ubocznych.
3.** Ryzyko nieodpowiedniego dziedziczenia**: Istnieje pokusa, aby wykorzystać dziedziczenie do osiągnięcia ponownego użycia kodu, nawet gdy relacja “jest rodzajem” (is-a) nie jest logiczna lub odpowiednia.
Interfejs vs Klasa Abstrackcyjna
Kiedy użyc klasy abstrakcjnej a kiedy interfejsu