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

Одной из альтернатив является использование foldLeft и addHeader :

val req: HttpRequest = ???
val hs: Seq[HttpHeader] = Seq(RawHeader("a", "b"))

hs.foldLeft(req)((r, h) => r.addHeader(h))

8
задан Nick Allen 13 April 2009 в 23:02
поделиться

10 ответов

Я не думаю, что переписывать if-операторы двумя способами, особенно если учесть, что добавление else предложение в ваших примерах дает разные результаты. Если бы я хотел уменьшить количество атомарных высказываний в условии, я бы выделил некоторые, имеющие смысл, вместе в свою собственную функцию, например:

if(won_jackpot(obj)) ...
10
ответ дан 3 November 2019 в 12:50
поделиться

Я думаю, что это баланс различных типов операторов и правильное форматирование. Если все операторы одинаковы (все "и" или все "или"), то вы, вероятно, можете объединить неопределенное количество выражений без потери понимания:

if (something() &&
    something_else() &&
    so_on() &&
    so_forth() &&
    some_more_stuff() &&
    yada() &&
    yada() &&
    yada() &&
    newman() &&
    soup_nazi() &&
    etc())
  ...
9
ответ дан 3 November 2019 в 12:50
поделиться

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

5
ответ дан 3 November 2019 в 12:50
поделиться

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

4
ответ дан 3 November 2019 в 12:50
поделиться

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

Чтобы добавить к этому, я бы не стал переходить на множественные if, но добавляю функцию для предикатов. Особенно, если одинаковое количество предикатов используется в нескольких местах.

3
ответ дан 3 November 2019 в 12:50
поделиться

Это зависит от того, что вы делаете. Второе утверждение приводит к другому результату, когда вы обращаетесь к нему. (добавьте «не» перед ним) и это очень распространенный источник ошибок.

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

3
ответ дан 3 November 2019 в 12:50
поделиться

Я не думаю, что есть какие-либо правила, однако:

  1. это достаточно сложно, когда вы показываете это кому-то еще трудно понять это?
  2. нужно ли охватывать несколько строк?
  3. повторяли ли вы проверку условий в нескольких предложениях if? Это указывало бы на необходимость рефакторинга в какой-либо метод

. Если применимо что-либо из вышеперечисленного, я бы переработал его.

1
ответ дан 3 November 2019 в 12:50
поделиться

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

1
ответ дан 3 November 2019 в 12:50
поделиться

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

switch (myVal)
{
    case "isThis":
    case "isThat":
    case "something else":
        doThis();
        break;
    case "another":
    case "yet another":
    case "even another":
        doThat();
        break;
    case "another one":
    case "more more":
        doThisAgain();
        break;
}

Выполнение этого было бы довольно многословным в операторах if else. Некоторому коду потребуются тонны операторов if и else, некоторые могут быть сжаты и т. Д. Просто никогда не жертвуйте качеством исполнения кода ради красивости исходного кода.

0
ответ дан 3 November 2019 в 12:50
поделиться

Какой путь лучше? Ни. Семантика и того, и другого различна.

Я согласен, хотя разбиение облегчает отладку, но делает условные точки останова:)

Если это простая комбинация «И» или «ИЛИ», которая длиннее 3 тестов,

0
ответ дан 3 November 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: