Tipi di dichiarazione in OOP

0

Vorrei sapere le opinioni sulla frase successiva:

"In un linguaggio tipizzato statico orientato agli oggetti dovresti dichiarare variabili e parametri quanto più ampi possibili e restituire i tipi il più stretti possibile"

In un certo senso questa affermazione potrebbe produrre questo codice:

interface  anyInterface<T> {
    Collection<T> getCollection();
}
class anyClass implements anyInterface<Integer> {
    @Override
    public ArrayList<Integer> getCollection() {
        ...
    }
}

Grazie in anticipo per le tue opinioni.

    
posta JoseLuis 16.04.2018 - 15:38
fonte

2 risposte

4

"In a object oriented static typed language you should declare variables and parameters as broad as possible and return types as narrow as possible"

Preso alla lettera, cioè consigliando dichiaro tutte le variabili e i parametri come Object (o qualunque sia la classe base per una data lingua). Questo è chiaramente senza senso. Inoltre, sta dicendo che non dovrei usare un'interfaccia per un tipo di ritorno quando posso usare un tipo specifico. Anche questo è chiaramente senza senso.

C'è un certo senso dietro le parole, ad esempio nel mondo .NET, è meglio usare ad esempio IEnumerable<T> invece di T[] o List<T> se la collezione è semplicemente enumerata tramite ad esempio foreach . In genere è meglio usare un tipo di astrazione (ad es. Interfaccia) su un tipo concreto. Ma questo vale per i tipi di ritorno da metodi privati tanto quanto per i parametri. Quindi non è ancora un ottimo consiglio.

Infine, la parte "object oriented" è irrilevante. Haskell, il poster poster del linguaggio funzionale, non ha supporto per OO, ma supporta ancora il polimorfismo ed è strongmente tipizzato. Lo stesso "favorisce un tipo di astrazione su un tipo concreto" si applica anche lì.

Quindi, in conclusione, ci sono voluti alcuni consigli sonori di base, distorti e il messaggio è stato tutto sbagliato. Quindi non è un buon consiglio.

    
risposta data 16.04.2018 - 15:54
fonte
-1

Questa linea guida produce codice il più possibile riutilizzabile, preservando il più possibile la sicurezza del tipo. L'idea è che usando il tipo più generale nel codice chiamante o nei parametri del metodo, quel codice o metodo può essere applicato a tutti i tipi possibili, in un linguaggio strongmente tipizzato.

Rendendo possibili i tipi di restituzione del tuo metodo come stretti (derivati), abiliti l'utente di quel metodo a utilizzare tutte le funzionalità del tipo restituito fornito; un tipo più generale (classe base o interfaccia) limiterebbe l'utilizzo successivo.

Questa affermazione non è specifica per la programmazione orientata agli oggetti. È vero per tutte le lingue strongmente tipizzate. Può anche essere esteso a tipi generici o superiori, ma il tuo esempio specifico non dichiara variabili o parametri, quindi è irrilevante.

    
risposta data 18.04.2018 - 02:12
fonte

Leggi altre domande sui tag