Соглашения об именах переменных для карт/списков в языках с динамическим типом

Я перехожу к языку Groovy, который имеет динамическую типизацию (а также необязательную статическую типизацию). Он также имеет встроенную поддержку списков, карт и диапазонов, поэтому я часто использую списки и карты, особенно списки списков, списки карт, карты списков и т. д.

В статических языках (особенно с дженериками) у вас всегда есть представление о том, какой у вас тип. Я новичок в динамических языках, и становится немного сложно отслеживать, какой должна быть моя переменная, поэтому мне было интересно, используют ли другие люди какие-то соглашения об именах переменных, чтобы сохранить их прямолинейными.

Например, предположим, что у меня есть карта дат в качестве ключа и целых чисел в качестве значений. Или список целых чисел, или список карт, которые содержат строки в качестве ключей и объекты учетных записей в качестве значений.

Кажется, что создание четкого соглашения об именах переменных поможет мне отслеживать структуру типов данных, с которой я имею дело, без необходимости искать ее.

Какие-нибудь советы?


person Jean Barmash    schedule 07.03.2009    source источник
comment
Жаль, что нет возможности минусовать комментарии. Кажется, это вполне приемлемый вопрос.   -  person David Neale    schedule 06.05.2010
comment
@David, комментарии можно помечать как грубые или неконструктивные.   -  person leoger    schedule 17.10.2012
comment
Хотя использование def является обычным явлением, оно может быть неудобно для Java-программистов, и на самом деле нет никаких преимуществ в использовании def по сравнению со String или Map, за исключением, возможно, насмешек со стороны программистов Groovy, которые больше заботятся о стиле, чем следующий парень, читающий их код. Если вы хотите знать, к какому типу относятся ваши объекты, используйте фактический тип, если это может быть вопросом. Это также делает среду IDE более полезной (намного лучше работает автодополнение с пробелом Ctrl). Однако по мере вашего продвижения вы можете иногда чувствовать себя более комфортно с защитой, поэтому используйте ее, когда она кажется подходящей. Обычно работают и дженерики.   -  person Bill K    schedule 13.06.2017


Ответы (6)


Это обычная жалоба новичка. Вы можете использовать соглашение об именах, но есть вероятность, что вы слишком скоро откажетесь от него и сосредоточитесь на том, что представляет переменная (ее значение по отношению к остальной части кода), а не на том, как это представлено (это "тип").

person MarkusQ    schedule 08.03.2009
comment
Я знаю, что это очень старый вопрос, но лично меня интересует не столько как представление переменной, сколько возможность определить с первого взгляда, какие операции доступны для нее. Например, мне может быть все равно, является ли что-то массивом или списком, но меня волнует, могу ли я перебирать его. Как насчет конвенции в этом случае? Например. список имен против имен? - person ossek; 14.02.2014

Имя вашей переменной должно объяснить тому, кто читает код, что она должна собой представлять, что она означает. Если у вас есть карта дат в целые числа, представляет ли она, например (предлагаемые имена переменных указаны в скобках):

  1. количество платежей, подлежащих оплате на эту дату (paymentsDue)
  2. количество дней между отображаемой датой и другим моментом времени (daysPassed)
  3. количество сообщений, опубликованных в этот день в Stack Overflow (numberOfPostedMessages)

В языках, где тип переменной недоступен, вы можете добавить префикс суффикса, например paymentsDueMap. Однако я бы посоветовал не кодировать какую-либо дополнительную информацию о типе внутри имени переменной, например datesToInts, поскольку это обычно приносит больше вреда, чем пользы.

Наконец, если у вас есть сложная структура данных, такая как список сопоставлений между строками и учетными записями, лучше всего будет инкапсулировать ее в отдельный класс и назвать его в соответствии с его назначением.

person javashlook    schedule 08.03.2009

В статических языках (особенно с дженериками) у вас всегда есть представление о том, какой у вас тип.

Через некоторое время программирования на динамических языках вы узнаете, что использование типов таким образом — это костыль. Два совета:

  1. Используйте хорошие имена переменных. Например, если у вас есть сопоставление дат с целыми числами, вы можете назвать его как-то вроде BirthdateToTotalLookup.
  2. Узнайте, какие визуальные подсказки искать. Это может показаться очевидным, но мне потребовалось некоторое время, чтобы выработать привычку искать такие подсказки:

    sum += x['10-16-92']
    

Из фрагмента кода выше я могу сказать, что x — это карта, которая имеет дату в качестве ключа и возвращает какое-то число.

person Jason Baker    schedule 08.03.2009

Если имена могут быть короткими, то я склоняюсь к тому, чтобы называть карты как-то вроде "nounToNoun". Поэтому, используя ваш пример отображения дат в целые числа, я бы назвал это «dateToCount» (если целые числа являются счетчиками для чего-то). Таким образом, очевидно, что это карта, и очевидно, что на что сопоставляется. Проблема в том, что иногда трудно сделать такие имена короткими и читабельными. Например, «userToLoginHistory» становится немного громоздким.

Для списков я обычно использую множественное число для имени переменной. Таким образом, «пользователь» будет одним пользователем, а «пользователи» — списком пользователей.

Честно говоря, я не уверен, какое хорошее название подойдет для списка карт.

person KarstenF    schedule 08.03.2009

Одним из преимуществ динамических языков является то, что даже если вы используете объект в качестве карты, он не ДОЛЖЕН быть картой. Все, что ему нужно сделать, это поддерживать любые сообщения, отправленные ему. В Groovy, если я знаю, что данный метод ожидает карту, чтобы он мог искать вещи с помощью ключа String, я могу дать ему полную карту, урезанную карту, Expando со свойством, названным так же, как ключ или любой другой объект, у которого есть свойство, названное так же, как ключ. Это потому, что someObject["keyname"] и someObject.keyname — это одно и то же. (Конечно, если код вызывает someObject.get("keyname"), мне нужно каким-то образом подключить этот метод.)

Дело в том, что в таком динамическом языке, как Groovy, вы меньше думаете о ТИПАХ и больше о ПОДДЕРЖИВАЕМЫХ СООБЩЕНИЯХ. Если концептуально это карта, то прекрасно — имя ее рожденияToTotal имело бы смысл (хотя я предпочитаю называть ее «итоги», потому что totals[дата рождения] выглядит лучше, чем дату рожденияToTotal[дата рождения]) — но если ее не нужно указывать, не указывайте его. Вы оставляете себе гибкость позже.

person John Stoneham    schedule 08.03.2009

Это то, что вы перерастете со временем. Не сказать, что я не знаю 20-летнего программиста, все еще использующего венгерский, но он кодирует на языке со статической типизацией, так что это почти понятно.

Учти это. Эта переменная, которую вы называете, может быть HashMap, так какой тип вы добавляете к имени? Карта? Это промежуточный ответ. Почему не Коллекция? Таким образом, если вы решите изменить СПОСОБ хранения данных, вам не нужно менять имя переменной. Почему бы не HashMap, если вы действительно хотите, чтобы читатель знал, что происходит.

Как вы можете подозревать, ни один из них не является необходимым. Смысл динамического языка (и даже полиморфизма) в том, что вам не нужно знать точный тип представляемой переменной, важны только сами данные. Хотя вам может понадобиться подсказка о том, как взаимодействовать с этими данными, вскоре вы обнаружите, что в большинстве случаев уже знаете или можете легко поместить эту информацию в переменную без указания типов: addressByZipCode, totalByBirthdate и т. д.

person billjamesdev    schedule 08.03.2009