L'interfaccia dell'elenco è un'astrazione che perde?


9

Se ho una variabile che contiene un List, potrebbe contenere oggetti di molti tipi diversi, ad esempio ArrayListo LinkedList. La differenza tra a LinkedListe an ArrayListè piuttosto grande. Il grande comportamento O dei metodi differisce notevolmente. Ad esempio, ordinare un Liste quindi usarlo per fare ricerche binarie è perfettamente ok per un ArrayListma non avrebbe senso con un LinkedList.


Cosa significa "la grande O"?
Tulains Córdova,

Risposte:


25

Non lo direi.

Un'astrazione che perde ti costringe a gestire i dettagli dell'implementazione che dovrebbe astrarre. Ma le prestazioni differiscono sempre tra le implementazioni, quindi se lo consideri come una perdita, non ci sono astrazioni senza perdite.

Se qualcosa viene dichiarato come Listprivo di ulteriore documentazione, si dovrebbe capire che semplicemente non ci sono garanzie sulle prestazioni e che se si intende fare qualcosa sensibile alle prestazioni, è necessario effettuare una copia e lavorare con quello.

Inoltre, non dimenticate che c'è un'interfaccia ancora più generale che è spesso sufficiente in termini di funzionalità e non tenta di fare il maggior numero di assunzioni sull'andamento: Collection.


9
Esiste un'interfaccia ancora più generale, che è spesso sufficiente in termini di funzionalità: Iterable.
emory

Sono attese differenze di prestazioni tra le diverse implementazioni. Ad esempio ci sono differenze tra Vector e ArrayList, ma un'operazione get su una LinkedList sembra semplicemente strana.
Impallidire l'

17

Tutte le astrazioni non banali, in una certa misura, presentano delle perdite. Detto questo, non sono davvero sicuro che si applichi qui. :-)

Le astrazioni riguardano il comportamento. A meno che il comportamento non specifichi prestazioni particolari (cosa che Java Listnon fa) è un dettaglio dell'implementazione - cioè irrilevante.

Java non ti 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?) Verificarlo. Vedo un paio di opzioni se le prestazioni sono un problema:

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

L'opzione 2 è probabilmente l'astrazione migliore, ma comporta un sovraccarico aggiuntivo.


1
+1. Tecnicamente sì, una Lista è un'astrazione che perde , ma lo stesso vale per Oggetto per nascondere la complessità legata all'utilizzo equalsper confrontare gli oggetti.
Neil,

2
@Neil Penso che sia discutibile ... Dal momento che l'astrazione non menziona le prestazioni, non penso che stia fallendo in questo caso (come ho sostenuto). Direi che se stai pensando alle prestazioni hai bisogno di un'astrazione diversa / più stretta. Modifica per menzionarlo.
vaughandroid,

Dipende da cosa stai nascondendo, suppongo. La complessità è nell'uso o è nell'uso e nell'implementazione della memoria? Perché se si tratta di una classe astratta, una o più di queste complessità si nascondono in un modo o nell'altro.
Neil,

Ho suonato in giro molti anni fa l'attuazione di una variante di Opzione 2 utilizzando interfacce marcatori come LinearSpacee LogarithmicTimepoi dichiarando classi come public class BinarySearch : ISearchStrategy<T>, LogarithmicTime. Altre classi potrebbero prendere parametri come public T find<T, S>(IList<T> list, S strategy) where S : ISearchStrategy<T>, LogarithmicTime { }imporre vincoli di prestazione.
Lucas,

2
Se stiamo seguendo l'articolo di Joel Spolsky, penso che sia "in una certa misura, che perde". Vedi la seguente citazione dall'articolo: "Se sei stato maledetto con gli amministratori di sistema della tua azienda e ti hanno punito collegandoti a un hub sovraccarico, solo alcuni dei tuoi pacchetti IP passeranno e TCP funzionerà, ma tutto funzionerà essere molto lento" Penso che questo si applica
Amish programmatore

4

In Java esiste un'interfaccia RandomAccess definita come un 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 prestazionali, considera RandomAccessinvece di utilizzare List. Se non senti la necessità di apportare quel cambiamento (e pochi lo fanno), forse List non è così permaloso.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.