Conversione di interfacce in sottotipi. È questo cattivo SE?

4

In azienda per cui lavoro, continuo a vedere le interfacce di IManager convertite nei loro veri tipi e un sacco di "instanceof / TypeOf" se i controlli delle istruzioni.

Ad esempio:

Gestore IManager // passato al metodo come parametro

if (manager.GetType() == typeof(CustomerManager)) {
    customerManager = (CustomerManager) manager;
    customers = customerManager.GetCustomers();
    groupId = customerManager.GetCustomerGroupID(); 
    // etc...
}

Ho letto il Principio di sostituzione di Liskov e afferma che "I sottotipi devono essere sostituibili al loro tipo di base". Questo sembra violare questo.

I sottotipi hanno le loro funzioni molto specifiche e non sono sicuro su come risolverlo. Questo è un problema che vedo accadere molto quando io stesso sto sviluppando. Trovo difficile da evitare e penso di dover cambiare il modo in cui tratto le interfacce.

Qualcuno ha qualche consiglio SE per evitare problemi comuni come questo?

    
posta Mayron 13.02.2018 - 11:34
fonte

1 risposta

6

Se stai passando le interfacce a luoghi che non riescono a svolgere il loro lavoro solo con le funzioni nelle interfacce, non dovresti utilizzare queste interfacce in primo luogo.

Spesso tale codice è il risultato di persone che seguono pedissequamente il principio "Codice alle interfacce, non alle implementazioni", senza comprendere il principio ancora più importante "Se si utilizza instanceof , il refactoring per utilizzare le interfacce è inutile".

Un'interfaccia è utile se più classi concrete sono intercambiabili per uno scopo particolare. Se non lo sono, beh, non c'è vergogna in questo. Forse puoi raggruppare le tue funzionalità in un modo diverso in modo che alcune cose possano essere astratte. Ma imporre l'uso delle interfacce in situazioni in cui non funzionano è una bandiera rossa; significa che qualcuno comprende principi importanti solo a metà strada.

    
risposta data 13.02.2018 - 11:40
fonte

Leggi altre domande sui tag