Dovrei essere preoccupato di avere troppi servizi?

2

Sto facendo un gioco online e ha un server che gestisce un server di gioco più piccolo. Lo chiamiamo "MasterServer". Questo MasterServer ascolta i comandi sia da TCP che HTTP e risponde a loro utilizzando i propri servizi. Il fatto è che il numero di servizi è in crescita e sono preoccupato che potrebbe raggiungere un punto in cui avere come campi semplici sarebbe troppo.

Ecco come appare

public class MasterServerImpl implements MasterServer
{
    private final Logger logger;

    private final LevelService levelService;
    private final LevelStatsService levelStatsService;
    private final ScoreService scoreService;
    private final AccountService accountService;
    private final FriendService friendService;
    private final GameHostingService gameHostingService;
    private final CosmeticService cosmeticService;
    private final MessageService messageService;
    private final ConfigService configService;
    private final VersionService versionService;
    private final CrashReportService crashReportService;
    private final ShopService shopService;

    private final DatabaseConnection dbConnection;
    private final QueryProvider queryProvider;

    private final HttpCommandReceiver httpCommandReceiver;
    private final TCPCommandReceiver tcpCommandReceiver;
    private final ChatServer chatServer;

// ...
// in constructor


    dbConnection = new DatabaseConnection(configService.getDatabaseURL(), configService.getDatabaseUsername(), configService.getDatabasePassword());

    try
    {
        dbConnection.testConnect();
    }
    catch(SQLException ex)
    {
        throw new InvalidConfigException("Could not connect to database", ex);
    }

    queryProvider = new QueryProviderImpl();

    levelService = new LevelServiceImpl(dbConnection, queryProvider, baseDir);
    levelStatsService = new LevelStatsServiceImpl(dbConnection, queryProvider);
    scoreService = new ScoreServiceImpl(dbConnection, queryProvider, baseDir);
    accountService = new AccountServiceImpl(dbConnection, queryProvider);
    friendService = new FriendServiceImpl(dbConnection, queryProvider);
    gameHostingService = new GameHostingServiceImpl(this, logger, port + 2);
    cosmeticService = new CosmeticServiceImpl(dbConnection, queryProvider);
    messageService = new MessageServiceImpl(dbConnection, queryProvider);
    versionService = new GameVersionService(versionRange, configService.getUpdateURL());
    crashReportService = new CrashReportServiceImpl(baseDir);
    shopService = new ShopServiceImpl(dbConnection, queryProvider);

    httpCommandReceiver = new HttpCommandReceiver(this, logger, configService.getHttpPort());
    tcpCommandReceiver = new TCPCommandReceiver(this, logger);
    chatServer = new ChatServerImpl(accountService, messageService, logger);

Perché i comandi funzionino, passo loro un'istanza MasterServer che è un'interfaccia con le specifiche per ciascun servizio. Fondamentalmente è un'interfaccia di getter per tutti i servizi. Quindi ho anche molti getter in quella classe.

Esiste un design migliore rispetto alla semplice aggiunta di materiale senza attenzione? Un sacco di servizio potrebbe essere aggiunto in futuro. Ogni servizio è abbastanza lungo e unirli perderebbe un po 'di chiarezza nella struttura.

    
posta Winter 25.06.2018 - 17:52
fonte

3 risposte

3

Con il codice di esempio che hai fornito, MasterServer è essenzialmente il contenitore per tutti i tuoi componenti (istanziandoli tramite codice scritto a mano). Stai arrivando al punto in cui i quadri di iniezione delle dipendenze ti aiuteranno davvero. Ad esempio Spring in Java o NInject per C #.

Detto questo, dovresti anche iniziare a pensare alle divisioni di responsabilità. Ad esempio, potresti avere un CommandService che la chiamata di HttpCommandReceiver e TcpCommandReceiver quando ricevono i comandi. Il CommandService eseguirà quindi quei comandi. Scoprirai che avrai famiglie di servizi che lavorano direttamente tra di loro, e puoi ridurre il numero di punti di contatto e l'interazione principale della tua app sarà con una manciata di servizi che parlano tra loro a livello di applicazione appropriato di astrazione.

Aiuta anche a comunicare il design quando puoi consolidare i tuoi servizi / componenti in una manciata di famiglie di componenti correlati.

    
risposta data 25.06.2018 - 18:03
fonte
0

No, in generale, avere molti servizi significa dividere la tua logica in classi separate e accoppiarle liberamente.

Tuttavia, il MasterServer sembra essere un po 'strano.

Non includi un esempio di come lo stai usando, ma il mio senso spiacevole è un formicolio. Immagino che non dovrebbe avere alcun Getter per i servizi e non dovresti farne il giro.

    
risposta data 25.06.2018 - 18:08
fonte
0

Probabilmente dovresti dare un'occhiata a qualche framework di iniezione delle dipendenze (leggi link ) così da non Devo passare questa collezione di dipendenze ovunque. Invece, dovresti definire un servizio o un'altra classe da cui dipendono le tue classi da qualche parte (come DatabaseConnection e il framework di integrazione delle dipendenze lo inserirà automaticamente nelle classi che ne hanno bisogno, ad esempio con l'iniezione del costruttore. vedere ciò che si adatta alle tue esigenze. Spring lo fa abbastanza bene, ma potrebbe essere troppo grande per questo scopo.

    
risposta data 25.06.2018 - 17:55
fonte

Leggi altre domande sui tag