In generale, sì. Tuttavia, devi essere consapevole delle sorprese, alcune delle quali menziono più avanti.
Dichiarazione di non responsabilità: nessuno di questi elenchi è esaustivo.
Interfacce progettate male:
- con molti metodi;
- con metodi che non generano tipi di eccezioni sensibili, o metodi che non generano affatto (un problema in linguaggi di eccezioni controllate come Java: quando non ci si ripensa, la maggior parte delle persone di solito lancia
Exception
o nulla) ;
- con metodi che potrebbero non essere implementati, nel senso che possono lanciare
UnsupportedOperationException
(un'eccezione non controllata) o una sottoclasse di essa (in .NET, esiste già un NotImplementedException
più esplicito); di solito visto insieme a enormi interfacce.
Cosa si può fare:
- Dividi le enormi interfacce;
- Fornire almeno una sottoclasse di
Exception
nello stesso spazio dei nomi dell'interfaccia;
- Se non puoi dividere un'interfaccia per una buona ragione, indica chiaramente quali metodi possono lanciare un
UnsupportedOperationException
(o NotImplementedException
in .NET). Potrebbero essere tutti i metodi, ma dichiararlo chiaramente , ad esempio all'inizio della documentazione dell'interfaccia o in un piccolo paragrafo separato nella parte superiore e anche nella descrizione di ciascun metodo.
Se devi utilizzare un'interfaccia enorme che descrive quali metodi possono generare eccezioni non controllate come UnsupportedOperationException
(presumo che sia un'interfaccia fuori dal tuo controllo), sii pronto a prenderle o a documentare che i tuoi metodi potrebbero lanciarle .
Un'interfaccia dovrebbe essere il più piccola possibile e la sua implementazione dovrebbe significare che è totalmente implementata. Nel mondo reale, tuttavia, non è sempre il caso, e a volte si deve passare attraverso i cerchi.
Un'implementazione di classe scadente:
- che implementa un'interfaccia sull'interesse di supportare solo parte del suo contratto, come uno o due dei suoi metodi, di solito non fa nulla o restituisce il non-sense per tutti gli altri metodi (a meno che non stia effettivamente implementando un osservatore);
- che genera
UnsupportedOperationException
(o NotImplementedException
in .NET) in metodi in cui l'interfaccia non indica chiaramente che potrebbe essere generata;
Cosa si può fare:
- Avere una classe astratta che implementa la maggior parte di boilerplate e ereditarsene direttamente oppure crearne una sottoclasse e utilizzare questa nuova classe per creare un'istanza degli oggetti di delega. In effetti, molti oggetti Java Observer sono già dotati di questa funzionalità, anche se l'implementazione predefinita di tutti i suoi metodi è di non fare assolutamente nulla.
- Correggilo, segui il contratto. Se il codice non è tuo, prova a racchiudere tale comportamento scorretto.