Hej
Piszę pierwszy, większy projekt z wykorzystaniem dużo większej separacji pomiędzy modułami i natrafiłem na pewien problem odnośnie tego który moduł co powinien mieć.
Piszę '"system" do obstawiania wyników meczy. Mam m. in. moduł zarządzający ligami i meczami oraz osobny moduł do zakładów. Przyjmijmy takie dwie reguły biznesowe:
-zakład nie może być dodany w momencie gdy mecz się już dodał
-po wpisaniu wyników meczy, chcę podsumować zakłady, dodać pkt itp.
Obecnie mam spełnioną tylko pierwszą na zasadzie: gry zostanie ustawiony wynik moduł od meczy wywołuje moduł z zakładami z poleceniem przeliczenia (który odwołuje się dalej do innych modułów). Problem zaczyna się teraz gdybym chciał spełnić pierwszą, ponieważ znaczyłoby to, że moduł z zakładami potrzebował by dostępu do modułu z meczami co powodowałoby cykliczną zależność. Nie bardzo jest mi to na rękę, ponieważ np. przy testach składam cały system działający w pamięci "ręcznie" na zasadzie:
private void configureModules() {
userFacade = new UserConfiguration().inMemoryUserFacade();
externalClientMock = new ExternalClientMock(ExternalClientMock.SOME_MATCHES);
betFacade = new BetConfiguration().inMemoryBetFacade(userFacade);
resultFacade = new ResultConfiguration().inMemoryResult(betFacade);
leagueFacade = new LeagueConfiguration().inMemoryLeagueFacade(resultFacade);
externalFacade = new ExternalConfiguration().inMemory(leagueFacade, externalClientMock);
}
(docelowo możliwe, że zamienię springa na rat packa to będzie coś podobnego)
Wymyśliłem takie rozwiązania ale brakuje mi doświadczenia aby wybrać optymalne:
- Połączyć moduł lig/meczy oraz zakładów i liczenia punktacji. Tylko problem jest taki, że wtedy powstanie dość duży moduł, ponieważ każdy z składowych realizuje jakąś logikę i wystawia jakieś api.
- moduł który pobiera wyniki z zewnętrznego api wysyłałby wyniki do modułu z ligami, a do modułu z zakładami informacje o nowym wyniku. Wtedy można by odwrócić zależność i mieć informację o dacie początkowej na potrzeby reguły.
- stworzyć nowy moduł który dostawał by wynik meczu i dalej jak w pkt 3
- Przemodelować moduły. Tylko wtedy pytanie jak?
Co polecacie?
Jakby komuś się nudziło to tu jest kod projektu: https://github.com/krasnoludkolo/ebet2