Wujek Bob każe by klasy były otwarte na rozszerzenia ale zamknięte na zmiany. Czy rozszerzenie oznacza tylko dziedziczenie czy także rozbudowywanie metod poprzez ingerencję w ich kodzie?
Problem praktyczny:
Mam apkę do przeglądania tego forum, która składa się z klas:
*Topic* - klasa abstrakcyjna, przechowuje wątek z forum, zwraca posty z tematu którym jest
Topic4programmers - dziedziczy po Topic, działa na naszym forum
*Post* - klasa abstrakcyjna, posty tematu, zwraca zawartość postów
Post4programmers - dziedziczy po Post, działa na naszym forum
i załóżmy, że celem apki jest to by można było se przeglądać wybrany temat i zliczyć słowa w postach. W tym wypadku nie jest konieczne przechowywanie pobranych postów, bo będą potrzebne tylko raz.
Ale co jeśli za rok se wymyślę apkę, która robi wiele operacji na postach i musiałaby je pobierać po kilka razy? Wtedy by mi się przydał wzorzec Flyweight by nie pobierać Jsoupem tych samych postów po kilka razy, bo to trwa długo: zrobiłbym Kolekcję Post
ów w Topic
.
Jak więc jest najlepiej:
- od początku dodać funkcjonalność w stylu Flyweight, rozbudowanie klas na wyrost, a nóż się przyda.
- robić minimalne funkcjonalności i potem dziedziczyć po klasie Topic4programmers, żeby w tej nowej ponadpisywać niektóre metody i dołozyć?
- robić minimalne funkcjonalności i potem edytować obecne klasy.