Читаемость 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
по следующим причинам:
- Это сжато, сохраняет линии
- Это передает концепцию, что (a / b / c / d) инициализируются к тому же самому, что они связаны
Однако, будьте осторожны:
Не делайте этого, если a / b / c / d не связаны (и просто инициализируются 1). Вы уменьшите читабельность своего кода. Пример:
a=c=1; // Foo-function related
b=d=1; // Bar-function related
Подобные цепочки назначений в будущем уменьшают гибкость, присваиваемую переменным различным начальным значениям, потому что тогда вам придется разбивать их снова.
Тем не менее, моя личная рекомендация состоит в том, чтобы связывать назначения для переменных, которые связаны с концепцией / использованием. На практике необходимость изменить назначение обычно возникает не часто, поэтому предостережение № 2 обычно не должно вызывать проблем.
Изменить: моя рекомендация может идти вразрез с опубликованными руководящими принципами. Смотрите комментарии.
Я предпочитаю цепную версию, но это полностью вопрос предпочтений.
Обратите внимание, однако, что
a = b = c = 0;
эквивалентно:
c = 0;
b = c;
a = b;
и не
a = 0;
b = 0;
c = 0;
(не то чтобы вам было важно, какое назначение произойдет первым)
Я думаю, что это вопрос мнения, который наиболее читаем. (Очевидно, так... иначе вы бы не спрашивали.)
Однако в Oracle "Соглашения о коде для языка программирования Java TM" четко сказано использовать отдельные операторы присваивания:
10.4. Переменные. "Избегайте присвоения нескольким переменным одного и того же значения в одном выражении. Трудно читать".
Мое мнение?
- Следуйте предписанным / согласованным правилам стиля вашего проекта, даже если они вам не нравятся1.
- Если в вашем проекте (пока) нет предписанных / согласованных правил стиля:
- Попытайтесь убедить других участников принять наиболее широко используемые применимые правила стиля.
- Если вы не можете убедить их / прийти к консенсусу, просто сделайте это неформально для основных частей кода, который вы пишете для проекта1.
1 ... или уйди.