Data la tua domanda, suppongo che i motivi di questo tipo di design non siano documentati.
L'uso ingiustificato di un'interfaccia con singola implementazione è errato in quanto ciò viola YAGNI . Nella mia esperienza, anche questo è stato piuttosto dannoso dal punto di vista della manutenzione, soprattutto perché i metodi che implementano l'interfaccia sono costretti a essere inutilmente pubblici. Dopo aver raccolto più esperienza refactoring , probabilmente imparerai ad apprezzare il fascino modesto di private e pacchetto privato modificatori di accesso che consentono di focalizzare l'attenzione all'interno di una singola classe / pacchetto.
Per quanto riguarda l'uso giustificato non documentato di questo idioma, è nei miei occhi un aspetto negativo, prima di tutto perché non consente a un manutentore di "distinguere il buono dal cattivo". Di conseguenza, questo lascia uno tra opzioni non abbastanza allettanti. Le opzioni sono, o mantieni le cose pubbliche discutibili così com'è, quindi ripetutamente diminuendo la produttività ogni volta che hai bisogno di cambiare il codice, oppure apporti rischiose modificando ciecamente "collassando" l'implementazione singola in modo più semplice per mantenere POJO - esponendo il sé al rischio di scoprire dolorosamente che questo è un modo sbagliato, che qualche altro (Dio non voglia, remoto ) modulo fuori dalla tua vista si aspetta l'interfaccia.
Ho riscontrato "rivelazioni" causate da un errato collasso dell'interfaccia di implementazione singola poche volte. Ogni volta è stata un'esperienza piuttosto educativa, ma non vorrei davvero tornarci. Il fatto è che questo accade in fase di test, di integrazione o persino di accettazione da parte degli utenti e il rollback / correzione dell'errore fatto molto tempo fa in questa fase è piuttosto ingombrante.
- Un'opzione che non dovrebbe essere lasciata senza menzionare è quella di indagare se l'uso non documentato è giustificato (e, successivamente, collassare o documentare rispettivamente) proprio nel momento in cui lo trovi.
Per me, questo è stato abbastanza controproducente. Questo approccio obbliga essenzialmente a eseguire test di integrazione completi, che è probabilmente uno dei modi più efficaci per interrompe un flusso nel mezzo di alcune complicate correzioni / refactoring.
I just couldn't see the practicality... the interfaces are used one-to-one like com.company.service.foo
and com.company.service.foo.impl
Ben di sotto si tratta di come gestisco tipicamente casi del genere.
- Crea un ticket in tracker dei problemi , come "
PRJ-123
non documentato uso discutibile dell'interfaccia con singola implementazione in Foo / FooImpl ".
Aggiungi alla descrizione del ticket o commenta una spiegazione che danneggia la manutenibilità e fai notare che senza documentazione questo sembra overengineering . Aggiungi un commento che suggerisca di risolvere il problema "collassando" questo in un POJO, per una più facile manutenibilità.
-
Aspetta un po 'di tempo nel caso in cui qualcuno venga a spiegare le cose. Aspetterei almeno una settimana o due
- Se qualcuno spiega lo scopo, a) metti quello al ticket, b) aggiungi a
Foo
javadocs qualcosa come scopo dell'interfaccia spiegato nel ticket PRJ-123 , c) chiudi il ticket, d) salta i prossimi tre passaggi.
- Altrimenti, ...
- Vieni al caposquadra o al responsabile per chiedere cosa penserebbero se aggiusto il biglietto come suggerito.
Scegli un consulente che abbia autorità sufficiente per sostenere il "test dell'urlo" nel caso in cui la soluzione suggerita risulti errata .
- Collabora a POJO come da soluzione suggerita, disponi riesame del codice se è possibile (in casi scivolosi come quello non ti farà male coprirti la schiena).
- Attendi fino a quando la modifica non supera il test completo e aggiorna il ticket a seconda del suo esito; aggiungi le informazioni sul fatto che la modifica abbia superato il test o meno.
- Crea e gestisci un nuovo ticket di monitoraggio dei problemi per gestire i casi simili rimanenti in base al risultato del tuo ticket pilota (
PRJ-123
): o documenta lo scopo, oppure comprimi in POJO.