Читаемость a=b=c или a=c; B = C;?

У меня есть класс, который имеет группу целых чисел, скажем,

foo()
{
  int a;
  int b;
  int c;
  int d;
  ....
  string s;
}

Теперь вопрос заключается в лучшей читаемости, функция init() для foo(), если она выглядит

void init()
{
  a=b=c=d=1; //for some reason they are init to 1;
  s = "abc";
}

или же

void init()
{
  a=1;
  b=1;
  c=1;
  d=1;
  s = "abc";
}

?

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

РЕДАКТИРОВАТЬ: до того, как этот вопрос зашел слишком далеко, цель этого вопроса была проста: в Effective C++, элемент 12 (предпочитайте инициализацию присваиванию в конструкторах), Скотт использует цепное присваивание вместо a=c; B = C; Я уверен, что он знает, когда что использовать, но я также вспомнил книги, которые я прочитал, также рекомендовал использовать int a; int b; который в аналогичном случае назначений. В моей программе у меня похожая ситуация с группой связанных отдельных встроенных типов, которые необходимо инициализировать, и я обнаружил, что выполнение цепного присваивания облегчает чтение, особенно если в классе есть много других переменных экземпляра различных типов. Кажется, это противоречит книгам, которые я читаю, и моей памяти, отсюда и вопрос.

3 ответа

Решение

Мое личное предпочтение a=b=c=d по следующим причинам:

  1. Это сжато, сохраняет линии
  2. Это передает концепцию, что (a / b / c / d) инициализируются к тому же самому, что они связаны

Однако, будьте осторожны:

  1. Не делайте этого, если a / b / c / d не связаны (и просто инициализируются 1). Вы уменьшите читабельность своего кода. Пример:

    a=c=1; // Foo-function related

    b=d=1; // Bar-function related

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

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

Изменить: моя рекомендация может идти вразрез с опубликованными руководящими принципами. Смотрите комментарии.

Я предпочитаю цепную версию, но это полностью вопрос предпочтений.

Обратите внимание, однако, что

a = b = c = 0;

эквивалентно:

c = 0;
b = c;
a = b;

и не

a = 0;
b = 0;
c = 0;

(не то чтобы вам было важно, какое назначение произойдет первым)

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

Однако в Oracle "Соглашения о коде для языка программирования Java TM" четко сказано использовать отдельные операторы присваивания:

10.4. Переменные. "Избегайте присвоения нескольким переменным одного и того же значения в одном выражении. Трудно читать".

Мое мнение?

  1. Следуйте предписанным / согласованным правилам стиля вашего проекта, даже если они вам не нравятся1.
  2. Если в вашем проекте (пока) нет предписанных / согласованных правил стиля:
    • Попытайтесь убедить других участников принять наиболее широко используемые применимые правила стиля.
    • Если вы не можете убедить их / прийти к консенсусу, просто сделайте это неформально для основных частей кода, который вы пишете для проекта1.

1 ... или уйди.

Другие вопросы по тегам