Interfacce pacchetto - Accoppiamento e riusabilità

1

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?

    
posta Marvin 25.02.2016 - 15:11
fonte

1 risposta

1

Poiché le operazioni effettive per un componente di registrazione saranno praticamente le stesse per qualsiasi altro componente / classe / ... che lo utilizza, ha senso offrire solo un'interfaccia dal pacchetto C.

Se il pacchetto A e / o il pacchetto B richiedono che altre interfacce funzionino per la loro registrazione, sarebbe logico utilizzare l'adattatore design pattern per connettere le interfacce di PackageA\Log a PackageC\Log e PackageB\Log a PackageC\Log .

L'interfaccia PackageC\Log rimane generica, mentre le interfacce di registrazione predefinite possono essere collegate ad essa.

    
risposta data 25.02.2016 - 16:29
fonte

Leggi altre domande sui tag