пятница, 25 июня 2010 г.

Операторные скобки, египетские и не очень

У нас в проекте не существует Coding Style. Это конечно плохо, но тут вопрос программистского самосознания о том, что считать правильным, а что никогда не применять, потому что плохо.

Вот один из свежих конфликтов связан с операторными скобками для функций.

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

Проблема заключается в следующем:
1: void hello()
{
 printf("hello world\n");
}
Можно так:
2: void hello() {
 printf("hello world\n");
}
А можно даже так (только c++)
3: void hello() try {
 printf("hello world\n");
} catch(...) {
 ...
}

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

Но я отвлекся. Вернемся к вариантам 1 и 2. Я долгое время объяснял свою приверженность варианту 1 тем, что прототип функции - понятие достаточно растяжимое, чтобы захламлять эту строку вещами, к ней не относящимися. Так же я поступаю например с блоками if, в том случае если условие достаточно сложное и скобка после условия не достаточно видна.

Но недавно меня осенило очень простое объяснение. Суть в том, что void hello() - это прототип, а { printf("hello world\n"); } - это тело. Если прототип у нас находится отдельно от тела - мы легко можем скопировать строку и вставить ее во включаемый файл. Нам будет необходимо лишь добавить точку с запятой. Если же мы будем захламлять строку прототипа дополнительными конструкциями типа 'try' и '{', то мы лишимся такой удобной возможности просто скопировать в случае, например, изменения списка параметров.

Остается еще захламление строки прототипа неймспейсами и именами классов, но тут уж ничего не поделаешь. Надо с этим как-то жить.

Мой кодинг стайл: обычные скобки для функций, египетские для логики.

8 коммент.:

jazzcat комментирует...

Удивительно. Эта вещь не вызывает холиваров как правило, но приверженцы разных способов расстановки скобок просто тихо люто друг друга ненавидят.

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

Первый вариант имеет другое мощное преимущество - такой код просто легче читается.

Андрей Валяев комментирует...

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

void
hello(void) try {
...
} catch...

Тип на отдельной строке меня тоже раздражает... Не место ему там, Мы же никогда не пишем:

int
i;

Изврат ведь...

Хотя сам с удовольствием ставлю на отдельной строке более отстраненные модификаторы - типа static, inline и тд...

Первый вариант легче читается, потому что информационная плотность на строку кода ниже. Но количество функционала функции от этого никак не снижается... Меньше кода - ИМХО более предпочтительный вариант.

Alex-Rude комментирует...

Сначала пользовался первым вариантом когда программировал на C++ в VS6.
С переходом на Java и среды NetBeans и JIdea начал использовать второй вариант.
Потом некоторое время использовал C# в VS2008, которая автоматически правит код согласно первому варианту. Ковыряться в настройках было лень и я перестал сражаться со средой.
И вот я снова в Java и снова 2-ой вариант. Адаптация - залог эволюции.

Но все не так радужно. Если говорить об оппонентах, то мой напарник предпочитает не использовать табуляцию, отмеривая уровень вложенности судорожными нажатиями пробела. По факту, даже когда IDE размещает курсор куда надо, он жмёт Backspace и пробелит в своё удовольствие. Приходится автоформатить совместные классы.

Андрей Валяев комментирует...

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

Вот за это я вообще не люблю отступы пробелами. Даже 4 пробела (python) это значительно больше судорожных нажатий, чем одна табуляция.

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

Alex-Rude комментирует...

>К тому же отображаемый размер табуляции можно регулировать.

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

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

или вот, там же

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

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

P.S. Помню, где-то в блоггере была настройка, чтобы на главной странице отображалось только начало, а не всё сообщение целиком. Вот только найти не могу...

Андрей Валяев комментирует...

Просто надо култивировать стандартное использование табуляций. :)


2Alex-Rude: Ты про подкат?

Раньше приходилось какие-то жуткие скрипты добавлять в темплейт, но сейчас берешь стандартный темплейт и в режиме html добавляешь в нужном месте тег <!-- more -->

Alex-Rude комментирует...

Спасибо, помогло. Значительно сократил размер главной страницы.
У меня последнее время плохо получается коротко писать. Дуратская университетская привычка разбавлять водой.

tvolf комментирует...

Тоже, почему-то, практикую вариант скобок N2. Как-то изначально к нему прикипел.