Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony][SF2][Symfony2]Separacja kodu serwisów od komponentów frameworka
Forum PHP.pl > Forum > PHP > Frameworki
daniel1302
Hej, mam taki problem:

Piszę kalkulator do obliczeń danych finansowych na podstawie różnych kryteriów np.: miejscowości, rodzaje zatrudnienia, wielkośc firmy itp...

Mam taka strukturę

  1. src/myBundle/SomeCalculator:
  2. |-Calculator
  3. |- Calculator.php - interfejs z metodą compute();
  4. |- CalculatorFactory.php - fabryka do kalkulatorów
  5. |- CityCalculator.php - kalkulator do kryterium miejscowości
  6. |- EmploymentTypeCalculator.php - kalkulator do kryterium rodzaj zatrudnienia
  7. |- .... - kalkulatory wielu innych kryteriów.
  8. |-CalculatorService.php- serwis który jest definiowany w symfony i defacto ta klasa jest wykorzystywana w kontrolerze.



CalculatorService posiada metodę compute() która poprzez fabrykę tworzy klasy kalkulatorów dla kolejnych kryteriów i po kolei je uruchamia.

i teraz mam problem, niektóre kryteria wymagają słowników pobranych z BD, np miejscowości, bo jest ich kilka tysięcy,
niektóre natomiast mają słowniki zahardcodowane w kodzie, bo słownik rodzajów zatrudnienia to raptem 4 elementowa tablica.

I jak przekazywać te słowniki?
Zrobić w interfejsie metodę setDictionary albo wstrzykiwać jako zależnośc konstruktora?

Myślałem, żeby te klasy które mają słowniki wklepane w kodzie trzymały je w sobie, ale znowu wprowadzi to zamęt bo część słowników będzie przekazywana a częśc zakodowana w klasach.

Mam jeszcze jedno rozwiązanie, stworzyć osobny serwis np SomeCalculatorDictionaryResolver z metodą getDictionary(TYPE): array;

Co wybyście w takiej sytuacji zrobili?
lukaskolista
A czemu kalkulatory same w sobie nie mogą być usługami zdefiniowanymi w konfiguracji kontenera?

Cytat
CalculatorService posiada metodę compute() która poprzez fabrykę tworzy klasy kalkulatorów dla kolejnych kryteriów i po kolei je uruchamia.
Tą samą fabryką tworzysz obiekty różnych klas? Zły pomysł.

Cytat
Zrobić w interfejsie metodę setDictionary albo wstrzykiwać jako zależnośc konstruktora?
setDictionary to kiepski pomysł, bo zmuszasz klasy implementujące interface do posiadania słowników (inaczej złamiesz zasadę interface segregation).
daniel1302
Obiekty różnych klas, lecz tego samego interfejsu SomeCalculatorInterface
  1. interface SomeCalculatorInterface {
  2. public funcion compute() : SomeEntity[];
  3. }


Te słowniki to faktycznie chyba zrobię osobną klase słownika i klasy będą korzystać z tej klasy.
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.