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:

  1. 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.
  2. 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.
  3. stworzyć nowy moduł który dostawał by wynik meczu i dalej jak w pkt 3
  4. Przemodelować moduły. Tylko wtedy pytanie jak?

Co polecacie?

Jakby komuś się nudziło to tu jest kod projektu: https://github.com/krasnoludkolo/ebet2