Początek projektu – SpaghettiCode

Obiecałem, że w następnym artykule będziemy już wstrzykiwać zależności jednak postanowiłem zrobić wszystko po kolei, przedstawić kod na którym będzimy pracować, do roboty 🙂

 

Zbudowałem zwykłą małą aplikację działającą w konsoli na której będziemy pracować przez cały dział dependency injection, specjalnie napisałem ją tak jak by to zrobił początkujący developer, czyli jak można się domyśleć ten kod będzie nietestowalny i bardzo nieczytelny, zaraz wrzucę kod 🙂

Jest to aplikacja a raczej taki prototyp gry webowej, która najpierw rejestruje użytkownika w bazie graczy a później w tej grze robimy własną postać, nie chciałem wrzucać jakiegoś skomplikowanego przykładu np jakiejś aplikacji, która wykorzystuje mape to pomyślałem, że przykład gry webowej będzie najłatwiejszy do zrozumienia 🙂

Więc jaki jest plan działania?

  • Najpierw rejestrujemy użykownika, musi on podać login oraz hasło.
  • Następnie walidujemy wpisany login oraz hasło, jeśli dane bedą poprawne rejestrujemy użytkownika w bazie(Tak wiem, że do rejestracji konta potrzebny jest jeszcze link aktywacyjny oraz token, ale nie o to tu w tym chodzi chcę, żeby było to łatwe do zrozumienia)
  • Dalej gdy już zarejestrujemy użytkownika w bazie przechodzimy do kroku tworzenia postaci w grze(tutaj też dość mocno uprościłem dla prostoty proces tworzenia postaci) są cztery klasy: barbarzyńca, paladyn, mag, złodziej, wszystkie klasy mają po dwa atrybuty siła oraz kondycja, ich ilość jest zależna od klasy. Po wybraniu klasy dodajemy znowu punkty siły oraz kondycji do wybranej klasy postaci, ich ilosć jest również zależna od wybranej klasy(Wiadomo, w tym przypadku największe statystyki będzie miał barbrzyńca 🙂 )
  • No i na końcu przechodzimy do gry 🙂
Jak widze taki kod to się włos na głowie jeży… Moja reakcja na taki kod jest taka, jak gandalfa ,mam nadzieje, że twoja jest taka sama 🙂

Przyznajcie się z ręką na sercu… widzieliście taki kod lub może nawet pisaliście?

Ja się przyznaje…pisałem taki kod. No coż, życie 🙂 , ale każdy uczy się na błędach a z błędów trzeba wyciągać wnioski.

Przeanalizujmy ten kod, zgodnie z pierwszą zasadą SOLID klasy powinny mieć jedną odpowiedzialność a tutaj klasa Gameserver robi więcej niż jedną rzecz. Klasy również nie powinny a nawet moim zdaniem nie mogą dziedziczyć po klasie konkretnej, klasy powinny implementować interfejsy lub dziedziczyć po klasach abstrakcyjnych jak to jest w ostatniej zasadzie solid „Wysokopoziomowe moduły nie powinny zależeć od modułów niskopoziomowych – zależności między nimi powinny wynikać z abstrakcji.”.

Ciężko ten kod zrozumieć, więc będzie to ciężkie w utrzymywaniu. Testów nie da się tu napisać, więc strach tu ruszać cokolwiek…

A chociaż i tak jest to prosty przypadek największa jest klasa GameServer, która posiada tak na prawde dwie metody, które coś robią a już tworzy to taki chaos…

Co by było gdyby to był jakiś duży projekt, to w poźniejszych fazach rozwoju projektu trzeba by było składać ofiary do boga, w nadzieji, że kolejny dodany moduł zadziała 😂😂😂

Ten kod łamie też drugą zasadę solid open-closed.

Co jeśli chciałbym dodać jakieś kolejne atrybuty do rozwoju postaci np mądrość lub zręczność?

Albo jeśli np chciałbym do panelu rejestracji dodać email albo utworzyć token, który potwierdza, że użytkownik, który się rejestruje to czy naprawdę on czy ktoś inny?

A co jeśli chciałbym lepiej zabezpieczyć panel logowania przed atakami?

etc, etc można tak wymieniać bez końca, nie możemy tego tak zostawić, w następnym artykule pomyślimy jak można to napisac lepiej również z testami jednostkowymi.

 

Podsumowanie

Link do githuba ze wszystkimi przykładami:  https://github.com/Slaw145/DependencyInjectionSpaghettiCode

Standardowo, przypominam o newsletterze, którym wysyłam powiadomienia o nowych wpisach oraz dodatkowe informacje na temat, ogółem mówiąc, świecie IT.

KONIECZNIE dołącz do społeczności DevmanCommunity na fb, części społeczności jest w jednym miejscu 🙂

-strona na fb: Devman.pl-Sławomir Kowalski

-grupa na fb: DevmanCommunity

Pytaj, komentuj pod spodem na końcu wpisu, podziel się nim, oceń go, rób co wolisz🙂

Do następnego! Do zobaczenia 🙂

 
Jeśli ten wpis ci się przydał podziel się nim ze swoimi znajomymi :)

2
Post a comment

avatar
1 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
SlawekPawel Recent comment authors
  Subscribe  
newest oldest evaluated
Notify about
Pawel
Guest
Pawel

„dziedziczyć po interfejsach” – powinno byc implementowac. Literowka? 🙂