Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Współpraca Entity
athabus
post 4.06.2018, 14:39:05
Post #1





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


Mam takie pytanie teoretyczne, które od czasu do czasu pojawia się w moich projektach. Najlepiej chyba będzie opisać na przykładzie.

Piszę aplikację sportową (konkretnie dla pływaków) we frameworku Symfony i w niej mam między innymi dwa obiekty Entity:
- User
- Interval

Użytkownik ma pewne cechy definiowalne - np. prędkość bazową (dajmy na to 2:00/100m), modyfikatory prędkości (np. gdy ma płetwy to płynie 10s/100m szybciej niż bez etc).

Interwał to cegiełka z której buduję treningi do wykonania. Czyli każdy interwał posiada między innymi:
- dystans do pokonania
- prędkość wyrażoną jako prdkość bazowa +/- x sekund.
- listę modyfikatorów do zastosowania - czyli np. dany interwał użytkownik ma płynąć w płetwach

I teraz dochodzimy do tego co mnie interesuje. Mam konkretny interwał w którym jest płyń z prędkością bazową - 5s oraz użyj płetw. Mam konkretnego użytkownika, dla którego prędkość bazowa to 2:00, a modyfikator płetw daje - 10s. Czyli finalnie ten konkretny użytkownik ma popłynąć ten konkretny interwał w tempie 2:00 (prędkość bazowa użytkownika) - 5s (ustawienie interwału) - 10s (bonus za płetwy) - razem daje 1:45/100m.

Pytanie brzmi - jaki obiekt powinien obliczyć tą konkretną wartość, żeby było prawidłowo i zgodnie ze sztuką.

Interwał raczej nie powinien wiedzieć o użytkowniku i vice versa. Robienie tych samych obliczeń w 50 miejscach (np. w kontrolerach) jest bez sensu i trudne w utrzymaniu. Osobiście w tym celu stosuję usługę, którą sobie nazwałem WorkoutService i mam tam takie funkcje jak np getIntevalPace.

Zastanawiam się czy to jest dobre rozwiązanie, czy może jakoś inaczej powinienem to ogarniać.

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
athabus
post 6.06.2018, 10:05:04
Post #2





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


@Crozin - kod na tą chwilę: https://www.dropbox.com/s/jn5amv1dk12pwel/w...ervice.php?dl=0

Nie wiem jednak czy zrozumiesz kod na podstawie tej jednej klasy. W każdym razie powiem tylko, że są w niej ogólnie 3 typy metod:
- podstawowe typu klonowanie poszczególnych części
- obliczanie temp/długości interwałów w zależności od ustawień vcsettings
- obliczanie generycznych temp. w Skrócie obliczenie długości treningu jest dość skomplikowane więc obliczam 3 czynniki istotne aby je cachować - tj. mnożnik metrów płyniętych w tempie bazowym, mnożnik zmienności tempa, mnożniki dla modyfikatorów. Dzięki temu potem mogę na liście łatwo podstawić te mnożnik pod danego użytkownika i obliczyć czas treningu bez zażynania basy setkami zapytań.

Co do pozostałych Twoich punktów mam pewne przemyślenia, ale na razie ich nie opisuję, żeby nie mnożyć wątków. Z częścią się zgadzam, z częścią mam wrażenie, że byłoby to dokładnie to o czym piszesz, czyli zbytnie rozbudowanie w sumie prostej rzeczy. Ale na razie nie wchodzę w szczegóły bo zależy mi bardziej na dyskusji "akademickiej" niż tym konkretnym przypadku.
Jestem ciekaw jak sam WorkutService ocenisz - mi się tam już teraz pewne rzeczy nie podobają, ale nie do końca wiem jak je sensownie poprawić.


@SmokAnalog - ale tak komunikacja user <=> interval to chyba raczej nie powinna być w encji? Na szybko wiadomo byłoby to najwygodniejsze, ale utrzymanie tego kodu to by było piekiełko potem, bo user pojawiałby się w kilkunastu klasach projektu i każda zmiana w klasie user byłaby potem koszmarem. Wydzielenie wspólnych relacji do osobnej klasy wydaje mi się sensowne. Klasy user/vcsettings już wcześniej rozbudowywałem kilka razy o nowe funkcje i świadomość tego, że mam ściśle określone punkty styku z innymi obiektami sporo upraszcza.
Go to the top of the page
+Quote Post

Posty w temacie


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: 29.03.2024 - 13:28