Используя несколько языков программирования и библиотек, я заметил различные термины, используемые для общего количества элементов в коллекции.
Наиболее распространенными, кажется length
, count
и size
.
например.
array.length
vector.size()
collection.count
Есть ли какой-либо предпочтительный термин для использования? Зависит ли это от типа коллекции? то есть. изменяемые / неизменны
Есть ли предпочтение, чтобы это было свойство вместо метода?
List.Capacity
в C # есть свойство.Ответы:
Length()
имеет тенденцию ссылаться на смежные элементы - например, строка имеет длину.Count()
имеет тенденцию ссылаться на количество элементов в более свободной коллекции.Size()
имеет тенденцию ссылаться на размер коллекции, часто это может отличаться от длины в таких случаях, как векторы (или строки), в строке может быть 10 символов, но память зарезервирована для 20. Это также может относиться к числу элементы - проверить источник / документацию.Capacity()
- используется для конкретной ссылки на выделенное пространство в коллекции, а не на количество допустимых элементов в ней. Если для типа определены и «емкость», и «размер», то «размер» обычно относится к числу фактических элементов.Я думаю, что основной вопрос сводится к человеческому языку и идиомам, размер строки не кажется очень очевидным, хотя длина набора одинаково сбивает с толку, даже если они могут использоваться для ссылки на одну и ту же вещь (количество элементов ) в сборе данных.
источник
size()
относится к числу элементов в векторе, а не к егоcapacity()
… по крайней мере в C ++, который, я думаю, является источникомvector
s сsize
s.std::vector
(C ++), например, использует «емкость» и «размер», где вы используете «размер» и «количество», соответственно. На самом деле, все вstd::
изезе «размере» для текущего счетчика элементов, дажеstd::string
(что обеспечивает «размер» для совместимости шаблона и полностью идентичной «длиной» для ... человека удобства я думаю).FWIW (и это очень близко к нулю), я предпочитаю «Count», потому что он, кажется, указывает, что он собирается вернуть количество элементов / элементов в коллекции довольно однозначно.
Когда я сталкиваюсь с терминами «Длина» или «Размер», мне часто на мгновение задаётся вопрос (или даже заставляют перечитывать документацию), собирается ли эта чертова вещь сказать мне, сколько элементов в собрании или как много байтов, которые использует коллекция. Это особенно верно для коллекций, которые предназначены быть контингентными, как массивы или строки.
Но никто, кто отвечал за соглашения об именах, используемые стандартными инфраструктурами / библиотеками Java, BCL / .Net или C / C ++, не удосужился спросить меня, так что вы все застряли на том, что они придумали.
Если бы я был намного умнее меня и был назван Бьярне, все вы могли бы избавиться от страданий ...
Конечно, вернувшись в реальный мир, вы должны попытаться придерживаться любого соглашения об именах, используемого языком / платформой, которую вы используете (например,
size()
в C ++). Не то чтобы это, кажется, помогло вамArray.Length
решить вашу дилемму.источник
Термины несколько взаимозаменяемы, хотя в некоторых ситуациях я бы предпочел одно другому. Обычно вы можете получить лучшее использование, если подумаете о том, как бы вы описали длину / размер / количество этого элемента в устной форме другому человеку?
length()
подразумевает, что элемент имеет длину. Строка имеет длину. Вы говорите "строка длиной 20 символов", верно? Так что у него есть длина.size()
подразумевает, что элемент имеет размер. Например, файл имеет размер. Вы говорите "этот файл имеет размер 2 МБ", верно? Так что у него есть размер.Тем не менее, строка также может иметь размер, но я бы ожидал чего-то другого здесь. Например, строка UTF-16 может иметь длину 100 символов, но, поскольку каждый символ состоит из двух байтов, я ожидаю, что размер будет 200.
count()
очень необычно Objective-C использует количество для количества элементов в массиве. Можно спорить, если массив имеет длину (как в Java), имеет размер (как в большинстве других языков) или имеет счетчик. Тем не менее, размер может снова быть размером в байтах (если элементы массива 32-битные целые, каждый элемент имеет 4 байта) и длиной ... Я бы не сказал, что «массив состоит из 20 элементов», что звучит довольно странно для меня. Я бы сказал, что «массив состоит из 20 элементов». Я не уверен, выражает ли count это очень хорошо, но я думаю, что count здесь краткая форма,elementCount()
и это опять же имеет гораздо больший смысл для массива, чем length () или size ().Если вы создаете собственные объекты / элементы на языке программирования, лучше использовать любые другие подобные элементы, так как программисты привыкли получать доступ к желаемому свойству, используя этот термин.
источник
length
, но разные хранилища могут использовать разныеsizes
для хранения своих данных. Java тоже так думает в java.io.File # length () , но похоже, что остальной мир не согласен.Подсчет, я думаю, является наиболее очевидным термином для использования, если вы ищете количество предметов в коллекции. Это должно быть даже очевидно для новых программистов, которые еще не особенно привязаны к данному языку.
И это должно быть свойство, как оно есть: описание (иначе свойство) коллекции. Метод подразумевает, что он должен что-то сделать с коллекцией, чтобы получить количество элементов, и это просто кажется не интуитивным.
источник
Хм ... я бы не использовал размер. Потому что это может быть перепутано с размером в байтах. Длина - может иметь смысл для массивов, если предполагается, что они используют последовательные байты памяти. Хотя ... длина ... в чем? Подсчет понятен. Сколько элементов. Я бы использовал счет.
Что касается свойства / метода, я бы использовал свойство, чтобы отметить его быстро, а метод, чтобы отметить его медленно.
И самое главное - я бы придерживался стандартов языков / библиотек, которые вы используете.
источник
Добавление к ответу @ gbjbaanb ...
Если «свойство» подразумевает открытый доступ к значению, я бы сказал, что «метод» предпочтителен просто для обеспечения инкапсуляции и скрытия реализации.
Вы можете изменить свое мнение о том, как
count
элементы или как вы поддерживаете этоcount
. Если это свойство, вы застряли - если к нему обращаются через метод, вы можете изменить базовую реализацию, не влияя на пользователей коллекции.источник
В Elixir на самом деле существует четкая схема именования, связанная с разными типами языка.
источник
Для меня это немного похоже на вопрос, лучше ли «foreach», чем «для каждого». Это зависит только от языка / структуры.
источник
Я бы сказал, что это зависит от конкретного языка, который вы используете, и классов . Например, в c #, если вы используете Array, у вас есть свойство Length, если у вас есть что-то, что наследует от IEnumerable, у вас есть расширение метода Count (), но оно не быстрое. И если вы унаследовали от ICollection, у вас есть Property Count.
источник