recuento vs longitud vs tamaño en una colección

A partir del uso de varios lenguajes de progtwigción y bibliotecas, he notado varios términos utilizados para la cantidad total de elementos en una colección.

Los más comunes parecen ser la length , el count y el size .

p.ej.

 array.length vector.size() collection.count 

¿Hay algún término preferido para ser utilizado? ¿Depende del tipo de colección que es? es decir. mutable / inmutable

¿Existe una preferencia por ser una propiedad en lugar de un método?

Length() tiende a referirse a elementos contiguos: una cadena tiene una longitud, por ejemplo.

Count() tiende a referirse a la cantidad de elementos en una colección más suelta.

Size() tiende a referirse al tamaño de la colección, a menudo puede ser diferente de la longitud en casos como vectores (o cadenas), puede haber 10 caracteres en una cadena, pero el almacenamiento está reservado para 20. También puede referirse a la cantidad de elementos: verificar fuente / documentación.

Capacity() : se usa para referirse específicamente al espacio asignado en la colección y no al número de elementos válidos en ella. Si el tipo tiene definidos tanto “capacidad” como “tamaño”, entonces “tamaño” generalmente se refiere a la cantidad de elementos reales.

Creo que el punto principal es el lenguaje humano y las expresiones idiomáticas, el tamaño de una cuerda no parece muy obvio, mientras que la longitud de un conjunto es igualmente confusa aunque podrían usarse para referirse a la misma cosa (cantidad de elementos) ) en una colección de datos.

FWIW (y eso es casi nulo), prefiero ‘Count’ porque parece indicar que va a devolver la cantidad de elementos / elementos en la colección de manera bastante inigualable.

Cuando me enfrento a los términos ‘Longitud’ o ‘Tamaño’, a menudo me pregunto por un momento (o incluso me obligan a volver a leer la documentación) si la maldita cosa me va a decir cuántos elementos hay en la colección o cómo muchos bytes que la colección está consumiendo. Esto es particularmente cierto para las colecciones que están destinadas a contingous como matrices o cadenas.

Pero nadie que fuera responsable de las convenciones de nomenclatura utilizadas por los frameworks / bibliotecas estándar de Java, BCL / .Net o C / C ++ se molestó en preguntarme, por lo que todos están atrapados con todo lo que se les ocurrió.

Si solo fuera mucho más inteligente que yo y me llamaran Bjarne, todos ustedes podrían ahorrarse la miseria …

Por supuesto, de vuelta en el mundo real, debe intentar seguir con la convención de nomenclatura utilizada por el idioma / plataforma que está utilizando (por ejemplo, size() en C ++). No es que esto parezca ayudarte con tu dilema Array.Length .

Los términos son intercambiables, aunque en algunas situaciones preferiría una sobre otra. Usualmente puedes obtener el mejor uso si piensas en ¿Cómo describirías la longitud / tamaño / conteo de este elemento verbalmente a otra persona? .

length() implica que el elemento tiene una longitud. Una cuerda tiene una longitud. Usted dice “una cadena tiene 20 caracteres”, ¿verdad? Entonces tiene una longitud.

size() implica que el elemento tiene un tamaño. Por ejemplo, un archivo tiene un tamaño. Usted dice “este archivo tiene un tamaño de 2 MB”, ¿verdad? Entonces tiene un tamaño.

Dicho esto, una cadena también puede tener un tamaño, pero esperaría algo más aquí. Por ejemplo, una cadena UTF-16 puede tener una longitud de 100 caracteres, pero como cada carácter está compuesto por dos bytes, yo esperaría que el tamaño fuera 200.

count() es muy inusual. Objective-C usa recuento para la cantidad de elementos en una matriz. Uno podría argumentar si una matriz tiene una longitud (como en Java), tiene un tamaño (como en la mayoría de los otros idiomas) o tiene un recuento. Sin embargo, el tamaño podría volver a ser el tamaño en byte (si los elementos de la matriz son 32 bits int, cada elemento es 4 bytes) y longitud … No diría que “una matriz tiene 20 elementos”, eso suena bastante extraño yo. Diría que “una matriz tiene 20 elementos”. No estoy seguro de si el conteo lo expresa muy bien, pero creo que el recuento es aquí una forma abreviada para elementCount() y que tiene mucho más sentido para una matriz que length () o size ().

Si crea objetos / elementos propios en un lenguaje de progtwigción, es mejor usar cualquier otro elemento similar que use, ya que los progtwigdores están acostumbrados a acceder a la propiedad deseada usando ese término.

Contar Creo que es el término más obvio para usar si está buscando la cantidad de elementos en una colección. Eso debería ser incluso obvio para los nuevos progtwigdores que aún no se han apegado particularmente a un idioma determinado.

Y debería ser una propiedad, ya que eso es lo que es: una descripción (también conocida como propiedad) de la colección. Un método implicaría que tiene que hacer algo en la colección para obtener el número de elementos y eso parece poco intuitivo.

Hmm … No usaría el tamaño. Porque esto puede confundirse con el tamaño en bytes. Longitud: podría tener algún sentido para las matrices, siempre que se suponga que utilicen los bytes de memoria consiguientes. Aunque … longitud … ¿en qué? El conteo es claro. Cuantos elementos. Yo usaría el conteo.

Acerca de la propiedad / método, usaría la propiedad para marcar que es rápido y el método para marcar que es lenta.

Y, lo más importante, me apegaré a los estándares de los idiomas / bibliotecas que está utilizando.

Agregando a la respuesta de @gbjbaanb …

Si “propiedad” implica acceso público al valor, diría que se prefiere “método” simplemente para proporcionar encapsulación y ocultar la implementación.

Puede cambiar su forma de pensar acerca de cómo count elementos o cómo mantener esa count . Si se trata de una propiedad, está atascado: si se procesa a través de un método, puede cambiar la implementación subyacente sin afectar a los usuarios de la colección.

En Elixir, en realidad, hay un esquema de nomenclatura claro asociado a él en todos los tipos del lenguaje.

Al “contar” el número de elementos en una estructura de datos, Elixir también cumple con una regla simple: la función se denomina size si la operación está en tiempo constante (es decir, el valor es precalculado) o la length si la operación es lineal ( es decir, el cálculo de la longitud se hace más lento a medida que crece la entrada).

Para mí, esto es un poco como preguntar si “foreach” es mejor que “para cada uno”. Simplemente depende del idioma / marco.

Yo diría que depende del lenguaje particular que estés usando y las clases . Por ejemplo, en c # si está utilizando Array, tiene Longitud de propiedad , si tiene algo que hereda de IEnumerable, tiene la extensión Method Count (), pero no es rápido. Y si heredó de ICollection, tiene Recuento de propiedades .