Lavorando su un importante miglioramento per il codice legacy, ho discusso con me stesso sul fatto che questo sia un buon caso per usare il pattern Proxy, e in particolare se un buon caso usa l'API Java Dynamic Proxy.
SFONDO Abbiamo una classe "FIXConnection" utilizzata per inviare ordini a una destinazione. L'applicazione mantiene da 1 a n FIXConnections per l'invio (viene selezionato un oggetto specifico in base a ciò che l'utente ha specificato nell'ordine).
Normalmente, l'ordine verrebbe inviato direttamente sul mercato. Il miglioramento consiste nel vedere se l'ordine potrebbe essere riempito da altri ordini già inviati sul mercato prima dell'invio e, se può essere riempito, eseguire una logica completamente diversa (cioè non inviare). In caso contrario, delega alla logica corrente.
Questa funzione sarà utilizzata solo da un client, quindi viene attivata / disattivata in modo dinamico (o tramite l'impostazione di configurazione).
Sembra che questo sia un buon uso per il pattern Proxy / Dynamic Proxy, perché consentirebbe di progettare un blocco di codice per intercettare le richieste al metodo FIXConnection.send esistente (e anche al suo metodo processResponse), solo nel caso se la funzione è abilitata. Il proxy può eseguire la nuova logica (se giustificata) o inviare alla logica esistente.
PROS AND CONS
PRO
-
L'utilizzo del proxy evita qualsiasi problema con la gerarchia di classi (occasionalmente sottoclassi questa classe FIXConnection). Se gestiamo questo per sottoclasse, potrebbe essere necessario spostare altri figli in questo sotto come genitore.
-
Non è necessario aggiornare la classe di livello superiore esistente con alcun flag per verificare se questa funzione è abilitata e per eseguire in modo condizionale il codice. (Ad esempio, non creare codice per un caso speciale, che ora verrebbe colpito da tutti i casi).
-
Un singolo punto di controllo
CON
-
La classe esistente espone le variabili pubbliche, tutto dovrebbe essere refactored nei metodi getter / setter e deve estrarre un'interfaccia (in modo che Dynamic Proxy possa essere utilizzato). cioè un'increspatura attraverso altre classi.
-
Il legame tra il proxy e il metodo legacy potrebbe essere un po 'approssimativo (ad es. method.getName (). equals ("send"). Ci sono modi di legare più strettamente, ma ... (yuck?)
-
Questo rende le cose inutilmente complicate? In generale, cerco di iscrivermi a fare "la cosa più semplice che possa funzionare". Questo non sembra proprio.
Mi piacerebbe sentire i pensieri di qualcuno su come potrebbero gestire questa domanda di design.