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

softwareengineering.stackexchange https://softwareengineering.stackexchange.com/questions/1090

  •  16-10-2019
  •  | 
  •  

Вопрос

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

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

В C#:

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

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

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

Но, очевидно, намного более многослов.

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

Это было полезно?

Решение

Оба.

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

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

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

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");

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

Другие советы

В то время как оба являются хорошими целями, я всегда на стороне Читаемость Когда вынуждены выбрать один.

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

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();

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

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

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

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

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

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

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

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

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

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

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

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

ПРИМЕЧАНИЕ: вышеперечисленное не о вас лично, @Damovisa; Это для всех, кто выбирает между двумя позициями.

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

У него больше строк, и большинство отладчиков ориентирован на линию! Очень сложно установить точку разрыва в середине выражения, но обычно это тривиально просто установить его внутри оператора блока.

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

(Это сказано, что мне нравится оператор ??

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

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

Лицензировано под: CC-BY-SA с атрибуция
scroll top