La domanda non è indipendente dal progetto concreto e quali sono le capacità tecniche necessarie per garantire la modularità.
In termini di pattern, questo è un classico Pattern di strategia insieme a Inversion of Control . Devi astrarre ogni funzionalità concreta e darne una spiegazione al modulo.
Supponiamo che stavi facendo un software per calcolare le tasse. In un'implementazione ingenua implementeresti un'interfaccia utente con pulsanti e azioni e accanto al calcolo delle imposte. Il tuo software è un vero successo, hai richieste da tutto il mondo di personalizzare per molte lingue e sistemi fiscali.
L'internazionalizzazione si fa facilmente con la sostituzione delle stringhe (per così dire). Ma, oltre agli altri linguaggi, devi gestire completamente le leggi di business / leggi fiscali . Per portare a termine il tuo compito, inizi ad astrarre la logica commerciale concreta in moduli. Per esempio. definisci un'API comune per ogni set di regole aziendali e incapsula le regole in diversi motori .
Separa i comandi come calculate taxes
dall'implementazione nel motore concreto. Così alla fine la tua applicazione agisce come un lettore di dischi con l'abilità astratta di riprodurre musica e quale musica viene riprodotta dipende dal vinile concreto.
Nell'interfaccia utente sono presenti contenitori che possono essere riempiti dinamicamente con componenti in base alla configurazione del modulo in uso.
Il modo in cui risolvi questo problema tecnicamente dipende da te:
- utilizzando un sistema di plugin
- compilazione di un prodotto da diverse fonti
- spedizione del prodotto con ogni modulo possibile e decidi in fase di esecuzione, cosa usare
- con un'applicazione web con endpoint leggermente diversi per i componenti del cliente
ecc. pp.
tl; dr
devi rendere la tua pluggable
di architettura