L'interfaccia della lista è un'astrazione che perde?

9

Se ho una variabile contenente List , potrebbe contenere oggetti di molti tipi diversi, ad es. ArrayList o LinkedList . La differenza tra LinkedList e ArrayList è piuttosto grande. Il grande comportamento O dei metodi differisce notevolmente. Ad esempio, l'ordinamento di List e il suo utilizzo per le ricerche binarie è perfettamente corretto per ArrayList , ma non avrebbe senso con LinkedList .

    
posta Paling 10.07.2013 - 12:23
fonte

4 risposte

25

Non lo direi.

Un'astrazione che perde è quella che ti costringe ad affrontare i dettagli di implementazione che dovrebbe estrapolare. Ma le prestazioni sempre differiscono tra le implementazioni, quindi se si conta come perdite, allora non ci sono astrazioni senza perdite.

Se qualcosa è dichiarato come List senza ulteriore documentazione, dovrebbe essere chiaro che non ci sono semplicemente garanzie circa le prestazioni, e se hai intenzione di fare qualcosa di sensibile al rendimento con esso, dovresti fare una copia e lavorare con quello.

Inoltre, non dimenticare che esiste un'interfaccia ancora più generica che è spesso sufficiente in termini di funzionalità e non ti induce a fare il maggior numero di ipotesi sul rendimento: Collection .

    
risposta data 10.07.2013 - 12:37
fonte
17

Tutte le astrazioni non banali, in una certa misura, perdono. Detto questo, non sono davvero certo si applica qui. : -)

Le astrazioni riguardano il comportamento. A meno che il comportamento non specifichi una performance particolare (che%'s% di co_de di Java non fa) è un dettaglio di implementazione - cioè irrilevante.

Java non consente di specificare le prestazioni minime per le interfacce al di fuori della documentazione, e non sono a conoscenza di alcun linguaggio che lo faccia - sarebbe incredibilmente difficile (impossibile?) da verificare per il compilatore. Posso vedere un paio di opzioni se le prestazioni sono un problema:

  1. Documentalo nella classe / interfaccia a cui apparterrà l'istanza dell'elenco.
  2. Crea una nuova interfaccia, ad es. List (yuck!) - che specifica i requisiti di prestazione dei vari metodi.

L'opzione 2 è probabilmente l'astrazione migliore, ma ha un sovraccarico extra.

    
risposta data 10.07.2013 - 12:37
fonte
4

In Java, c'è un'interfaccia RandomAccess definita come elenco con tempo di accesso casuale generalmente costante (O (1) get, put ecc.). Se ritieni che il tuo modulo richieda un elenco con tali caratteristiche di rendimento, considera l'utilizzo di RandomAccess anziché List . Se non senti il bisogno di fare quel cambiamento (e pochi lo fanno), allora forse List non è così leaky.

    
risposta data 12.07.2013 - 14:53
fonte
1

Hai ragione, una lista è un'astrazione che perde. L'STL utilizza l'idea dei concetti per modellare questo problema specifico. Per utilizzare il tuo esempio, un ArrayList modella un Iterator di accesso casuale mentre un LinkedList modella un Avanti Iterator . Concetti diversi hanno requisiti di rendimento diversi, che li rendono appropriati per diversi algoritmi .

    
risposta data 11.07.2013 - 05:04
fonte

Leggi altre domande sui tag