È chiaro che alcuni aspetti della libreria devono essere dinamici, il che significa che il suo comportamento dipende da alcuni aspetti esterni, indipendentemente dal nome di una libreria da aggiungere o dal nome di una classe da istanziare.
È davvero solo una questione di quale aspetto del tuo sarà dinamico.
Ho incontrato questo tipo di problema prima di utilizzare Java, e dal momento che Java non è specifico per la piattaforma, è possibile eseguirlo potenzialmente su qualsiasi sistema operativo che supporti Java. Ovviamente non tutte le funzionalità sono disponibili in tutti i sistemi operativi, quindi è necessario essere in grado di adattare il programma in modo intelligente in base al sistema operativo.
L'approccio che ho preso è stato quello di usare classpath come fattore esterno dinamico. Secondo il sistema operativo presente, includerebbe la libreria principale (jar) e una libreria aggiuntiva scritta appositamente per quel particolare sistema operativo in cui è stata installata (il file batch che avvia il programma è quasi certamente specifico per piattaforma, quindi quale posto migliore per posizionare questo particolare cambiamento specifico della piattaforma?). Java ha in pratica un utile ServiceLoader progettato per consentire ad altre librerie di implementare interfacce nel tuo barattolo principale .
La tua libreria principale può chiamarli come interfaccia senza sapere chi o come è implementata, e la tua libreria aggiuntiva può eseguire meccanismi di temporizzazione, se disponibili. Se non è disponibile alcuna implementazione dell'interfaccia, disporre di un meccanismo di fallback per quando i meccanismi di temporizzazione non sono possibili.
Potresti non utilizzare Java, ma questa idea è relativamente facile da estendere ad altre lingue con un po 'di riflessione. Utilizzare un parametro passato al programma come nome della classe di implementazione per il meccanismo di temporizzazione. Se un parametro viene passato, prova ad istanziare una nuova istanza di esso dinamicamente e sei pronto per partire. Assicurati di includere un riferimento alla tua libreria esterna quando avvii il tuo programma.
Certamente vorrete separare la funzionalità principale dal plugin, ma se fatto in questo modo, potreste facilmente aggiornare / estendere il plugin senza dover mai toccare il programma principale.