О стиле программирования: Переносить ли скобку?

Приходим в компании к единому стандарту программирования. Многие вещи обсудили, осталось решить вопрос с фигурной скобкой :)

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

Хотелось бы обсудить с вами, что правильней? При этом стоят цели не просто разработать программу, а чтобы в дальнейшем её было легко понимать (как самому разработчику, так и стороннему), расширять, рефакторить и т.д.

Как вы поступаете в своей компании, когда работаете в команде?

Ниже представлены два варианта одной и той же функции в качестве наглядного примера.

<?php
// вариант 1
function f1(a, b) {
	if (a == 0) {
		a *= f12() + f15(a);
		b = f2(1, b);
		if (b > 15) {
			f4(a);
			f5(b)
		}
		if (a > 17) 
			f86(a);
		return f6(a, b);
	}
	return f7(a, b);
}

// Вариант 2
function f1(a, b) 
{
	if (a == 0) 
	{
		a *= f12() + f15(a);
		b = f2(1, b);

		if (b > 15) 
		{
			f4(a);
			f5(b)
		}

		if (a > 17) 
			f86(a);

		return f6(a, b);
	}

	return f7(a, b);
}
?>
  • Вопрос задан
  • 12242 просмотра
Пригласить эксперта
Ответы на вопрос 19
cypok
@cypok
Нету «правильного» варианта, есть принятый в рамках данной группы разработчиков.
Ответ написан
TheHorse
@TheHorse
Еще недавно, там где я работаю, это зависело от языка и даже фреймворка (в случае наличия). Позавчера мне просто надоело видеть 2 разных варианта в пределах одного экрана, и теперь у нас везде применяется вариант с переносом.

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

P. S. За вариант без переноса в pascal-подобных языках просто убивать хочется:

var i : integer;
function rock(hard: boolean); begin
   for i := 1 to 10 do begin
       //do something
   end;
end;
Ответ написан
Stdit
@Stdit
Обратите внимание на стандарты кода PSR-2, Zend Framework, PEAR.
Ответ написан
Комментировать
@NotDefined
В пользу не переносить есть один хороший аргумент:

return {
val: 'text'
} — работает

return
{
val: 'text'
} — нет
Ответ написан
Комментировать
Colwin
@Colwin
Ведущий Java-разработчик
Практика показывает, что хорошо работает следующий способ (не панацея!):
— блоки if, for и т.д. выделяются пустыми строками перед и после блока
— скобки ставятся всегда, даже если тело — один оператор
— открывающая скобка не переносится на новую строку
— если описание оператора разносится на несколько строчек — упростить, чтобы влезало на одну строку, любыми видами рефакторинга

пример:

function f1(a, b) {
    if (a == 0) {
        a *= f12() + f15(a);
        b = f2(1, b);

        if (b > 15) {
            f4(a);
            f5(b)
        }

        if (a > 17) {
            f86(a);
        }

        return f6(a, b);
    }

    return f7(a, b);
}
Ответ написан
taliban
@taliban
php программист
Правильного варианта нет, есть такие варианты:
1. Есть уже куча готовых стилей, возьмите почитайте рекомендации к вашему языку/фреймверку используйте его
2. Киньте монетку
3. Проголосуйте и выберите большинством
4. Пусть самый опытный из вас выберет
Ответ написан
Комментировать
sdevalex
@sdevalex
У меня зависит от языка:
— в JS не переносит из-за большого количество callback-функций. Если переносить, то читаемость падает
— в Ruby скибки используются только для очень коротких блоков в одну строку
— в остальных переносить, чтобы четко видеть границы, которые выделяют скобки.
Ответ написан
debugger88
@debugger88
Java, не переносим.
Ответ написан
@iwitaly
У каждого свой стиль написания, кому как удобнее и как принято в команде. Я всегда скобку переношу на отдельную строку, для меня код становится гораздо более читабельным и удобным.
Ответ написан
Комментировать
megahertz
@megahertz
full stack разработчик
Переношу при объявлении класса/метода/функции, не переношу в остальных случаях. Отсановился на этом из-за того, что наиболее используемые мною фреймворки (Yii, ZF) используют данный подход.
Ответ написан
Комментировать
AR1ES
@AR1ES
Как сказали, правильных вариантов нет, но…
Хорошее объяснение дал Макконнелл, мнения которого я, кстати, и придерживаюсь.
Хорошо спроектированный язык имеет явную структуру блоков, которая приводит к естественному стилю отступов. Например VB:
If a= b Then
statement1;

End If
Т. е. для эмуляции явного блока можно делать так:
if (a == b) {
statement1;

}

Такой стиль позволяет показать логическую структуру кода.
Перенос скобки нарушает целостность блока, создавая видимость, что они не являются ни частью управляющей структуры, ни частью внутреннего блока.
Как альтернатива
Ответ написан
happyproff
@happyproff
Счастливый веб-разработчик
Пока работаю один, пишу так, что бы мой глаз радовался, с кучей пустых строк для читаемости и другими странностями. Но если речь о работе в команде, то лучше использовать популярный стандарт. Я выбирал бы PSR-2.
Ответ написан
Комментировать
Mithgol
@Mithgol
Не переношу открывающую скобку на новую строку никогда.
Ответ написан
Комментировать
Arktos
@Arktos
А я решаю в зависимости от IDE. Если IDE ставит автоматически за меня закрывающую скобку, то не переношу, а если не ставит, то переношу, так как в противном случае придется все время нажимать на клавишу end, а это не удобно. А читабельны для меня оба варианта
Ответ написан
andreysmind
@andreysmind
Пишем на Руби, таких проблем не испытываем.
Ответ написан
Комментировать
@JinnZest
Я когда-то давно девелопил на С++ и всегда переносил скобку. Не знаю почему, но практически все листинги, которые я тогда видел — были с переносами.

Сейчас, когда я девелоплю на джаве, все решилось проще. В большинстве IDE, при выборе автоформатирования, это происходит автоматически. Я не спорю, что это, по-идее, можно кастомизировать, но по дефолту везде 1й вариант. А так как каждый раз везде настравивать эту кастомизацию лень, то вопрос отпал сам собой.
Ответ написан
Комментировать
charon
@charon
не переношу. Кстати, в JS это не просто дело вкуса:
return {
  a: 5,
  b: 7
}

вернёт объект как положено,
а вот
return 
{
  a: 5,
  b: 7
}

просто завершит выполнение функции. Для удобства программиста интерпретатор сам подставит точку с запятой сразу после return
Ответ написан
Комментировать
metamorph
@metamorph
1TBS vs K&R vs…
en.wikipedia.org/wiki/Indent_style

Лично я предпочитаю K&R.

Станет скучно — не забудьте похоливарить на предмет tabs vs spaces.
Ответ написан
Комментировать
castasat
@castasat
Андроид-разработчик
Пишу на Java под Android, использую
Allman style, стандарт PSR-2
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы