Projekt na pierwszy rzut oka wygląda bardzo fajnie, ale zamiast tego techniczego podziału na "service", "controller" itd. wprowawdziłbym podział domenowy typu "person", "user" itd. Ogólnie to poczytaj o package by feature
Generalnie starałem się utrzymać strukturę/wzorzec MVC, stąd taki podział i pytanie czy w tak niewielkim projekcie ma on rację bytu. "package by feature" - nie znałem tego pojęcia, na pewno się z nim zaposnam
MVC w takiej postaci w jakiej jest prezentowane w większości frameworków (Laravel, Rails, Django, Spring) nie ma nic wspólnego na prawdę z MVC.
Wzorzec MVC został wymyślny przez gościa imieniem Trygve Reenskaug około 1980 roku; i nie było tam żadnej mowy o warstwach. Wzorzec mówił tylko o tym żeby odseparować input, przetwarzanie i output.
Model w MVC to miała być domena biznesowa (niestety autorzy frameworków się pomylili, i pomyśleli że chodzi o modele ORM'owe). Inputem miała być akcja użytkownika dowolna (niestety autorzy frameworków tutaj też się pomylili, i pomyśleli że chodzi tylko o submit formularza). Wyjściem miał być oczywiście widok, ale nie koniecznie widok html'owy tylko każdy możliwy rodzaj outputu (pliki, html, aplikacje mobilne, endpointy ajaxowe, maile, wszystko co jest jakąkolwiek formą prezentacji to jest V w MVC orginalnym). Nic o żadnych warstwach tam nie było mowy. Dodatkowo MVC dotyczyło małych rzeczy; np. osobny MVC dla inputa, osobny dla hasła, osobny dla przycisku, osobny dla nagłówka. W frameworkach "mvc" to to MVC jest dla całego page'a albo nawet całego CRUD'a, co całkowicie nie ma nic wspólnego z orginalnym wzorcem. Jak każdy pomysł w IT, MVC zostało karykaturą swojej początkowej idei.
Więc jeśli chcesz tworzyć warstwy w aplikacji w imię MVC, to warto się zastanowić.
Testy w tym projekcie są moją zmorą. We wszystkich kursach z którymi miałem do czynienia, tak naprawdę nic sensownego na ich temat nie ma. dlatego próbowałem coś wymodzić. Niestety nie jestem na takim poziomie aby te zależności samodzielnie wyeliminować aby coupling był niski. Masz jakieś rady dot. tego ? Dzięki za rzeczowy komentarz!
Nie obiwniam Cię, jest bardzo mało wartościowych materiałów na ten temat.
Ten komentarz przerósł moje najśmielsze oczekiwania. Naprawdę @RequiredNickname jestem bardzo bardzo wdzięczny za tak skrupulatne podejście do codreview(aż pokazałem swojej kobiecie, jak ludzie w sieci potrafią być pomocni ).
Tych punktów jest tak wiele, że zastanawiam się nad kompletną przebudową projektu z uwzględnieniem DAO, DTO i hexagonal architecture - te ostatnie pojęcie jest mi zupełnie nowe.
Jeśli mogę Ci cokolwiek doradzic; i na prawdę chcesz poznać wszystkie dobre praktyki, to nie zaczynaj od aplikacji webowych (takiej jak ta). Dlatego że to ma bardzo dużo zależności - baza, widok, http, sieć, cache, stan, mnóstwo tego wszystkiego.
Jeśli na prawdę chcesz zrozumieć jak poprawnie zbudować dobry projekt, to zacznij od czegoś prostego - np. aplikacja konsolowa, która jedyne co ma to ten interfejs tekstowy oraz jakąś logikę nic więcej. Napisz ją. Ponieważ jak mówisz masz małe doświadczenie, najpewniej (na 99%) logika będzie połączona widokiem (tzn. z interfejsem konsolowym). Krok pierwszy w dobrej architekturze to oddzielić tylko te dwie rzeczy od siebie, a dokładniej zrobić tak żeby logika nie wiedziała o interfejsie. To jest najprostsze co możesz zrobić - spróbuj, a gwarantuje Ci że się dużo nauczysz.
Jak to zrobisz, to nastepnym krokiem byłoby dodać kolejną zależność do tej aplikacji - np. pliki; zrób jakąś funkcję która wymaga korzystania z plików. Znowu - najpewniej to też będzie połączone z logiką, i zacznie się z tego robić małę spaghetti. Więc teraz znowu możesz wydevelopować swoje skille architektury i oddzielić pliki od logiki i najlepiej od interfejsu też - to będzie trochę trudniejsze, bo już masz 3 moduły, zamiast dwóch. Jak to Ci się uda zrobić dobrze, to na prawdę congrats!
Jak zaczynasz od aplikacji webowej, która ma milion zależności, to można powiedzieć że od startu jesteś spisany na straty, bo musisz nimi żąglować, i musiałbyś też bardzo dobrze znać domenę w której pracujesz.
Dodatkowo - frameworki mają tą cechę że lubią przywiązywać swoich użytkowników do siebie; więc w pewnym sensie walczą z Tobą, jeśli próbujesz zrobić dobrą architekture.