che gestisce una macchina a stati molto grande in una classe

4

Attualmente sto implementando una classe per un protocollo di rete. Il protocollo utilizza una macchina a stati finiti abbastanza complessa ed estesa. Una coppia di eventi più uno stato viene associata a una funzione, che funziona e imposta il nuovo stato.

Dato che ci sono circa 150 combinazioni stato / evento valide e 28 funzioni distinte da chiamare, ho rifattorizzato l'intera logica dello stato lontano dall'associare / inviare / ricevere / ... (chiamiamola classe di servizio) in un separato classe statemachine. Il problema è che alcune di queste 28 funzioni richiedono l'accesso alla classe di servizio, ad esempio per ripristinare un timer di scadenza.

Quello che potrei fare è fare amicizia con la classe statemachine e la classe di servizio, in modo che possano accedere ai reciproci interni. Ciò introdurrebbe un accoppiamento molto stretto (anche se naturale, dato che appartengono insieme). Potrei anche lasciare entrambe queste classi in una, ma ciò risulterebbe in una classe enorme.

Ma poiché dubito che io sia il primo a dover affrontare questo problema, presumo che esista una soluzione più o meno standardizzata per questo che non ho ancora trovato.

    
posta Marius Herzog 10.09.2014 - 21:27
fonte

2 risposte

2

L'approccio classico per il disaccoppiamento di due componenti consiste nel definire un'interfaccia chiara tra di loro e consentire loro di comunicare solo tramite questa interfaccia (al contrario di dare accesso diretto a qualsiasi interno).

Quindi nel tuo caso: crea una classe di interfaccia (in C ++ tipicamente una classe base astratta) per la tua classe di servizio, definendo l'interfaccia che vuoi rendere pubblica. Qualsiasi accesso da parte della macchina di stato o delle 28 funzioni dovrebbe essere fatto solo attraverso questa interfaccia. Quindi la macchina di stato e la classe di servizio si disaccoppiano, ora puoi facilmente sostituirla con un'implementazione simulata a scopo di test, se vuoi.

Anche questo funziona nel modo inverso: se la classe di servizio ha bisogno di accedere al computer di stato, definire un'interfaccia pubblica per la macchina di stato e accedere alla macchina di stato dall'esterno solo attraverso questa interfaccia.

    
risposta data 11.09.2014 - 13:58
fonte
4

Penso che il problema sia che la classe della tua macchina di stato è troppo specifica per il protocollo. Se era generico, la tabella delle azioni sarebbe fornita dalla classe del protocollo alla classe della macchina di stato. Quelle azioni sarebbero solo std::function<void(ServiceClass*) .

Chiaramente la classe del protocollo ha accesso alla classe di servizio, in quanto il protocollo definisce quali funzioni di servizio vengono chiamate quando.

    
risposta data 11.09.2014 - 13:10
fonte

Leggi altre domande sui tag