Perché gli array sono spesso trattati come cittadini di seconda classe?

2

In molti linguaggi di programmazione, gli array non ricevono la stessa attenzione di altre strutture di dati. In Java, non esiste una raccolta di tipo Array<T> per rendere gli array più coerenti, ad esempio nell'ereditarietà. In Python non ci sono matrici, ma solo liste. Per avere un "array", bisogna fare qualcosa come [0] * size . Le matrici non sono strutture dati obsolete, ed è spesso più naturale usare un array che un elenco.

A volte ha senso avere un numero fisso di elementi, alcuni dei quali potrebbero non essere impostati in un punto nel tempo. Potresti immaginare una fila di cupholders; puoi mettere le tazze in qualsiasi posizione o eliminarle, ma non puoi semplicemente aggiungere un altro portabicchieri.

    
posta Justin 08.06.2016 - 03:59
fonte

3 risposte

5

In Java, there is no Array type collection to make arrays feel more consistent, such as in inheritance.

Certo che esiste, si chiama List<T> . L'unica differenza fondamentale tra un'ipotetica Array<T> e List<T> è che non puoi ridimensionare Array<T> . Se Array<T> fosse aggiunto, sarebbe come List<T> tranne con meno funzionalità e quale sarebbe il punto?

Sometimes it makes sense to have a fixed number of elements, some of which may not be set at a point in time. You might imagine a row of cupholders; you can put cups in any position or take them out, but you can't just add another cupholder.

E puoi farlo con un List<T> .

List<String> strings = Arrays.asList(new String[45]);

Se non vuoi ridimensionare il tuo perso, non ridimensionare il tuo elenco. Qualsiasi funzionalità aggiuntiva disponibile sulla tua struttura dati che non ti serve non ti fa male.

Tuttavia, avere funzionalità extra può essere un problema quando rende il codice più difficile da ragionare. Prendere in considerazione:

FooResult result = calculateFoo(myList);

Se calculateFoo prende un'interfaccia che non può ridimensionare myList , sarà più facile capire cosa fa il codice. So che la lista avrà le stesse dimensioni in seguito. Ma sarebbe ancora meglio se myList fosse immutabile, e quindi saprei che non è cambiato affatto.

Avere una lista di dimensioni fisse non sembra molto utile perché o voglio una lista che posso modificare (nel qual caso avere l'opzione di ridimensionare non fa male), o voglio una lista che non può essere modificata. Un tipo di matrice non si adatta a nessuno scopo.

    
risposta data 08.06.2016 - 05:32
fonte
4

Riguardo a Java, Java 1.0 non aveva generici. Al contrario, direi che gli array sono "cittadini di prima classe" in Java poiché ricevono un trattamento speciale dalla lingua.

È vero che a volte hai semplicemente bisogno di una raccolta di dimensioni fisse, ma il caso in cui hai bisogno di una raccolta di dimensioni dinamiche è più comune.

Infine, gli array vanno bene per l'uso temporaneo in alcuni algoritmi, ma lasciano molto a desiderare come argomenti di funzione o valori di ritorno. Il fatto che siano mutabili significa che devi fare una copia difensiva quando li passi a funzioni poiché non sai se la funzione vorrà mutare il contenuto. Lo stesso è vero quando si restituiscono gli array da un getter - di solito non si vuole che il chiamante sia in grado di modificare le variabili private dell'oggetto, quindi è richiesta una copia difensiva.

Eric Lippert ha un grande articolo su questo: Array in qualche modo considerati nocivi

    
risposta data 08.06.2016 - 04:11
fonte
2

Gli array sono di livello molto basso. Puoi anche chiedere, "In java perché int , float e double non oggetti, per renderli più coerenti con il resto del linguaggio orientato agli oggetti?"

Gli array hanno una mappatura chiusa (nella maggior parte delle lingue) al codice di memoria del livello di assemblaggio. Questo non ha una vera nozione di generici, gli array sono di indicatori o altri tipi primitivi. Gli array esistono nei linguaggi di livello superiore, principalmente come strumenti per costruire strutture di dati più sofisticate.

Probabilmente esiste un costrutto di dimensioni fisse di alto livello nella tua lingua che è un "cittadino di prima classe". Forse tuple o FixedSizeVector

    
risposta data 08.06.2016 - 05:38
fonte

Leggi altre domande sui tag