conta contro lunghezza vs taglia in una raccolta

Dall’uso di numerosi linguaggi e librerie di programmazione ho notato vari termini usati per il numero totale di elementi in una raccolta.

Il più comune sembra essere la length , il count e la size .

per esempio.

 array.length vector.size() collection.count 

C’è un termine preferito da usare? Dipende dal tipo di collezione che è? vale a dire. mutevole / immutabili

C’è una preferenza per essere una proprietà invece di un metodo?

    Length() tende a riferirsi ad elementi contigui – una stringa ha una lunghezza per esempio.

    Count() tende a riferirsi al numero di elementi in una collezione più libera.

    Size() tende a riferirsi alla dimensione della collezione, spesso questo può essere diverso dalla lunghezza in casi come i vettori (o stringhe), ci possono essere 10 caratteri in una stringa, ma la memoria è riservata per 20. Può anche riferirsi al numero di elementi – controlla la fonte / documentazione.

    Capacity() – utilizzato per riferirsi specificamente allo spazio allocato nella raccolta e non al numero di elementi validi in esso. Se il tipo ha sia la “capacità” sia la “dimensione” definite, la “dimensione” di solito si riferisce al numero di elementi reali.

    Penso che il punto principale sia il linguaggio umano e gli idiomi, la dimensione di una stringa non sembra molto ovvia, mentre la lunghezza di un set è ugualmente confusa anche se potrebbero essere usati per riferirsi alla stessa cosa (numero di elementi ) in una raccolta di dati.

    FWIW (e questo è incredibilmente vicino a nulla), preferisco “Count” perché sembra indicare che restituirà il numero di elementi / elementi nella raccolta in modo univoco.

    Di fronte ai termini “Lunghezza” o “Dimensione”, mi chiedo spesso per un momento (o persino di essere costretto a rileggere la documentazione) se quella dannata cosa mi dirà quanti elementi ci sono nella raccolta o come molti byte che la raccolta sta consumando. Questo è particolarmente vero per le raccolte che sono destinate ad essere contingenti come array o stringhe.

    Ma nessuno che fosse responsabile delle convenzioni di denominazione utilizzate dalle librerie / librerie standard Java, BCL / .Net o C / C ++ si è preso la briga di chiedermelo, quindi siete tutti bloccati con qualsiasi cosa abbiano inventato.

    Se solo fossi più intelligente di me e mi chiamassi Bjarne, a tutti voi potrebbe essere risparmiata la miseria …

    Naturalmente, tornando nel mondo reale, dovresti cercare di restare fedele a qualsiasi convenzione di denominazione utilizzata dalla lingua / piattaforma che stai usando (ad esempio, size() in C ++). Non che questo ti aiuti con il tuo dilemma Array.Length .

    I termini sono in qualche modo intercambiabili, anche se in alcune situazioni preferirei uno rispetto all’altro. Di solito puoi ottenere il miglior utilizzo se pensi a come descriveresti la lunghezza / dimensione / conteggio di questo elemento verbalmente ad un’altra persona? .

    length() implica che l’elemento abbia una lunghezza. Una stringa ha una lunghezza. Dici “una stringa è lunga 20 caratteri”, giusto? Quindi ha una lunghezza.

    size() implica che l’elemento abbia una dimensione. Ad esempio, un file ha una dimensione. Dici “questo file ha una dimensione di 2 MB”, giusto? Quindi ha una dimensione.

    Detto questo, una stringa può anche avere una dimensione, ma mi aspetterei qualcos’altro qui. Ad esempio, una stringa UTF-16 può avere una lunghezza di 100 caratteri, ma dato che ogni carattere è composto da due byte, mi aspetto che la dimensione sia 200.

    count() è molto insolito. Objective-C usa il conteggio per il numero di elementi in una matrice. Si potrebbe discutere se una matrice ha una lunghezza (come in Java), ha una dimensione (come nella maggior parte delle altre lingue) o ha un conteggio. Tuttavia, la dimensione potrebbe essere nuovamente la dimensione in byte (se gli elementi dell’array sono 32 bit int, ogni elemento è 4 byte) e la lunghezza … Non direi “un array è lungo 20 elementi”, che suona piuttosto strano a me. Direi che “un array ha 20 elementi”. Non sono sicuro che il conteggio lo esprima molto bene, ma penso che il conteggio sia qui una forma abbreviata per elementCount() e che abbia ancora molto più senso per un array che length () o size ().

    Se crei propri oggetti / elementi in un linguaggio di programmazione, è meglio usare qualsiasi altro elemento simile, poiché i programmatori sono abituati ad accedere alla proprietà desiderata usando quel termine.

    Il conteggio penso sia il termine più ovvio da utilizzare se stai cercando il numero di elementi in una raccolta. Ciò dovrebbe anche essere ovvio per i nuovi programmatori che non sono ancora diventati particolarmente attaccati a una determinata lingua.

    E dovrebbe essere una proprietà in quanto è quello che è: una descrizione (alias proprietà) della collezione. Un metodo implicherebbe che deve fare qualcosa per la collezione per ottenere il numero di elementi e che sembra poco intuitivo.

    Hmm … non userei la taglia. Perché questo potrebbe essere confuso con la dimensione in byte. Lunghezza – potrebbe avere un senso per gli array, a condizione che si supponga di utilizzare byte di memoria consecutivi. Però … lunghezza … in cosa? Il conteggio è chiaro. Quanti elementi. Vorrei usare il conteggio.

    A proposito di proprietà / metodo, vorrei usare la proprietà per contrassegnare che è veloce, e il metodo per contrassegnare è lento.

    E, il più importante, mi attenevo agli standard delle lingue / librerie che stai utilizzando.

    Aggiunta alla risposta di @ gbjbaanb …

    Se “proprietà” implica l’accesso pubblico al valore, direi che il “metodo” è preferito semplicemente per fornire l’incapsulamento e per hide l’implementazione.

    Potresti farti cambiare idea su come count elementi o su come mantenere quel count . Se si tratta di una proprietà, si è bloccati: se è associato a un metodo, è ansible modificare l’implementazione sottostante senza influire sugli utenti della raccolta.

    In Elixir esiste in realtà un chiaro schema di denominazione associato a tutti i tipi nella lingua.

    Quando “conta” il numero di elementi in una struttura dati, Elixir si attiene anche a una semplice regola: la funzione si chiama size se l’operazione è in tempo costante (cioè il valore è precalcolato) o la length se l’operazione è lineare ( cioè il calcolo della lunghezza diventa più lento man mano che l’input cresce).

    Per me, è un po ‘come chiedere se “foreach” è meglio di “per ciascuno”. Dipende solo dalla lingua / struttura.

    Direi che dipende dal linguaggio specifico che stai usando e dalle classi . Ad esempio in c # se si utilizza Array si ha Property Length, se si ha qualcosa che eredita da IEnumerable si ha il metodo Method Count (), ma non è veloce. E se hai ereditato da ICollection hai Conte Proprietà .