Intent
I pacchetti dovrebbero essere progettati per svolgere bene una singola funzione.
Idealmente ciò significa che dovrebbero essere altamente modulari e diversi pacchetti dovrebbero essere in grado di essere "collegati" semplicemente garantendo che condividano un'interfaccia comune.
Tuttavia, non sono sicuro di come farlo senza creare una sorta di dipendenza tra i pacchetti o creare brutte 'classi di integrazione' o un pacchetto 'interfacce comuni'.
Un esempio di concetto
Non voglio impantanarmi in symantics a livello di dominio, quindi userò l'esempio semplice, anche se leggermente forzato, di un logger di eventi.
Pacchetto A
XYZ e consente di fornire un oggetto di registrazione personalizzato.
Per garantire che il logger sia valido, il pacchetto A contiene un'interfaccia PackageA\Log . Quando viene fornito un oggetto di registrazione al costruttore classX , genera un'eccezione se l'oggetto logger non implementa PackageA\Log .
Pacchetto B
ABC e consente di fornire un oggetto di registrazione personalizzato.
Per garantire che il logger sia valido, il pacchetto B contiene un'interfaccia PackageB\Log . Quando viene fornito un oggetto di registrazione al costruttore classA , genera un'eccezione se l'oggetto logger non implementa PackageB\Log .
Pacchetto C
Un logger unificato che fornisce la registrazione per Pacchetto A e Pacchetto B ... et al.
Contiene Log oggetto creato per fornire un programma di registrazione generico per tutti i pacchetti dell'applicazione.
Idee sub-ottimali correnti:
1. Non implementa nessuna delle interfacce nella classe PackageC\Log ma estendi la classe per ogni variazione di interfaccia (ad esempio PackageC\Loggers\PackageA estende PackageC\Log ).
Problema: Richiede più manutenzione e significa che PackageC dovrà essere modificato per ogni nuovo pacchetto con cui si interfaccia.
2. Implementa le interfacce PackageA\Log e PackageB\Log direttamente nella classe PackageC\Log .
Problema: Se PackageC viene riutilizzato in un altro progetto, verranno generati errori se PackageA o PackageB non sono presenti.
3. Crea un pacchetto di interfacce comuni e fa in modo che tutti i pacchetti implementino / richiedano tali interfacce per le loro interfacce pubbliche.
Problema: Massicciamente poco pratico, funzionerebbe solo per l'integrazione dei pacchetti che hai creato; nessuna interazione con terzi.
Domanda
In che modo PackageC\Log soddisfa i requisiti di PackageA\ClassX e PackageB\ClassA ?
In realtà questa domanda è solitamente più complessa in quanto le interfacce richieste da PackageA e PackageB non sono probabilmente le stesse. Quindi l'opzione 1 (definita sopra) è l'unico modo per risolverlo? il pacchetto che implementa l'interfaccia deve scrivere classi di integrazione?