Чи слід, якщо / інші заяви упорядковуються рідкісністю випадків або труднощами їх вирішення?


18

У якомусь коді я зараз пишу, у мене є щось подібне:

if (uncommon_condition) {
    do_something_simple();
} else {
    do();
    something();
    long();
    and();
    complicated();
}

Частина мене думає: "Це добре, як це написано. Прості справи повинні йти першими, а складніші справи - далі". Але інша частина говорить: "Ні! elseКод повинен підпадати під дію if, тому що ifце стосується незвичайних справ і elseстосується всіх інших справ". Що є правильним чи кращим?


4
Порядок простотою / зрозумілістю умов! Про решту можуть подбати оптимізатори, гілки прогнозування та рефакторинг.
Мар'ян Венема

Ось чому нам платять великі гроші: приймати ці важкі рішення.

Відповіді:


24

Наказ за їх вірогідністю буде виконаний. Найпоширеніша, найімовірніша, та ін. Умова (і) має бути першою.

"Труднощі поводження з ними" повинні вирішуватися структурою коду, абстрагуванням тощо. У прикладі інший блок може бути відновлений до виклику одного методу. Ви хочете, щоб ваші ifпропозиції були на тому ж абстрактному рівні.

if ( ! LotteryWinner ) {
    GoToWorkMonday();
} else {
    PlanYearLongVacation();
}

6
Для виконання я можу погодитися. Але знову ж таки, більшість оптимізаторів та передбачувачів галузей цілком здатні подбати про це. Щодо читабельності, я можу погодитися, якщо найімовірніший випадок має значно більше рядків, ніж менш вірогідний випадок. Але мені це швидше вкаже на необхідність вилучення методу, ніж використання а not. Особисто я б зосередився на униканні notумов. Було доведено, що вони викликають більше когнітивного навантаження для розуміння, ніж "позитивні" умови, і шкодять читабельності / зрозумілості коду. Я схильний використовувати їх лише в заявах охорони.
Мар'ян Венема

2
@MarjanVenema, я можу побачити вашу думку про "не" ing. Але подвійний мінус - справжній WTF "не". Днями я зіткнувся з цим у нашому коді doesNotAllowxxFiles = false. Досить погано, але тоді зробіть цеif(! doesNotAllowxxFiles)
radarbob

Так, подвійні негативи, негативи в поєднанні з та і / або або (sic!) Та негативи, поєднані методом / var із "Не в назві", щоразу перетворюють мій мозок :-)
Мар'ян Венема

якщо у вас виникають проблеми з розумінням того, що відбувається, я думаю, що часто корисно робити такі речі, як: simpleBool = (! (complexBool || randomfFlag)) &&! randomFlag
TruthOf42

2
Я погодився б з вами, за винятком існування Застереження про охорону (які завжди мають виняткову умову в ТОТІЙ частині твердження IF, а не загальну умову).
Роберт Харві

5

Спробуйте підвищити читабельність. Один із способів - розмістити довший блок коду в іншій частині.

if (s == null)
     // short code
else 
     // long 
     // code
     // block

читабельніше, ніж

if (s != null)
    // long
    // code
    // block
else
    // short code

2
чому це читабельніше? Я не бачу різниці між ними в плані читабельності
Джон Деметріу

2
@JohnDemetriou Else видніше, якщо тоді короткий. Люди спочатку сканують структуру, а потім присвоюють їй значення. Код без Else відрізняється від коду з кодом, тому зробіть Else більш видимим - зрозумілішим. (За інших рівних умов, у вівторок, коли не йде дощ тощо)

4

Жодного фіксованого правила як такого я не чув про використання, але я дотримуюся цього

if(usual)
{
(more often)
}
else (unusual)
{
(rarely occurring)
}

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


if(x == 0)  // 1
  {x = 1;}  // 2
else
  {x = 2;}  // 3

Для наведеного вище коду складання коду буде приблизно таким:

1. 000d 837DFC00        cmpl    $0, -4(%ebp)
   0011 7509            jne .L2

2. 0013 C745FC01        movl    $1, -4(%ebp)
   001a EB07            jmp .L3

    .L2:
3.001c C745FC02         movl    $2, -4(%ebp)

        .L3:

Якщо умова всередині if є істинним, тоді потік становить 1-> 2 (4 втручання)
Якщо стан всередині if false, то потік 1-> 3 (3 втручання)

Тож краще розмістити незвичні або рідко трапляються події, якщо частина та нормальний стан в іншому випадку, щоб ми могли кожен раз зберігати одну інструкцію ;-)


2

Я виявив, що саме протилежна закономірність призводить до більш легкого для читання коду, а також зменшує або усуває вкладені, якщо заяви. Я позначаю це як «рукавичку». (Розповідаючи історію, рукавиця - це низка завдань, які повинні бути успішно вирішені до завершення остаточного завдання.) Спочатку обробляючи ваші крайові справи , ви дозволяєте основній частині коду бути чистою та стислою:

if(gauntlet_1){ handle the first gauntlet condition }; 
if(gauntlet_2){ handle the second gauntlet condition };
...
// All preconditions (gauntlets) have been successfully handled

// Perform your main task here

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

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

0

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


-1

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


-1

Що стосується таких сценаріїв, то для цього немає правила великого пальця. Але, можливо, ми можемо слідувати, щоб записати позитивний чи найімовірніший код у блоці if та залишити у блоці else або у випадках за замовчуванням.


це не пропонує нічого, що вже було пояснено у попередніх відповідях - programer.stackexchange.com/a/223093/31260 та programer.stackexchange.com/a/223520/31260
gnat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.