Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony][SF2][Symfony2]Separacja kodu serwisów od komponentów frameworka
daniel1302
post 10.01.2017, 05:33:02
Post #1





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


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?

Ten post edytował daniel1302 10.01.2017, 05:33:28
Go to the top of the page
+Quote Post
lukaskolista
post 10.01.2017, 08:45:35
Post #2





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


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).
Go to the top of the page
+Quote Post
daniel1302
post 10.01.2017, 09:00:17
Post #3





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


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.

Ten post edytował daniel1302 10.01.2017, 09:04:49
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 18.04.2024 - 19:50