web-dev-qa-db-fra.com

compter vs longueur vs taille dans une collection

En utilisant un certain nombre de langages de programmation et de bibliothèques, j'ai remarqué divers termes utilisés pour désigner le nombre total d'éléments d'une collection.

Les plus communs semblent être length, count et size.

par exemple.

array.length
vector.size()
collection.count

Y at-il un terme préféré à utiliser? Est-ce que cela dépend de quel type de collection il s'agit? c'est à dire. mutable/immuable

Y a-t-il une préférence pour que ce soit une propriété plutôt qu'une méthode?

157
molasses

Length() a tendance à faire référence à des éléments contigus - une chaîne a une longueur par exemple.

Count() a tendance à faire référence au nombre d'éléments dans une collection plus lâche.

Size() a tendance à faire référence à la taille de la collection. Cette dernière peut souvent être différente de la longueur dans le cas de vecteurs (ou de chaînes). Il peut y avoir 10 caractères dans une chaîne, mais la mémoire est réservée à 20. Il peut également faire référence à un nombre d'éléments - vérifiez la source/la documentation.

Capacity() - utilisé pour désigner spécifiquement l'espace alloué dans la collection et non le nombre d'éléments valides qu'il contient. Si le type a à la fois la "capacité" et la "taille" définis, alors "taille" fait généralement référence au nombre d'éléments réels.

Je pense que l’essentiel est lié au langage et aux idiomes humains, la taille d’une chaîne ne semble pas très évidente, alors que la longueur d’un ensemble est également source de confusion, même si elles peuvent être utilisées pour faire référence à la même chose (nombre d’éléments ) dans une collection de données.

220
gbjbaanb

FWIW (et c'est presque nul), je préfère 'Compter' car cela semble indiquer que le nombre d'éléments/éléments de la collection va être renvoyé sans aucune ambiguïté.

Quand je suis confronté aux termes "longueur" ou "taille", je me demande souvent (ou même d’être obligé de relire la documentation) si la fichue chose me dira combien d’éléments figurent dans la collection ou comment. de nombreux octets consommés par la collection. Cela est particulièrement vrai pour les collections destinées à être contingentes, comme les tableaux ou les chaînes.

Mais personne qui était responsable des conventions d'appellation utilisées par les frameworks/bibliothèques standard Java, BCL/.Net ou C/C++ n'a pris la peine de me demander, vous êtes donc tous coincés avec ce qu'ils ont proposé.

Si seulement j'étais beaucoup plus intelligent que moi et que je m'appelais Bjarne, vous pourriez tous être épargnés par la misère ...

Bien sûr, dans le monde réel, vous devriez essayer de vous en tenir à la convention de nommage utilisée par le langage/la plate-forme que vous utilisez (par exemple, size() en C++). Non pas que cela semble vous aider avec votre Array.Length dilemme.

27
Michael Burr

Les termes sont quelque peu interchangeables, bien que dans certaines situations, je préférerais les uns aux autres. Habituellement, vous pouvez obtenir le meilleur usage possible si vous réfléchissez à Comment décririez-vous la longueur/la taille/le nombre de cet élément verbalement à une autre personne?.

length() implique que l'élément a une longueur. Une chaîne a une longueur. Vous dites "une chaîne est de 20 caractères", non? Donc, il a une longueur.

size() implique que l'élément a une taille. Par exemple. un fichier a une taille. Vous dites "ce fichier a une taille de 2 Mo", non? Donc, il a une taille.

Cela dit, une chaîne peut aussi avoir une taille, mais je m'attendrais à autre chose ici. Par exemple. une chaîne UTF-16 peut avoir une longueur de 100 caractères, mais comme chaque caractère est composé de deux octets, la taille devrait être de 200.

count() est très inhabituel. Objective-C utilise count pour le nombre d'éléments dans un tableau. On pourrait discuter si un tableau a une longueur (comme en Java), une taille (comme dans la plupart des autres langues) ou un nombre. Cependant, taille peut à nouveau être la taille en octet (si les éléments du tableau ont 32 bits, chaque élément est de 4 octets) et leur longueur ... Je ne dirais pas "un tableau est long de 20 éléments", cela semble plutôt étrange moi. Je dirais "un tableau a 20 éléments". Je ne sais pas si count exprime cela très bien, mais je pense que count est ici une forme abrégée de elementCount() et que cela a beaucoup plus de sens pour un tableau que length () ou size ().

Si vous créez vos propres objets/éléments dans un langage de programmation, il est préférable d'utiliser ce que d'autres éléments similaires utilisent, car les programmeurs ont l'habitude d'accéder à la propriété souhaitée à l'aide de ce terme.

10
Mecki

Compter, je pense, est le terme le plus évident à utiliser si vous recherchez le nombre d’articles dans une collection. Cela devrait même être évident pour les nouveaux programmeurs qui ne sont pas encore particulièrement attachés à une langue donnée.

Et ce devrait être une propriété comme c'est ce qu'elle est: une description (propriété aka) de la collection. Une méthode impliquerait qu'il faut faire quelque chose à la collection pour obtenir le nombre d'éléments et cela semble tout simplement peu intuitif.

4
Corin

Hmm ... je n'utiliserais pas la taille. Parce que cela pourrait être confondu avec la taille en octets. Longueur - pourrait avoir un sens pour les tableaux, dans la mesure où ils sont censés utiliser les octets conséquents de mémoire. Bien que ... longueur ... dans quoi? Le compte est clair. Combien d'éléments. J'utiliserais le compte.

À propos de propriété/méthode, je voudrais utiliser propriété pour marquer c'est rapide, et méthode pour marquer c'est lent.

Et, le plus important - je m'en tiendrai aux normes des langues/bibliothèques que vous utilisez.

3
badbadboy

Ajout à la réponse de @ gbjbaanb ...

Si "propriété" implique un accès public à la valeur, je dirais que "méthode" est préférable simplement pour fournir une encapsulation et pour masquer la mise en oeuvre.

Vous pourrez peut-être changer d'avis sur la manière de count éléments ou sur la gestion de ce count. Si c'est une propriété, vous êtes bloqué - si vous y accédez via une méthode, vous pouvez modifier l'implémentation sous-jacente sans affecter les utilisateurs de la collection.

2
Ken Gentle

Elixir est en fait associé à un schéma de nommage clair pour tous les types du langage.

En "comptant" le nombre d'éléments dans une structure de données, Elixir respecte également une règle simple: la fonction est nommée size si l'opération est en temps constant (c'est-à-dire que la valeur est précalculée) ou length si l'opération est linéaire (c'est-à-dire que le calcul de la longueur devient plus lent à mesure que l'entrée augmente).

1
brightball

Je dirais que cela dépend de particulier langue que vous utilisez et classes. Par exemple, en c # si vous utilisez Array, vous avez Propriété Longueur, si vous héritez de IEnumerable, vous avez une extension Méthode Count (), mais ce n'est pas rapide. Et si vous avez hérité de ICollection, vous avez Propriété Comptez.

0
Alexandr

Pour moi, c'est un peu comme demander si "foreach" est meilleur que "for each". Cela dépend de la langue/du framework.

0
EBGreen