abstrakcyjnego typu posiadającego jedynie operacje, a nie dane. Kiedy w konkretnej klasie zdefiniowane są wszystkie metody interfejsu mówimy, że klasa implementuje dany interfejs. ~Wikipedia
nazywamy mechanizm współdzielenia funkcjonalności między klasami. Klasa może dziedziczyć po innej klasie, co oznacza, że oprócz swoich własnych atrybutów oraz zachowań, uzyskuje także te pochodzące z klasy, z której dziedziczy. ~Wikipedia
skonfigurowanych klas pochodnych Zmiana w metodzie klasy bazowej wymusza zmianę wszystkich metod w klasach pochodnych (np. zmiana zwracanego typu) Brak możliwości zmiany zachowania w trakcie działania programu Powielanie kodu Źle zaprojektowana struktura klas prowadzi do omijania „na siłę” problemów dziedziczenia
klasy + SRP – klasy odpowiadają tylko za najważniejsze operacje, pozostałe są delegowane do odpowiednich komponentów + Możliwość zmian obiektu w locie, mechanizm „upgrade’owania” + DRY
sterowania) – to paradygmat programowania (czasami uznawany za wzorzec architektury) polegający na tym, że niezbędne dla danej klasy komponenty otrzymywane są z zewnątrz. Szczególny nacisk w tym podejściu kładzie się na reużywalne komponenty, co osiągniemy wykorzystując interfejsy.
wstrzykiwanie zależności) to podstawowa, poza wzorcem Strategia, realizacja Inversion of Control. Niezbędne dla danej klasy zależności są „wstrzykiwane” w zależności od potrzeby poprzez konstruktor, metodę lub do konkretnego pola (constructor injection, method injection, property injection). Gwarantuje to tworzenie luźno powiązanego kodu.
kodzie wykorzystuje się tzw. kontenery. Zadaniem kontenerów IoC jest grupowanie wybranych komponentów oraz interfejsów które implementują po to, aby w razie potrzeby móc „rozwiązać” daną zależność.
komponentów tworzenie (małych) klas o ściśle określonych zadaniach kod możliwy do testowania – klasa może otrzymać dowolny komponent o ile implementuje on niezbędny interfejs
poszczególne komponenty mogą być w dowolnej chwili wymienione Szersze spojrzenie na tworzony system, kwestia implementacji danej klasy może być odłożona w czasie Ułatwienie pracy programistów – brak konieczności oczekiwania na zaimplementowanie danej metody, wystarczy „trzymać się” określonej przez interfejs konwencji Tworzenie kodu możliwego do testowania