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?