[PHP]Refaktoryzacja kontrolerów Symfony. Proszę o wskazówki. |
[PHP]Refaktoryzacja kontrolerów Symfony. Proszę o wskazówki. |
28.09.2016, 02:10:47
Post
#1
|
|
Grupa: Zarejestrowani Postów: 144 Pomógł: 0 Dołączył: 15.09.2016 Skąd: Warszawa Ostrzeżenie: (0%) |
Chciałbym zabrać się za refaktoryzację projektu (pierwszego i jedynego jaki zrobiłem - praca dyplomowa inż). Robiłem go nie zwracając uwagi na zasady porządnego kodu, bo ich nie znałem, projekt miał wyglądać dobrze w przeglądarce internetowej a nie w IDE. Teraz, gdy naczytałem się stosu książek i best practices głowa pęka i nie potrafię tego natłoku nowych informacji posortować w głowie i wykorzystać.
Jakby komuś się strasznie nudziło to byłbym bardzo wdzięczny za wskazanie głupot w tych kontrolerach i ogólnych wskazówek typu: "takie rzeczy to przenieś i używaj jako usług", " z tego najlepiej zrobić listener", "takie coś nie powinno być w kontrolerze". Będę wdzięczny za każdą, nawet najbardziej ogólną, nie związaną z tą aplikacją uwagę. github.com/.../Bundle/Controller/ edit: chociaż tak sobie wszedłem teraz w pierwszy lepszy kontroler to zacząłem wątpić by komuś chciało się rozkminiać o co tam w ogóle chodzi,a bez zrozumienia o co chodzi chyba nie da się strzelać poradami jak to refaktoryzować. Ten post edytował porzeczki 28.09.2016, 02:19:12 |
|
|
29.09.2016, 18:35:26
Post
#2
|
|
Grupa: Zarejestrowani Postów: 3 033 Pomógł: 366 Dołączył: 24.05.2012 Ostrzeżenie: (0%) |
Pierwsze co bym zrobił to posprzątał ten kod, bo to na pewno nie jest wersja produkcyjna. Wywalił zbędne komentarze i kod w nich. Owszem bez znajomości tego wszystkiego nie dostaniesz gotowych rad, ale ważne, żeby trzymać się zasad SOLID, DRY, KISS itp. Generalnie widzę masz metody w których robisz "magie" na kilkanaście ekranów, wiec to bym na pewno podał refaktoringowi. Tam gdzie się da o else zapomnij, zwiększysz tym sposobem w prosty sposób czytelność metod. Nazwy kontrolerów po polsku? Komentarze polsko - angielskie?
|
|
|
1.10.2016, 11:03:13
Post
#3
|
|
Grupa: Zarejestrowani Postów: 144 Pomógł: 0 Dołączył: 15.09.2016 Skąd: Warszawa Ostrzeżenie: (0%) |
dzięki
masz metody w których robisz "magie" na kilkanaście ekranów. co to znaczy, że robię magię? jaki to jest magiczny kod? Tam gdzie się da o else zapomnij, zwiększysz tym sposobem w prosty sposób czytelność metod. masz na myśli to, by przenieść taki kod z kontrolera czy żeby zastąpić else kolejnym ifem lub switchem? |
|
|
1.10.2016, 12:48:46
Post
#4
|
|
Grupa: Zarejestrowani Postów: 428 Pomógł: 77 Dołączył: 10.07.2011 Skąd: Warszawa Ostrzeżenie: (0%) |
[...] masz na myśli to, by przenieść taki kod z kontrolera czy żeby zastąpić else kolejnym ifem lub switchem? 1. Nie Dla przykładu:
Możesz zamienić w ten sposób:
Wartość logiczna jest ta sama, a kodu mniej. --- 2. Używaj serwisów, wrzucaj logikę tam, im niżej w hierarchii tym lepiej, bo mniejsza duplikacja kodu.
Pomyśl ile razy robisz logikę podobną do powyższej, nie prościej zarejestrować serwis który jako dependency ma serwis @session i bezpośrednio na nim bazuje? --- 3. Twórz własny Exception, tak aby opisywał zdarzenie, bo inaczej na dłuższą metę się nie połapiesz.
--- 4. Używaj CONSTów, zwłaszcza jak współdzielisz nazwy parametrów pomiędzy uslugami.
--- 5. Używaj repozytoriów
Powyższy kod możesz wstawić w Repozytorium i korzystać z niego w wielu miejscach bez potrzeby duplikowania go (nawiązuje do #2). Poza tym, to co masz wyżej i tak możesz uprościć:
I wiele więcej Ten post edytował kpt_lucek 1.10.2016, 12:55:25 -------------------- Cytat There is a Bundle for that Lukas Kahwe Smith - October 31th, 2014 |
|
|
1.10.2016, 13:01:36
Post
#5
|
|
Grupa: Zarejestrowani Postów: 144 Pomógł: 0 Dołączył: 15.09.2016 Skąd: Warszawa Ostrzeżenie: (0%) |
bardzo bardzo dziękuję
|
|
|
1.10.2016, 13:39:45
Post
#6
|
|
Grupa: Zarejestrowani Postów: 3 033 Pomógł: 366 Dołączył: 24.05.2012 Ostrzeżenie: (0%) |
Cytat co to znaczy, że robię magię? jaki to jest magiczny kod? to znaczy, że metody robią zbyt wiele i kod jest za bardzo złożony i zbyt długi. (Reguła KISS), a na drugie już kolega odpowiedział |
|
|
9.10.2016, 23:26:00
Post
#7
|
|
Grupa: Zarejestrowani Postów: 144 Pomógł: 0 Dołączył: 15.09.2016 Skąd: Warszawa Ostrzeżenie: (0%) |
a jak odchudzić poniższy kontroler?
czy listenerów i usług ładnie jest używać do kodu jednokrotnego użytku byle odchudzić kontroler? Np gdybym chciał wepchnąć cały kod z powyższego if($form->isValid()){ do listenera/usługi. |
|
|
10.10.2016, 01:35:41
Post
#8
|
|
Grupa: Zarejestrowani Postów: 428 Pomógł: 77 Dołączył: 10.07.2011 Skąd: Warszawa Ostrzeżenie: (0%) |
Cytat czy listenerów i usług ładnie jest używać do kodu jednokrotnego użytku byle odchudzić kontroler? Np gdybym chciał wepchnąć cały kod z powyższego if($form->isValid()){ do listenera/usługi. Tak, stwierdzenie "odchudzenia" kontrolera nie do końca jest tutaj poprawne, zgodnie z założeniami SOLID, a dokładniej samego SingleResponsibilityPrinciple, powinieneś budować architekturę tak, żeby każdy z wytworzonych przez Ciebie obiektów miał 1 odpowiedzialność, nie zawsze niestety jest to takie proste, polecam przeczytać TO. W SF2/3 założeniem kontrolera (mówiąc dokładniej, akcji w kontrolerze) jest zebranie wszystkich odpowiednich danych, przemielenie tego poprzez usługi (serwisy) i wyplucie Response'a, tak powinna wyglądać "logika" akcji w kontrolerze. Jak możesz uprościć kod który podałeś. Moja prywatna opinia
1. Masz dostępny serwis session 2. Masz dostępną metodę
---Ogólnie polecam sprawdzenie metod obiektów które rozszerzasz Cytat
Machnij do tego jakiś transformer o ile już musisz robić to w taki sposób, lub przemyśl, czy Twój formularz na prawdę musi działać tak topornie? Jeżeli musi, to może To Ci jakoś ułatwi pracę. Cytat
Ogólnie, to do ogrania forma użyam handlera, a ten z innych udogodnień, które przejmują pewną część procesu. Możesz zainteresować się takim rozwiązaniem, napisać własne, lub zupełnie to olać, ale pamiętaj, że im bardziej coś podzielisz, tym łatwiej będzie Ci wpływać na kod w przyszłości, testować go jak i wymieniać poszczególne "komponenty". -------------------- Cytat There is a Bundle for that Lukas Kahwe Smith - October 31th, 2014 |
|
|
11.10.2016, 19:24:17
Post
#9
|
|
Grupa: Zarejestrowani Postów: 144 Pomógł: 0 Dołączył: 15.09.2016 Skąd: Warszawa Ostrzeżenie: (0%) |
dziękuję. Jedna rzecz
Machnij do tego jakiś transformer może źle odczytałeś sens tego fragmentu kodu. A może ja nie rozumiem możliwości Data Tranformer. W tym fragmencie ja nie modyfikuję formatu danych, może w głupi sposób(?), ale po prostu ustawiam pola jednego obiektu entity na podstawie pól drugiego. Ten post edytował porzeczki 11.10.2016, 19:25:54 |
|
|
11.10.2016, 22:19:21
Post
#10
|
|
Grupa: Zarejestrowani Postów: 428 Pomógł: 77 Dołączył: 10.07.2011 Skąd: Warszawa Ostrzeżenie: (0%) |
Tym bardziej powinieneś mieć to oddelegowane i przeniesione, do tego masz transformery, fizycznie w SF masz (o ile dobrze pamiętam) DataTransformerInterface? On ma metode transform i reverseTransform.
Oczywiście w tym wypadku nikt nie każe Ci używać tego interface'u, po prostu dobrze jest to oddelegować gdzie indziej, chociażby po to, aby logika za to odpowiadająca była dostępna "dla innych" usług, lub też po prostu: "żeby było czyściej". Ten post edytował kpt_lucek 11.10.2016, 22:33:18 -------------------- Cytat There is a Bundle for that Lukas Kahwe Smith - October 31th, 2014 |
|
|
11.10.2016, 22:39:09
Post
#11
|
|
Grupa: Zarejestrowani Postów: 3 033 Pomógł: 366 Dołączył: 24.05.2012 Ostrzeżenie: (0%) |
porzeczki pytanie tylko poco to robisz? i czemu tak
|
|
|
12.10.2016, 13:33:23
Post
#12
|
|
Grupa: Zarejestrowani Postów: 144 Pomógł: 0 Dołączył: 15.09.2016 Skąd: Warszawa Ostrzeżenie: (0%) |
a jak?
(zamówienie składa się z wielu ZamowienieProdukt. W pętli tworzę obiekty ZamowienieProdukt a dane biorę z obiektu Ksiazka. No nie wiem, nie potrafię tego dziś obronić, dawno to robiłem, Doctrine od roku nie używałem, więc mądrzejszy dziś nie jestem. Pewnie chodzi ci o to że mógłbym tworząc ZamowienieProdukt od razu wcisnąć do niego obiekt Ksiazke ) Muszę wrócić do podstaw Doctrine. |
|
|
Wersja Lo-Fi | Aktualny czas: 25.04.2024 - 00:12 |