Wyodrębnienie Superklasy
Zazwyczaj tworzymy superklasę na podstawie której tworzymy inne klasy. Bo to z nadklasy się one wywodzą. Czyli wykorzystujemy dziedziczenie.
W tym artykule omówię natomiast sytuacje, w której z kilku już istniejących klas powstaje superklasa - na odwrót. Jest to szczególnie efektywne przy równoczesnym wykorzystaniu interfejsów .
Do rzeczy
Mamy kilka klas (2+), które nie mają jeszcze nadklasy. Jednak czujemy, widzimy że coś je łączy, mają ze sobą coś wspólnego. Szczególnie gdy implementują ten sam interfejs. Wówczas możemy zastanowić się nad pójściem krok dalej. Nad powiązaniem ze sobą tych klas za pomocą dziedziczenia poprzez wyodrębnienie z nich superklasy. Świetnym przykładem jest tutaj wzorzec template method.
Jest to bardzo przydatne i efektywne, ponieważ zazwyczaj umożliwia to nam wyodrębnienie sporej ilości kodu. Wyodrębnienie go, nadania mu cechy re-używalności oraz wypchnięcia w górę - prosto do superklasy. Z której już wszystkie pozostałe mogą czerpać garściami .
Dziedziczenie + Interfejsy
Interfejsy bardzo dobrze współpracują z dziedziczeniem. Ich połączenie daje nam bardzo dużo i pozwala wyciągnąć większy potencjał z naszej architektury. Pozwala podnieść go na wyższy poziom abstrakcji. A to zawsze jest super .
Dziedziczenie + Interfejsy + Traity
Możemy jeszcze wykorzystać tutaj traity. Nie to jest tematem tego artykułu. Ale z całą pewnością sprawne ich wykorzystanie w połączeniu z interfejsami i dziedziczeniem da nam jeszcze lepsze rezultaty.
Jak wykonać?
Trzeba tutaj zauważyć podobieństwa między klasami, czasem przyjdzie nam to łatwo, czasem nie. Szczególnie zwróć uwagę na klasy które nie posiadają superklasy, a są powiązane ze sobą za pomocą interfejsu.
Również zwróć szczególną uwagę na wszelkie oznaki powtarzalności kodu w tychże klasach. Powinieneś od razu wyczuć kiedy coś zaczyna się powtarzać. To znak, że warto się tutaj zatrzymać i coś z tym zrobić. Nie reguła - ale dobry znak. Tak samo z właściwościami klasy .
Uważaj
Warto tutaj wspomnieć o tym, że nie powinno dojść do sytuacji w której pewne klasy należące do superklasy dziedziczą funkcjonalność której nie używają, nie potrzebują lub nawet do nich należeć nie powinna.
Tak samo jeśli chodzi o interfejsy. Nie dopuść do sytuacji w której dana klasa musi implementować metodę - na mocy interfejsu - której nie używa i używać nie będzie. Której co więcej nie powinno tam być.
Metoda
Uważam, że jest to dość ciekawe i wygodne podejście. Robić klasę z perspektywą na interfejs i jeszcze dalszą perspektywą na superklasę... Fajnie.
To wszystko
Dziękuję za lekturę oraz zapraszam do komentowania i innych moich artykułów . Życzę ci dobrego dnia, bywaj!