Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jaki wzorzec projektowy użyć
Forum PHP.pl > Forum > PHP
darkin1
Kolekcja w MongoDB
  1. {
  2. "_id": 1
  3. "name": "Acme",
  4. "createdAt" : ISODate("2016-01-30T15:40:59.153Z")
  5. "billing" : {
  6. "totalCost" : 100,
  7. "expire" : ISODate("2016-02-30T08:18:52.000Z"),
  8. },
  9. "settings": {
  10. "language" : "en",
  11. "logo" : '/ptah/to/logo.png',
  12. "color" : {
  13. "plugin" : "#496492",
  14. "button" : "#46A0D8"
  15. },
  16.  
  17. },
  18. "tags" : [
  19. "tag1",
  20. "tag2",
  21. "tag3"
  22. ],
  23. }


Zastanawiam się nad uzyciem któregoś z wzorców projektowych,
chciałbym aby wyglądało to mniej wiecej tak:

  1. class Company {
  2.  
  3. protected $company = null;
  4.  
  5. public function getCompany() {
  6. $this->company = Company::where('_id', 1)->first();
  7. }
  8.  
  9. }
  10. class Billing {
  11.  
  12. protected $company = null;
  13.  
  14. public function setBilling() {/*ustawia dane*/}
  15. }
  16. class Settings {
  17.  
  18. public function setSettings() {/*ustawia dane*/}
  19. }
  20. class Tags {
  21.  
  22. public function setTags() {/*ustawia dane*/}
  23. }
  24.  
  25. $companyModel = new Company();
  26. $companyModel->getCompany();
  27. $companyModel->setBilling([
  28. 'totalCost' => 500
  29. ]);
  30. $companyModel->setSettings([
  31. 'language' => 'pl',
  32. 'logo' => '/nowy/path/logo.png'
  33. ]);
  34. $companyModel->setTags([
  35. 'tags' => ['tag4', 'tag5', 'tag6']
  36. ]);
  37.  
  38. $companyModel->save();


Czyli mamy gówną klasę która pobiera całą kolekcje i teraz w "globalnym" atrybucie przetrzymujemy wszystkie dane,
a odwołując się do metod innych klas mogę zmienić dane poszczególnych subkolekcji i na końcu zapisać wszystkie zmiany

Myślałem nad wzorcem Obserwatora albo Fasady, ale żaden z nich do końca mi nie pasuje

  1. $settingsModel = new Settings();
  2. $settingsModel->setSettings([
  3. 'language' => 'en'
  4. ]);
  5. $settingsModel->save();


Chciałbym też aby poszczególne klasy mogły działać także osobno.
Jakieś pomysły jaki wzorzec projektowy wykorzystać do takiego zadania?
piotras
Nie wiem, czy dobrze odczytuję twoje intencje. Kilka uwag poniżej. Może się przydadzą.

1. Dlaczego nie pobierzesz Company już w konstruktorze? Zaoszczędzi ci to inicjowwania getCompany na początku
2. Relacja Company - Billing zrobiłbym Strategię (Strategy) a z samej Biling klasę abstrkcyjną i z niej już konkretny model rozliczenia. To na wypadek, jak byś kiedyś miał zrobić kilka rodzajów rozliczeń
3. Tags i Settings zostawiłbym w spokoju (zakładam, że chodzi o właściwości Company). Po co komplikować?

Jak Ci nie leży tutaj żadnej wzorzec, to nie musisz go dawać smile.gif. Nie ma przymusu
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.