соглашение об именовании временных локальных переменных - PullRequest
2 голосов
/ 01 сентября 2009

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

Чтобы быть более конкретным:

struct  Foo
{
  double m_d;

};


void function (Foo* f)
{
   double tmp=f->m_d;

       /***Other stuff***/

     f->m_d=tmp;
}

Мне не нравится tmp . Если у меня их много в функции, они только добавляют путаницу.

Спасибо

Ответы [ 11 ]

20 голосов
/ 01 сентября 2009

Сделайте то же самое, что и для любой другой переменной: дайте ей краткое, выразительное имя. Как насчет использования оригинального имени переменной-члена, которую вы копируете (возможно, без m_)? Это лучший способ сделать связь между этими двумя явными.

5 голосов
/ 01 сентября 2009

Линус Торвальдс - Стиль кодирования ядра Linux от Линуса Торвальдса :

ЛОКАЛЬНЫЕ имена переменных должны быть короткими и точными. Если у вас есть какой-нибудь случайный счетчик целочисленных циклов, его, вероятно, следует назвать «i». Называть его «loop_counter» непродуктивно, если нет шансов на это быть неправильно понятым. Точно так же, «tmp» может быть примерно любого типа переменная, которая используется для хранения временного значения.

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

3 голосов
/ 01 сентября 2009

Что вы храните в переменной tmp? Используйте это описание в качестве имени переменной, если оно не слишком длинное. Для трехстрочных функций (swap…) tmp вполне подойдет. Для почти всего остального, будь описательным.

2 голосов
/ 01 сентября 2009

Для вашей информации: Code Complete имеет главу, посвященную именованию переменных.

В вашем примере одна проблема состоит в том, что переменная-член в Foo не очень описательна для начала, что затрудняет поиск полезного имени для локальной переменной-заполнителя.

Например, я бы сделал что-то вроде этого:

struct Foo
{
  double mValue; // I don't use underscores here
                 // however, you can do as you please.
                 // Also 'mValue' is just for the sake of example,
                 // you should find a more descriptive name :D

};


void function (Foo* f)
{
   double oldValue = f->mValue;

       /***Other stuff***/

   f->mValue = oldValue;
}
2 голосов
/ 01 сентября 2009

Я бы назвал это saved_m_d, или просто m_d (но тогда я бы также дал m_d другое имя).

1 голос
/ 01 сентября 2009

Если их нельзя описать более описательно, мы практикуем на работе то, что вместо лучшего имени мы используем имя «мой [объект]» Прежде всего, сделайте его описательным, чтобы ваш код был легче понять и поддерживать. Самодокументируемый код - еще одно преимущество этого.

0 голосов
/ 25 июня 2011

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

struct  Foo
{
  double m_d;

};


void function (Foo* f)
{
   double m_d_tmp = f->m_d;

       /***Other stuff***/

     f->m_d = m_d_tmp;
}
0 голосов
/ 02 сентября 2009

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

Итак, если предположить, что «d» на самом деле представляет какое-то имя, которое уже описывает значение вашей переменной, то я бы выбрал что-то вроде cached_d или copied_d. Таким образом, вы можете иметь больше (cached_a, cached_b, cached_c и т. Д.) Без путаницы между ними.

И затем я бы предложил добавить комментарий, в котором конкретно указано, почему вы сделали эту локальную копию. Возможно что-то вроде:

double cached_d = f->m_d;   // cached to avoid further de-referencing

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

0 голосов
/ 01 сентября 2009

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

Несколько IDE будут использовать Подсветку кода, что удобно, если вам необходимо знать, является ли что-то классом или переменной. Таким образом, я не делаю много различий между именами классов и именами атрибутов. (За исключением Delphi, где я по-прежнему префикс каждого класса с буквой T, поскольку это стандартное соглашение в Delphi.)

И нет, я не использую tmp. Я пишу это как Временное, на случай, если я не смогу придумать другое имя. Или я, J, K, L или M в случае индексов. (Нет, только эти 5 букв, всегда в верхнем регистре.) В вашем случае я бы использовал вместо этого "oldvalue" или "oldm_d".

0 голосов
/ 01 сентября 2009

Есть некоторые «часто используемые сокращения», такие как i, j и m и n для циклов, но если в функции будет много циклов, вероятно, лучше иметь что-то более выразительное.

Я бы использовал правила для правильного именования переменных в большинстве случаев. Если вы делаете C ++, я думаю, что вопрос «как я буду дифференцировать переменные-члены» вместо локальных переменных.

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