Найбільш читаний спосіб форматування довгого, якщо умови? [зачинено]


43

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

if (FoobarBaz::quxQuux(corge, grault) || !garply(waldo) || fred(plugh) !== xyzzy) {
    thud();
}

або

if (
    FoobarBaz::quxQuux(corge, grault)
 || !garply(waldo)
 || fred(plugh) !== xyzzy
) {
    thud();
}

або

if (FoobarBaz::quxQuux(corge, grault)
    || !garply(waldo)
    || fred(plugh) !== xyzzy) {
    thud();
}

або

thudable = FoobarBaz::quxQuux(corge, grault);
thudable ||= !garply(waldo);
thudable ||= fred(plugh) !== xyzzy;

if (thudable) {
    thud();
}

чи будь-які інші уподобання?

Відповіді:


30

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

if (bar || baz || quux) { ... }

Тому що ти можеш сказати, що відбувається з одним рядком. Однак я б швидше скоїв щось подібне, коли це можливо:

function foo() {
  return bar || baz || quux;
}

if (foo()) { ... }

3
прокручування в бік проти вертикалі - це майже не обмеження, яке було в погані старі часи ...
Білл

2
і дайте функції (діловому) ім'я значущому, щоб люди зрозуміли, що тут перевірено.
Матьє М.

19

Мені подобається тримати операторів в кінці, щоб вказати на продовження:

if (the_function_being_called() != RETURNCODE_SUCCESS &&
    the_possibly_useful_recovery_strategy() == RETURNCODE_EPICFAIL &&
    this_user_has_elected_to_recieve_error_reports)
{
    report_error();
}

1
Я думаю, що мені це подобається. Я використовую багато дужок, щоб переконатися, що я також можу зрозуміти порядок пріоритетності.
Jasarien

5
Я вважаю за краще поставити логічні оператори на початок рядка, так що, читаючи рядок, я можу легко побачити, що він є частиною умовного, а не просто звичайного рядка коду.

11

Я великий фанат значущих імен змінних:

const bool isInAStrangeCondition =
    FoobarBaz::quxQuux(corge, grault) ||
    !garply(waldo) ||
    fred(plugh) !== xyzzy;

if (isInAStrangeCondition) {
    thud();
}

Або рефактор як функція, як згадувалося вище.


7

Я розбиваю медьє супрекспресії, або всі вони, як змінні bool. Тоді булева логіка висловлювання "якщо" верхнього рівня може бути зрозумілою. У роботі, яку я роблю, це не завжди декілька речей ORED або ANDed.

bool goodblah = some_mess < whatever;
bool frobnacious = messy_crud != junky_expression;
bool yetanother = long_winded_condition;

if (goodblah || (frobnacious && yetanother))   {
    ...
}

Це особливо добре в налагоджувальній машині, де я можу переглянути всі булі, перш ніж виконати "якщо".


Це мені також подобається, але ви втрачаєте одну перевагу: більше не можна проводити коротке замикання дорогих порівнянь.

... І вам потрібно бути дуже добрим у називанні тонни змінних протягом усіх днів ...
cronvel

6

Я схильний вирівнювати операторів на початку нових рядків, тому пам’ятаю, як я поєдную терміни (як для довгої логіки, так і для довгої арифметики). Подобається це:

if (first_attempt(data) == SUCCESS
    || (reusable(data) && second_attempt(data) == SUCCESS)
    || (still_reusable(data) && third_attempt(data) == SUCCESS))
  return SUCCESS;

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


0

Я фанат наступного:

if (really_long_expression && another_really_really_long_expression && 
            another_very_long_expression_OMG_id_it_long){
    bugs();
}

Таким чином, вона все ще виглядає як вираз if, а не розбита на частини, якщо вираз. Відступ допомагає показати, що це продовження попереднього рядка.

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


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