Interfacce e casting

6

Recentemente ho iniziato a lavorare con una versione nuova e brillante di un codebase che usa le interfacce dappertutto per ... praticamente tutto. Penso che tutte le nostre lezioni concrete implementino interfacce.

Il problema che ho notato è che il progetto non sembra codificare nell'interfaccia! Gli elementi trasmessi utilizzando le interfacce vengono coerentemente convertiti in tipi specifici. Mi sembra una cattiva idea, ma non riesco a capire chiaramente perché sia sbagliato. Sembra che usare le interfacce solo per trasmettere regolarmente stia perdendo i vantaggi di entrambe le interfacce e di un linguaggio strongmente tipizzato.

Per riformulare come una domanda: è una buona pratica? Perché?

Modifica: questo non è un duplicato di Qual è il motivo per cui ogni classe di servizio ha un'interfaccia? in quanto la mia domanda si riferisce specificamente al casting da un'interfaccia a una dozzina o più classi concrete che implementano tale interfaccia.

    
posta William - Rem 24.02.2017 - 17:36
fonte

2 risposte

13

Questa è una cattiva pratica, indipendentemente dal fatto che la taglierai.

Se il codice si aspetta nominalmente un'interfaccia, ma poi trasmette il parametro a un tipo concreto per utilizzare metodi più specifici dell'interfaccia, allora sta effettivamente mentendo a se stesso. Presumibilmente ha dovuto seguire una linea guida ben intenzionata come "Tutti i tipi di parametri devono essere interfacce" e ha seguito la sua lettera ma non lo spirito, probabilmente per mancanza di comprensione.

Se i valori sono espressi e quindi utilizzati solo tramite la funzionalità dell'interfaccia, è ancora più strano. Sembra che qualcuno non capisca affatto il concetto di interfacce e pensa di poter solo utilizzare (o solo capire l'uso di) oggetti quando conoscono la loro classe concreta.

Entrambi sono bandiere rosse, sebbene il secondo caso sia una bandiera rossa più grande.

    
risposta data 24.02.2017 - 17:48
fonte
2

Se tutto ciò che sai su un oggetto è che è conforme ad alcune interfacce, allora dovresti assumere che potrebbe essere un'istanza di almeno due classi differenti che implementano questa interfaccia.

Ho usato interfacce in cui c'erano effettivamente tre diverse classi che implementavano l'interfaccia e il casting nella classe sbagliata sarebbe stato disastroso. E ho usato interfacce in cui un'altra classe è stata sostituita a scopo di test, di nuovo il casting nella classe sbagliata sarebbe stato disastroso.

Ora se chiami un metodo di interfaccia, quella chiamata finirà nel codice di una particolare classe concreta. All'interno di questa classe concreta saprai quale implementazione concreta viene utilizzata per questo particolare oggetto, quindi non c'è bisogno di programmare contro l'interfaccia per questo oggetto.

    
risposta data 24.02.2017 - 20:45
fonte