Ви віддаєте перевагу стислість чи читабельність у своєму коді? [зачинено]


21

Язики для мов часто можна використовувати, щоб зробити код більш стислим.

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

В C #:

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

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

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

але очевидно набагато більше багатослівного.

Де ви проводите лінію, коли мова йде про стислість та читаність?


3
Це суб'єктивне запитання, хтось, хто щось реалізував, сказав би, що його спосіб має сенс, хтось, хто читає це, сказав би, що це не має сенсу, а інша людина, яка читає це, сказала б, що я це отримую, але я віддаю перевагу іншому. Це лише перевага.
Кріс

20
Я думаю, що друга версія є більш читаною.
Вайбхав

2
Ви плутаєте лаконічність з терміновістю. Стислість покращує читабельність. Терзистість применшує це.
Ferruccio

1
@ ThorbjørnRavnAndersen: Аудиторія для коду C # зазвичай "розробники з фоном C #". З того, що я бачив, схожа думка на programmers.se полягає в тому, що ви не повинні уникати використання корисних мовних функцій лише тому, що хтось може не бути ними знайомий. (Див. Також: programmers.stackexchange.com/q/101513/33843. )
Heinzi

1
дублікат ?: programmers.stackexchange.com/q/58630/15464 .. О, цей старший. :)
Стівен Євріс

Відповіді:


63

І те й інше.

Ваш перший приклад, безумовно, більш багатослівний і, можливо, більш чіткий ... але він також вимагає від мене сканувати п'ять рядків замість одного. Гірше, що вона визначає свою мету - присвоєння значення 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");

Останній приклад знову набагато коротший, але тепер він затьмарює своє призначення, роблячи завдання, викликані тим самим тестом, виразними. Тут я відчуваю, що багатослівність колишнього виправдана.


3
Відмінна відповідь! - Мова йде не про багатослівність, а про мету.
Дамовіса

2
@Damovisa: саме - мета коду - спілкування, і немає загальної причини, чому це не слід робити максимально стисло (але не більше).
Shog9

1
Навчання оператора нульового згортання займе більше секунди - але якщо ви цього не знаєте, то вам слід це навчитися!
Casebash

2
Ах "??" було б добре на Java.

Незважаючи на те, що останній приклад коротший за кодом, він насправді оцінює boss3 рази, а не лише один раз у дослідному прикладі. Це лише ще одна причина, чому коротший код лише заради скорочення - погана ідея. Я думаю, що стислість повинна бути другою основною метою, чи це читабельність / ремонтопридатність (для складного коду) чи ефективність (для критичних ділянок внутрішніх циклів тощо). Іншими словами, ніколи не оптимізуйте чисто для стиснення - якщо тільки ви не плануєте відправляти свій код через з'єднання 1bps;)
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();

Останнє є стислим, але його важко читати. Перший є багатослівним, але потік логіки зрозумілий.

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


11
Правильне форматування може легко підвищити читабельність другого прикладу. Це несправедливе порівняння. Коли я відформатований таким чином , я зовсім не впевнений, що це так погано.
Стівен Євріс

Зразки коду не еквівалентні. Перший відсутній ?? whatever.something.
Джон Б. Ламбе

11

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

Стислість та читаність - це не протилежності. Як і ця відповідь, іноді коротша є легшою для читання.


4
+1 за те, що не припускав браку знань іншого програміста. У наведеному прикладі другий варіант є менш читабельним лише у тому випадку, якщо ви не знайомі з оператором зведення нуля. Я б ніколи не писав свій код, виходячи з припущення, що мої співробітники не знають синтаксису мови. Навіть якщо вони не знали, що ??означає, якщо я використовую його, а потім вони навчаються, ми обидва отримали користь. І це не так, як важко набрати "?? оператора" на msdn.com
Тім Гудман

4

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

В основному, якщо це важко зрозуміти, не робіть цього.


3

Читання стає спочатку там, де воно суперечить стислість, оскільки код змінюється частіше, ніж спочатку написано. З іншої сторони:

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

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


2

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

Якщо все, що вам дуже важливо, - це безпека роботи, будьте впевнені у стислість та компактність у всьому іншому. Пропустіть і коментувати свій код.

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

Примітка: вище сказане не стосується вас особисто, @Damovisa; це для тих, хто обирає між двома позиціями.


Це звучить як безпека роботи, але якщо ви хочете бути програмістом, це безпека роботи в неправильній компанії ...;)
Alois Mahdal

2

Є одне, що багатослівна версія має перевагу.

У ньому більше ліній, і більшість налагоджувачів орієнтовані на лінійку ! Встановити крапку в середині виразу дуже важко, але встановити її всередині оператора блоку зазвичай буває просто.

Іншими словами, кого б ви хотіли бачити у своєму редакторі, якщо ви хочете, щоб ваш налагоджувач запускався коли boss == null?

(Це сказав, що мені подобається ?? - оператор)


0

Читання має бути першим: довгострокова більшість людей витрачає більшість часу на зміну чи розширення існуючого коду - читабельність є великою частиною ремонтопридатності.

Однак, стислість - це те, що може сприяти читанню. Наприклад, у вашому запитанні другий фрагмент є і більш читабельним, і більш стислим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.