Jak poprawić ten kod?

Odpowiedz Nowy wątek
2018-11-20 10:16
0

Ostatnio chciałem napisać ubogą wersję OneDrive'a i popełniłem (to chyba dobre słowo) coś takiego: https://pastebin.com/D87SdhKP (GitHuba wolę nie pokazywać, bo w projekcie jeszcze dużo rzeczy do poprawienia). I tak: wydzieliłem z kontrolerów logikę (aplikacji) i powstała mi klasa mająca prawie 200 linii. Wiem, że kłóci się to z SOLID i nie wygląda dobrze. Chyba @somekind pisał kiedyś, że klasa powinna (zazwyczaj) mieścić się na jednym ekranie. Ładnie to brzmi, tylko jak to zrobić? Mam podzielić tę klasę na kilka innych, mających tylko po jedną metodę? Wiem też, że pobieranie UserManagera z IoC nie jest poprawne, ale jak inaczej, gdy jego jedyny konstruktor ma 9 (!) parametrów?

Pozostało 580 znaków

2018-11-20 11:04
1

Dlaczego UserManager z IOC jest niepoprawne ?
Ja osobiście korzystam z Command Query Separation. Nie wiem czy jest to dobrze ale zazwyczaj udaje mi się robić małe klasy (mieści się na ekranie :D)
https://github.com/szydlaczek/Delegacje.

Pozostało 580 znaków

2018-11-20 11:11
1

To że klasa ma 200 linii nie musi wcale łamać SOLID'a. Co do kodu to możesz wydzielić walidacje do innej klasy. Ja osobiście jestem zwolennikiem bez klamrowych jedno linijkowych ifów, ale to akurat nie każdy lubi.

Pozostało 580 znaków

2018-11-20 11:13
0

@szydlak: Chodzi o to, że w IoC nie powinno się rejestrować zewnętrznych bibliotek, ale nie zawsze takie podejście jest pragmatyczne. https://4programmers.net/Forum/1539232 I o ile wiem, to CQRS używa się jedynie przy dużych projektach, tak?

Pozostało 580 znaków

2018-11-20 11:30
1
nobody01 napisał(a):

I o ile wiem, to CQRS używa się jedynie przy dużych projektach, tak?

CQS nie CQRS

Pozostało 580 znaków

2018-11-20 11:39
0

CQS spoko, ale musisz pamiętać że komenda nie powinna nic zwracać i będziesz musiał kombinować jak przekazać informacje do użytkownika czy logowanie się powiodło a jeśli nie to co poszło nie tak.

Pozostało 580 znaków

2018-11-20 11:52
0
error91 napisał(a):

CQS spoko, ale musisz pamiętać że komenda nie powinna nic zwracać i będziesz musiał kombinować jak przekazać informacje do użytkownika czy logowanie się powiodło a jeśli nie to co poszło nie tak.

Ale można w Command dać jakieś pole np object (zwracane Id) oraz Succeeded typu bool. Bo inaczej faktycznie będzie to problem. Zazwyczaj potrzebujemy informację o powodzeniu lub nie.

edytowany 1x, ostatnio: szydlak, 2018-11-20 11:53

Pozostało 580 znaków

2018-11-20 12:17
0
szydlak napisał(a):

Ale można w Command dać jakieś pole np object (zwracane Id) oraz Succeeded typu bool. Bo inaczej faktycznie będzie to problem. Zazwyczaj potrzebujemy informację o powodzeniu lub nie.

Purystycznie podchodząc to własnie nie powinno. Jeśli nawet to nie rozwiązuje problemu wyświetlania użytkownikowi dlaczego coś poszło nie tak.

Pozostało 580 znaków

2018-11-20 13:28
2
nobody01 napisał(a):

Ostatnio chciałem napisać ubogą wersję OneDrive'a i popełniłem (to chyba dobre słowo) coś takiego: https://pastebin.com/D87SdhKP (GitHuba wolę nie pokazywać, bo w projekcie jeszcze dużo rzeczy do poprawienia). I tak: wydzieliłem z kontrolerów logikę (aplikacji) i powstała mi klasa mająca prawie 200 linii. Wiem, że kłóci się to z SOLID i nie wygląda dobrze. Chyba @somekind pisał kiedyś, że klasa powinna (zazwyczaj) mieścić się na jednym ekranie. Ładnie to brzmi, tylko jak to zrobić? Mam podzielić tę klasę na kilka innych, mających tylko po jedną metodę?

Ano - każda publiczna metoda do oddzielnej klasy i problem długiej klasy i łamania SRP rozwiązany. Możliwe, że tak wydzielone klasy będą miały też mniej zależności.
Tak poza tym, to to Twoje UserService mogłoby się nazywać UserRegistrationDataValidator albo jakoś tak podobnie, w każdym razie bardziej odpowiadając celowi istnienia tej klasy.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2018-11-20 15:25
0

Powiedzmy, że podzielę tę klasę na 3 mniejsze: jedna będzie odpowiedzialna za rejestrowanie (i potwierdzanie emaila, bo to podchodzi pod część procesu rejestracji), druga będzie odpowiedzialna za logowanie, a trzecia za operacje związane ze zmianą hasła. Wtedy do kontrolera będę musiał wstrzyknąć trzy zależności zamiast jednej. Trzy zależności to nie tak dużo, ale co, gdyby było ich (tych klas) więcej? Wtedy AuthService powinna pozostać i służyć jako fasada?

Pozostało 580 znaków

2018-11-20 18:08
2

@nobody01: nie potrzeba fasady, do kontrolera można wstrzyknąć jedną zalężność - szynę, która wyśle obiekt do przetwarzania od odpowiedniej klasy np. na podstawie typu.
Przykład: https://devstyle.pl/2016/11/1[...]-implementacja-w-c-i-autofac/


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."
tylko co wtedy gdy nie dostajemy odpowiedzi czy logowanie się powiodło (command handler nic nie zwraca) ? Trzeba kombinować :) - error91 2018-11-20 18:11
No w tym akurat przykładzie nie zwraca, ale chyba nic nie stoi na przeszkodzie, aby napisać sobie swoją implementację, która zwraca. - somekind 2018-11-20 18:13
Pewnie, ale to nie będzie poprawny CQS. Chyba że nie to miałeś na myśli. - error91 2018-11-20 18:21
Pewnie nie będzie poprawny, ale skrótów też nie rzucałem. Chodziło mi o generyczne rozwiązanie problemu, nie o silne trzymanie się jakiegoś wzorca. - somekind 2018-11-20 18:37

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0