Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wzorzec fabryki
Orzeszekk
post
Post #1





Grupa: Zarejestrowani
Postów: 260
Pomógł: 14
Dołączył: 8.09.2011

Ostrzeżenie: (0%)
-----


Pytanie do mądrzejszych ode mnie forumowiczów.

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:

  1. class abstractMessage{
  2. public static function load($databaseRow)
  3. {
  4. [....]
  5. switch ($databaseRow->type)
  6. {
  7. case TYPE_SMS_MESSAGE: return new SmsMessage($databaseRow); break;
  8. case TYPE_EMAIL_MESSAGE: return new EmailMessage($databaseRow); break;
  9. }
  10. }
  11. }

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ąć (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mortus
post
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


  1. class abstractMessage {
  2. /* ... */
  3. public static function load($databaseRow) {
  4. $messageType = $databaseRow->type;
  5. $className = ucfirst(strtolower(substr($messageType, 6, strpos('_', $messageType, 6)-1))) . 'Message';
  6. return new $className($databaseRow);
  7. }


Oczywiście to wtedy, jeśli $databaseRow->type przechowuje nazwy stałych, to jest TYPE_SMS_MESSAGE, czy TYPE_EMAIL_MESSAGE.
Pisane z palca, ale na oko widać, że metodę można "udoskonalić".

Wypada również sprawdzić, czy klasa o nazwie zawartej w zmiennej $className istnieje i jest załadowana, a dopiero później spróbować utworzyć obiekt tej klasy a potem go zwrócić. W przypadku niepowodzenia można rzucić wyjątek.

Ten post edytował mortus 16.11.2011, 15:11:48
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 8.10.2025 - 03:44