Ho un'applicazione comprendente un eseguibile bootstrapper, una libreria di base e diversi plugin (librerie condivise). La libreria principale è implicitamente collegata a tutti i componenti, i plugin vengono collegati / caricati esplicitamente dalla libreria principale. Quando vengono richiamate le funzioni dei plugin, passo diversi oggetti definiti nella libreria principale. Ora mi chiedo quale sia il modo migliore per progettare l'interfaccia di queste classi.
Ci sono tre modi in cui posso pensare.
- Progetta una classe semplice e passala. Questo è l'approccio attuale, ma l'interfaccia è disordinata perché il core ha bisogno di funzioni addizionali su questo oggetto, attualmente realizzate con relazioni di amici e modificatori di accesso privati in modo che i client / plug-in non possano accedervi. Penso che questo sia l'approccio peggiore dal momento che l'interfaccia client è davvero brutta.
- Crea un ABC (interfaccia) e aggiungi le funzionalità principali nella sottoclasse concreta e passa l'oggetto come ABC ai plug-in. Questo sembra buono, ma in qualche modo non sono sicuro che questo sia un buon design dal momento che da un lato le interfacce non sono realmente un concetto C ++ e c'è solo una classe che eredita l'ABC (mi sembra un odore per me) e d'altra parte il il compilatore si lamenta dei deboli vtables emessi in tutte le TU. (Ho provato ma non capisco questo)
- Crea una classe mediatore / facciata e nascondi l'interfaccia richiesta dalla libreria principale. La truffa in questo approccio è l'extraindirizzamento.
Sarebbe bello se qualcuno potesse integrare questa lista ed elaborare i pro e i contro degli approcci. Infine se è possibile apprezzerei una raccomandazione. Grazie.