Mam klase np. abstractMessage która jest szkieletem zapisujacym message do bazy danych.
następne z klasy abstractMessage tworze klasy pochodne np SMSMessage, EmailMessage.
Rodzaj wiadomosci przechowuje w polu $type obiektu abstractMessage, dzieki czemu wiadomo czy to SMSMessage, i EmailMessage.
Potrzebuje wzorca fabryki (metody wytwórczej?), tylko poprawnego. Teraz bym to zrobił tak:
class abstractMessage{ { [....] switch ($databaseRow->type) { case TYPE_SMS_MESSAGE: return new SmsMessage($databaseRow); break; case TYPE_EMAIL_MESSAGE: return new EmailMessage($databaseRow); break; } } }
jednak takie rozwiązanie jest podobno do kitu ponieważ w przypadku jeżeli powstaną nowe typy dziedziczące po abstractMessage to będe musiał zmodyfikować ten switch tworzący obiekty, a w ten sposob zlamie zasade otwarte-zamknięte - zamiast rozszerzać klasę dodajac metody modyfikuję istniejący kod w celu rozszerzenia funkcjonalności.
No a jeżeli nie utworze odpowiedniego typu (SMSMessage, EmailMessage) to nie będę mógł użyć ich specyficznych metod.
Więc jak to poprawnie rozwiązać? Chcę rozwiązania na maksa poprawnego z dobrymi praktykami programistycznymi, bo już dostałem niedawno durszlakiem pełnym kodu spagetti mocno w głowę i chcę tego uniknąć
