Как назвать переменные - PullRequest
       126

Как назвать переменные

44 голосов
/ 15 октября 2008
  • Какие правила вы используете для именования ваших переменных?
  • Где разрешено использование одной буквы?
  • Как много информации вы указали в названии?
  • как, например, код?
  • какие ваши предпочтительные бессмысленные имена переменных? (после foo & bar)
  • почему они пишутся "foo" и "bar" , а не FUBAR

Ответы [ 24 ]

47 голосов
/ 15 октября 2008
function startEditing(){
   if (user.canEdit(currentDocument)){
      editorControl.setEditMode(true);
      setButtonDown(btnStartEditing);
   }
 }

Следует читать как повествовательное произведение.

15 голосов
/ 15 октября 2008

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

int postalCodeDistanceMiles;
decimal reactorCoreTemperatureKelvin;
decimal altitudeMsl;
int userExperienceWongBakerPainScale

Я НЕ буду нести ответственность за сбой каких-либо ландеров Mars (или аналогичный сбой в моих скучных бизнес-приложениях CRUD).

12 голосов
/ 15 октября 2008

Ну, все зависит от языка, на котором вы разрабатываете. Поскольку я сейчас использую C #, я склонен использовать следующее.

camelCase для переменных.

camelCase для параметров.

PascalCase для свойств.

m_PascalCase для переменных-членов.

Где разрешены однобуквенные переменные? Я имею тенденцию делать это для петель, но чувствую себя немного виноватым, когда я делаю это. Но с foreach и лямбда-выражениями для циклов в настоящее время не так часто встречаются.

Как много информации вы указали в имени? Если код немного сложен для понимания, напишите комментарий. Не превращайте имя переменной в комментарий, т.е. int theTotalAccountValueIsStoredHere не требуется.

какие ваши предпочтительные бессмысленные имена переменных? (после foo & bar) я или х. foo и bar для меня - пример университетского учебника.

почему они пишутся как "foo" и "bar", а не FUBAR? Традиция

5 голосов
/ 15 октября 2008

Это все соглашения C #.

Корпус с переменным именем

Дело указывает на объем. Переменные в Паскале - это поля класса-владельца. Переменные в верблюде являются локальными для текущего метода.

У меня есть только одно префиксное соглашение. Вспомогательные поля для свойств класса в Pascal-регистре и с префиксом подчеркивания:

private int _Foo;
public int Foo { get { return _Foo; } set { _Foo = value; } }

Существует какое-то соглашение о присвоении имен C #, которое я видел - я почти уверен, что это был документ Microsoft - которое противоречит использованию префикса подчеркивания. Это кажется мне безумным. Если я посмотрю в своем коде и увижу что-то вроде

_Foo = GetResult();

самое первое, что я спрашиваю себя: «У меня была веская причина не использовать средство доступа к свойству для обновления этого поля?» Ответ часто звучит так: «Да, и вам лучше узнать, что это такое, прежде чем начинать манипулировать этим кодом».

Однобуквенные (и короткие) имена переменных

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

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

XmlWriterSettings xws = new XmlWriterSettings();
xws.Indent = true;
XmlWriter xw = XmlWriter.Create(outputStream, xws);

Это из кода C # 2.0; конечно, если бы я написал сегодня, мне бы не понадобилась переменная nonce:

XmlWriter xw = XmlWriter.Create(
   outputStream, 
   new XmlWriterSettings() { Indent=true; });

Но в коде C # все еще есть множество мест, где мне нужно создать объект, который вы просто собираетесь передать в другом месте, а затем выбросить.

Многие разработчики будут использовать имя, такое как xwsTemp в этих обстоятельствах. Я считаю, что суффикс Temp является избыточным. Тот факт, что я назвал переменную xws в ее объявлении (и я использую ее только в пределах визуального диапазона этого объявления; это важно), говорит мне, что это временная переменная.

Еще одно место, где я буду использовать короткие имена переменных, - это метод, который интенсивно использует один объект. Вот код производственного кода:

    internal void WriteXml(XmlWriter xw)
    {
        if (!Active)
        {
            return;
        }
        xw.WriteStartElement(Row.Table.TableName);

        xw.WriteAttributeString("ID", Row["ID"].ToString());
        xw.WriteAttributeString("RowState", Row.RowState.ToString());

        for (int i = 0; i < ColumnManagers.Length; i++)
        {
            ColumnManagers[i].Value = Row.ItemArray[i];
            xw.WriteElementString(ColumnManagers[i].ColumnName, ColumnManagers[i].ToXmlString());
        }
        ...

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

О, откуда мне знать, что xw не является временной переменной? Потому что я не вижу его декларации. Я использую только временные переменные в пределах 4 или 5 строк их объявления. Если мне понадобится один код для большего количества кода, я даю ему значимое имя или реорганизую код, используя его в метод, который - эй, какое совпадение - принимает короткую переменную в качестве аргумента.

Сколько информации вы указали в названии?

Достаточно.

Это оказывается чем-то вроде черного искусства. Есть много информации, которую я не должен вставить в название. Я знаю, когда переменная является вспомогательным полем средства доступа к свойству, или временным, или аргументом для текущего метода, потому что мои соглашения об именах говорят мне об этом. Так что мои имена не.

Вот почему это не так важно.

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

В этом блоке кода есть только одна переменная:

        RowManager r = (RowManager)sender;

        // if the settings allow adding a new row, add one if the context row
        // is the last sibling, and it is now active.
        if (Settings.AllowAdds && r.IsLastSibling && r.Active)
        {
            r.ParentRowManager.AddNewChildRow(r.RecordTypeRow, false);
        }

Имена свойств почти делают комментарий излишним. (Почти. На самом деле есть причина, по которой свойство называется AllowAdds, а не AllowAddingNewRows, о котором много думалось, но оно не относится к этому конкретному коду, поэтому есть комментарий.) имя переменной? Кого это волнует?

4 голосов
/ 15 октября 2008

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

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

4 голосов
/ 15 октября 2008
  • Я использую только односимвольные переменные для управления циклом или очень короткие функции.
for(int i = 0; i< endPoint; i++) {...}

int max( int a, int b) {
    if (a > b)
       return a;
    return b;
}
  • Количество информации зависит от области действия переменной: чем больше мест она может использовать, тем больше информации я хочу иметь имя, чтобы отслеживать ее назначение.
  • Когда я пишу пример кода, я пытаюсь использовать имена переменных, как в реальном коде (хотя функции могут получать бесполезные имена, такие как foo или bar).
  • См. Этимология "Foo"
3 голосов
/ 15 октября 2008

Какие правила вы используете для именования ваших переменных?

Как правило, поскольку я являюсь разработчиком C #, я следую соглашениям об именах переменных, как указано в Стандарт кодирования C # IDesign по двум причинам

1) Мне это нравится, и его легко читать. 2) По умолчанию используется надстройка Enforcer Code Style для Visual Studio 2005/2008 , которую я широко использую в настоящее время.

Где разрешены однобуквенные переменные?

Есть несколько мест, где я позволю переменные из одной буквы. Обычно это простые циклические индексаторы ИЛИ математические понятия, такие как координаты X, Y, Z. Кроме этого, никогда! (Везде, где я их использовал, они обычно меня кусали при перечитывании кода).

Сколько информации вы указали в названии?

Достаточно ТОЧНО знать, для чего используется переменная. Как говорит Роберт Мартин:

Имя переменной, функции или класс, должен ответить на все большие вопросы. Он должен сказать вам, почему это существует, чем занимается и как используемый. Если имя требует комментария, тогда имя не раскрывает его намерение. От Чистый код - Справочник по мастерству гибкого программного обеспечения

2 голосов
/ 06 ноября 2008

Я никогда не использую бессмысленные имена переменных, такие как foo или bar, если, конечно, код действительно не выбрасывается

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

for (int ii=0; ii < array.length; ii++)
{
    int element = array[ii];
    printf("%d", element);
}
1 голос
/ 15 октября 2008

Какие правила вы используете для именования ваших переменных? Я переключился между подчеркиванием между словами (load_vars), верблюжьим регистром (loadVars) и без пробелов (loadvars). Классы всегда CamelCase, с большой буквы.

Где разрешены однобуквенные переменные? Циклы, в основном. Временные переменные в одноразовом коде.

Сколько информации вы вкладываете в имя? Достаточно, чтобы напомнить мне, что это такое, пока я пишу код. (Да, это может привести к проблемам позже!)

каковы ваши предпочтительные бессмысленные имена переменных? (после foo & bar) temp, res, r. На самом деле я не использую foo и не бью хорошую сумму.

1 голос
/ 15 октября 2008

Какие правила вы используете для именования ваших переменных?

  • Мне нужно понять это через год. Также должен соответствовать существующему стилю.

Где разрешено использование одной буквы?

  • ультра-очевидные вещи. Например. символ с; c = getc (); Показывает петли (i, j, k).

Как много информации вы указали в имени?

  • Много и много.

как насчет, например, кода?

  • То же, что и выше.

каковы ваши предпочтительные бессмысленные имена переменных? (после foo & bar)

  • Мне не нравится иметь бессмысленные имена переменных. Если переменная ничего не значит, почему она в моем коде?

почему они пишутся "foo" и "bar", а не FUBAR

  • Традиция.
...