Sto lavorando su un sistema embedded che si interfaccia con l'utente con diversi pulsanti e un piccolo display grafico.
Come nota a margine: poiché sono su un sistema embedded, vorrei evitare il più possibile l'allocazione dinamica della memoria. Qualcosa come std :: vector non è nemmeno disponibile.
Ho bisogno di implementare un menu di configurazione usando una classica struttura di menu annidata come questa:
Level A Node 1
-> Level B Node 1
-> Level C Node 1
-> Level B Node 2
-> Level B Node 3
Level A Node 2
Level A Node 3
Sono molto incerto sull'approccio migliore qui. Ho letto su diversi modi per avvicinarmi a qualcosa del genere come usare il Pattern Composito. Tuttavia, mi imbatto sempre in qualcosa che sembra buono "sulla carta", ma sembra essere un disastro da implementare.
Il mio pensiero generale è di avere qualcosa una classe MenuNode
che conosca i suoi sub-nodi e il nodo genitore al momento dell'inizializzazione. Una classe Menu
potrebbe gestire la navigazione e l'elaborazione del nodo. Ovviamente, ogni MenuNode
deve eseguire / implementare comportamenti specifici come:
- Segnala al
Menu
cosa vuole visualizzare (il layout / posizionamento effettivo non dovrebbe essere il problema diMenuNode
) - Reagire all'input dell'utente (come un pulsante premere per aumentare / diminuire / cambiare un valore)
- Accedi al valore effettivo di interesse (risiedono in una classe
ApplicationSettings
)
Quale sarebbe il modo migliore per implementarlo?
-
Utilizza una classe di base (astratta)
MenuNode
e crea una sottoclasse per OGNI voce di nodo di menu. Durante l'inizializzazione potrei fornire un puntatore aApplicationSettings
o altre dipendenze di cui potrebbe aver bisogno. In qualche modo sembra sbagliato creare 10 classi derivate in cui ciascuna sarà istanziata una sola volta. -
Utilizza la stessa classe
MenuNode
per ogni nodo e implementa la funzionalità tramite i callback alle funzioni gratuite. Da quello che ho letto è piuttosto comune "accoppiare" funzioni libere con oggetti. Tuttavia, sembra che complicherebbe le cose. Per ogni membro ci potrebbe essere, come ReportButtonPress () o qualcosa del genere, dovrei fornire il callback per l'effettiva implementazione durante l'inizializzazione. -
Sono sicuro che c'è qualcosa che sto trascurando qui.