Вы предпочитаете краткость или удобочитаемость в вашем коде? [закрыто]

21

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

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

В C #:

Person newGuy = new Person();
if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
} else {
    newGuy.Boss = boss;
}

функционально эквивалентно:

Person newGuy = new Person();
newGuy.Boss = boss ?? GetDefaultBoss();

но, очевидно, гораздо более многословный.

Где вы проводите черту, когда речь идет о краткости и читабельности?

Damovisa
источник
3
Это субъективный вопрос, кто-то, кто реализовал что-то, сказал бы, что его путь имеет смысл, кто-то, читающий это, сказал бы, что это не имеет смысла, и другой человек, читающий это, сказал бы, что я понимаю, но я предпочитаю другой путь. Это просто предпочтение.
Крис
20
Я думаю, что вторая версия более читабельна.
Вайбхав
2
Вы путаете краткость с краткостью. Краткость улучшает читаемость. Краткость умаляет это.
Ферруччо
1
@ ThorbjørnRavnAndersen: Аудитория для кода C # обычно "разработчики с фоном C #". Из того, что я видел, консенсус на сайте programmers.se, похоже, заключается в том, что вам не следует избегать использования полезных языковых функций только потому, что кто-то может с ними не знаком. (См. Также: programmers.stackexchange.com/q/101513/33843. )
Хайнци
1
дубликаты ?: programmers.stackexchange.com/q/58630/15464 .. О, этот старше. :)
Стивен Джеурис

Ответы:

63

И то и другое.

Ваш первый пример, безусловно, более многословен и, возможно, более явен ... но он также требует от меня сканирования пяти строк вместо одной. Хуже того, он лишает своей цели назначение - присваивать значение newGuy.Boss.

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

Теперь сопоставьте это:

if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
    newGuy.IsTemp = true;
    newGuy.AddTask("orientation");
} else {
    newGuy.Boss = boss;
    newGuy.IsTemp = false;
}

...с:

newGuy.Boss = boss ?? GetDefaultBoss();
newGuy.IsTemp = boss == null;
if ( boss == null ) newGuy.AddTask("orientation");

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

Shog9
источник
3
Отличный ответ! - Речь идет не о многословии, а о цели.
Дамовиза
2
@Damovisa: точно - целью кода является общение, и нет никаких общих причин, почему это не должно быть сделано максимально кратко (но не более).
Shog9
1
Изучение нулевого оператора слияния займет больше секунды - но если вы этого не знаете, то вы должны изучить это!
Casebash
2
Ах "??" было бы хорошо в Java.
Хотя последний пример короче с точки зрения кода, он фактически оценивается в boss3 раза, а не только один раз в подробном примере. Это просто еще одна причина, почему более короткий код просто ради того, чтобы быть короче, плохая идея. Я думаю, что краткость должна быть второй после основной цели, будь то удобочитаемость / ремонтопригодность (для сложного кода) или производительность (для критических секций внутренних циклов и т. Д.). Другими словами, никогда не оптимизируйте исключительно для краткости - если только вы не планируете отправлять свой код по соединению 1 бит / с;)
user193130
16

Хотя обе цели - хорошие цели, я всегда буду на стороне читабельности, когда буду вынужден выбирать одну.

Я бы сказал, что ваш пример улучшает читабельность и краткость. Рассмотрим, однако:

if( a > b )
{
    foo = bar
}
else
{
    if( c.isThing() ){
        foo = somethingElse;
    }
    else{
        foo = someFurtherThing.GetFoo();
    }
}

в отличие от

foo = a > b ? bar ?? whatever.something : c.isThing() ? somethingElse : someFurtherThing.GetFoo();

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

В конечном счете, краткость не имеет большого значения, кроме способности умещаться на экране. Читаемость облегчает отладку, и поэтому обычно должна быть предпочтительной.

Fishtoaster
источник
11
Правильное форматирование может легко улучшить читаемость второго примера. Это несправедливое сравнение. Когда отформатирован так , я совсем не уверен, что это так плохо.
Стивен Джеурис
Примеры кода не эквивалентны: отсутствует первый ?? whatever.something.
Джон Б. Лэмб
11

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

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

Брайан Р. Бонди
источник
4
+1 за то, что не предполагал отсутствие знаний у другого программиста. В приведенном примере второй вариант менее читабелен, если вы не знакомы с оператором объединения нулей. Я бы никогда не написал свой код, исходя из предположения, что мои сотрудники не знают синтаксиса языка. Даже если бы они не знали, что ??значит, если я использую это, а потом они изучат это, мы оба получили пользу. И это не так, как трудно набрать «?? оператор» на msdn.com
Тим Гудман
4

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

В принципе, если это излишне сложно понять, не делайте этого.

Джордж Мариан
источник
3

Читаемость стоит на первом месте, когда она конфликтует с краткостью, потому что код модифицируется чаще, чем изначально написано. С другой стороны:

  1. Синтаксический шум и стандартный код часто скрывают намерения и, следовательно, ухудшают читабельность. Иногда более лаконичный код также более читабелен. Например, представьте лямбда-функции или функции делегатов / первого класса в сравнении с классами с одним методом, которые реализуют интерфейс с одним методом.

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

dsimcha
источник
2

Один аспект, о котором я не думаю, уже упоминался: каковы ваши цели?

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

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

Примечание: вышеизложенное не касается вас лично, @Damovisa; это для любого, выбирающего между двумя положениями.

Дори
источник
Это звучит как защита работы, но если вы хотите быть программистом, это защита работы не в той компании ...;)
Алоис Махдал
2

Есть одна вещь, у которой у многословной версии есть преимущество.

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

Другими словами, что бы вы хотели видеть в вашем редакторе, если хотите, чтобы ваш отладчик включился когда boss == null?

(Тем не менее, мне нравится оператор ?? -)


источник
0

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

Тем не менее, краткость это то, что может способствовать читабельности. Например, в вашем вопросе второй фрагмент является и более читабельным, и более кратким.

FinnNk
источник