Комментарии 55
тогда другие разработчики будут форматировать ваш код десятилетиями

Один хоткей в решарпере, он по дефолту именно так и выравнивает linq по точкам.


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

То же самое и здесь: тот же хоткей, который просто въедается в автоматизм.


Время ценно, тратить время разработчиков на то, чтобы вручную форматировать код — в 2020 году это нонсенс.

Хоткей не нужен. Автоформатирование должно происходить при сохранении.

Ага, а потом в одной репе встречаются два разработчика с разными настройками форматирования, и...


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

Конфиг автоформаттера должен хранится в той же самой репе.
У нас, например, .clang-format лежит в корне.

Откуда они там встречаются? Ревьювер должен дать по шапке тому, кто отключил гитхуки при коммите и залил фигню.


Все настройки форматирования и линтеров в проекте лежать должны.

В идеале код вообще может автоформатироваться под каждого разработчика.

В идеале прямо в глазах. А пока такого нет, лучше содержать код в одном стиле, чтобы при ревью или парном программировании никого не смущать.
Ещё весело бывает, когда кто-то заботливо добавлял пробелы чтобы получить табличное форматирование

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

Если вам понадобилось менять такой код — вам, скорее всего, всё равно понадобится менять все строки сразу.

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

Ну формула, ну и что? Если там есть присваивание переменной с по сути произвольным именем, то опять таки получится фигня.
Обычно я вижу такое форматирование в местах подобным этому:
$var     = $x * 2;
$varName = $x * 3;

И если тут переименовать вторую переменную, то придётся править и первую строку. А таких присвоений может быть десяток.
А про какие случаи вы говорите?
Ну, я в своей работе с подобным не сталкиваюсь. Ну разве что.

Redundand else детектед:


if (isValid) 
{ 
    _unitOfWork.Save();
    return true; 
} 
else 
{ 
    return false; 
} 

Лучше, т.к. экономит горизонтальное пространство для блока else:


if (isValid) 
{ 
    _unitOfWork.Save();
    return true; 
}

return false; 

Хороший вариант, особенно когда есть понимание, что ничего больше в блоках добавляться не будет. Версия которую я предложил — та что решарпер подсказывает с включенной Redundand else

Это в любом случае хороший вариант. А если в будущем в блоках нужно будет что-то добавлять — то тогда в будущем и будет изменена схема с if-else-return блоками.

Должны быть так
return (isValid)? _unitOfWork.Save(): false;
Функция должна вернуть результат своей работы. Иначе это лотерея.

Не делайте так. Даже асм читабельнее.
Впрочем, C++ уверенно развивает традиции.
80 символов в строке – это рекомендуемый стандарт на текущий момент.

На какой момент? На 1985г?
Лично у меня влезает 360 символов на экран. Открываю 2-3 исходника.

var result =
(condition1 && condition2) ||
condition3 ||
(condition4 && condition5);

Предполагается что это хороший стиль? Это нечитабельное месиво.
Напротив, «неправильный» пример аккуратный и читабельный.

Лично у меня влезает 360 символов на экран.
Во-первых, это лично у вас. Во-вторых, влезать может хоть 500, читать-то это как?

(сарказм)


Легко! Берете 2 экрана и сравниваете


Но пока я не придумал, что делать с разработчиками, у которых 2 экрана, поэтому они пишут код в 720 символов сразу
Всё-таки 4 монитора для этого понадобится


(сарказм офф)


Мне кажется основная проблема длинного текста не в том, что он на экран не влезает, а в том, что куча всего смешивается в одну строку и это становится трудночитаемым. Например, пример 2 из статьи, если это всё смешать в одну строчку, читать становится гораздо труднее (даже если это поместится на экран)

Можно просто уменьшить шрифт в 2 раза! Можно прямо в статью вынести.
Не отстаивая именно 80, замечу, что при мерже на экране бывают сразу три версии файла. И три по 80 — это уже 240. А так мне тоже кажется, что при нынешних мониторах допустимо поднять это ограничение до 120 символов.
80 символов в строке – это рекомендуемый стандарт на текущий момент. Это позволяет вам держать концентрацию разработчика, когда он читает ваш код. Более того, вы можете открыть два документа одновременно на одном экране когда это нужно, и у вас останется место для обозревателя решений.

да хватит уже тыкать палкой этот стандарт времен DOS-а. что хорошего рубить логику в лапшу. из-за подобных стандартов, чтобы не разбивать строки, люди начинают сокращать идентификаторы, превращая исходники в ребус. если уж нужно открыть 2 документа, то можно включить перенос строк или разбить экран по горизонтали.
120-130 символов норм.

линус — мужик!
но я так так и не понял, с какого потолка они взяли цифру 100.

Я думаю — просто магия ровных цифр

для программистов ровная цифра — это 128 :)


https://github.com/airbnb/javascript

какой веселый кодстайл, не рекомендует начинать имена свойств с подчеркивания

Вы им только не говорите, что сейчас можно еще подключать несколько мониторов.

Это не времена DOS-а. Это гораздо древнее. Ещё перфокарты были по 80 колонок. Этакое физическое ограничение длины строки.

Пример №2 лучше писать так:
var result = 
    (condition1 && condition2)
    || condition3
    || (condition4 && condition5)
;

Оно и читается легко и при изменении в diff попадёт адекватный лог. Добавив или удалив условие мы в diff-е получим меньше мусора.

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

С этим вариантом одно плохо: не для всех языков подходит(замечу, что тэга С/С++ у статьи нет, значит она про все языки). А именно для языков, которые считают, что точка с запятой не нужна. Вот, скажем, для Go такой вариант будет как раз вредным советом, ибо компилятор тут же выкинет нечто вроде(Go не понимает тут, где строка кончается):

./prog.go:10:10: syntax error: unexpected ||, expecting }

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

var result = 
    (condition1 && condition2) || 
    condition3 || 
    (condition4 && condition5);

я бы разбил так:


var result =  condition3 
          || (condition1 && condition2) 
          || (condition4 && condition5);

Логический оператор в начале строки лучше читается

Только вот переставлять условия местами я бы не стал:


var result = (condition1 && condition2)
     || condition3
     || (condition4 && condition5);

Вдруг это хитрые свойства с побочными действиями?

Наверное, это дело вкуса.
В идеальном мире в первой строчке должно быть самое важное условие, а чистокод-нации вообще скажет что нужно уменьшить количество условий, так как это затрудняет понимание (и в чем-то будет прав).

В performance-critical коде первыми поставили бы наиболее быстро проверяемые условия (например, проверить булевские значения), а в конец — более медленные (например, сравнение строк), так что универсального подхода тут нет.

Переставлять условия вообще нельзя: если значение логического выражения определяется уже по значению первого операнда (true для ||, false для &&), то второй операнд не вычисляется вообще (по крайней мере, в C#, на котором написаны примеры, это однозначно так). То есть, действует правило неполного вычисления, и в C# им пользуются весьма часто — например, сначала идет проверка ссылки на объект на !=null, а потом, через && — проверка значения поля или свойства (да, про операцию ?. я в курсе, но она появилась не так давно, много кода было написано до того).
Для Go только первый вариант рабочий. Так что, сначала надо определиться с языком, а потом уже переформатировать :)
Ещё один вредный совет:
Если вы пишете под Android, используйте m для префиксов членов класса, например mIsValid, ведь сразу становится понятно, что это field, а не variable /s
На самом деле, это «m» — просто жесть. Пошло оно с тех времён, когда core команда не могла нормально использовать IDE, поскольку Eclipse не осиливал загрузить такой большой объём кода в себя. Потом пришла IDEA/Android Studio, которая уже нормально осиливала, но ретрограды из гугла, которые могут в уме инвертировать бинарное дерево не осилили уже саму IDE, и поэтому пишут вот в таком стиле до сих пор.
А самое печальное — что они же пишут доки, откуда этот «m» разносится по проектам 3rd-party разработчиков, которые понятия не имеют, зачем оно нужно, но тупо копипастят, потому что ж «гугол решил, а там не дураки работают».

P.S. Те, кому до сих пор кажется, что «там не дураки работают» — посмотрите внимательно код AOSP Launcher, такое ощущение, что туда как в Спарте сбрасывают самых слабых разработчиков. А это, по сути, Core Android.

Это и других языков касается. Меня очень увидило, когда я установил Rider, и он начал ругаться, что у меня имена полей не соответствуют кодстайлу по умолчанию. По его мнению, все поля должны начинаться с "_". Зачем?

Способ форматирования фигурных скобок в определениях функций, который мне очень нравится, но я никогда его не использую.
Smth foo(int par)
{   some code
    more code
    return smth;
}
Smth bar(int par)
{   some code
    more code
    return smth;
}
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.