Sto lavorando in un'azienda di telecomunicazioni. Abbiamo alcuni strumenti di generazione del codice che generano file in stile C basati su una definizione MIB. Li compiliamo con C ++ però. Si riduce al fatto che questi file generati contengono solo un mucchio di funzioni vuote e che dobbiamo implementarle. Inutile dire che questa generazione di codice è una cosa sola: -)
Ora per il resto facciamo il nostro design in C ++ e usiamo l'iniezione di dipendenza e simili. Beh, almeno lo faccio ed è un po 'povero amico. Realizziamo tutto a mano e non utilizziamo un contenitore DI.
Il problema qui è che non importa quanto sia elegante il tuo design in C ++, come puoi chiamarlo da una tale funzione in stile C in modo aggraziato? Posso pensare a qualche meccanismo fuori dalla mia manica:
- Utilizzare un singleton come rappresentazione per il design C ++, inteso come punto di ingresso dallo stile C alla funzionalità C ++
- Utilizza un globale. Un po 'simile a quanto sopra perché un Singleton è davvero globale. Quindi non mi piacciono questi 2 approcci. Ho imparato ad avere un rapporto di amore / odio con Singletons. Ne vedo troppi ed evito di usarli io stesso.
- Utilizzare un getter statico da qualche parte in una classe che come tale è un punto di ingresso per la funzionalità C ++. Questo è in realtà un tipo di accesso globale. Questo getter può fornire accesso ad una variabile statica con scope di file C ++, per esempio.
- Usa un proxy che instanziati nel corpo della funzione per proxy l'altra funzionalità C ++. Ma questo semplicemente sposta il problema perché non si può ancora fare un'iniezione di dipendenza. Questo modo di pensare è più la direzione che penso di dover andare.
Si può presumere che la funzionalità C ++ sia già inizializzata nel momento in cui le funzioni in stile 'C' devono svolgere il proprio lavoro. La roba di iniezione delle dipendenze è già stata eseguita durante l'inizializzazione, quindi non penso che le funzioni in stile C dovrebbero preoccuparsene. Hanno solo bisogno di un punto di ingresso per l'API C ++.
Spero di essere stato in grado di rendermi un po 'chiaro; -)