Одной из альтернатив является использование foldLeft
и addHeader
:
val req: HttpRequest = ???
val hs: Seq[HttpHeader] = Seq(RawHeader("a", "b"))
hs.foldLeft(req)((r, h) => r.addHeader(h))
Я не думаю, что переписывать if-операторы двумя способами, особенно если учесть, что добавление else
предложение в ваших примерах дает разные результаты. Если бы я хотел уменьшить количество атомарных высказываний в условии, я бы выделил некоторые, имеющие смысл, вместе в свою собственную функцию, например:
if(won_jackpot(obj)) ...
Я думаю, что это баланс различных типов операторов и правильное форматирование. Если все операторы одинаковы (все "и" или все "или"), то вы, вероятно, можете объединить неопределенное количество выражений без потери понимания:
if (something() &&
something_else() &&
so_on() &&
so_forth() &&
some_more_stuff() &&
yada() &&
yada() &&
yada() &&
newman() &&
soup_nazi() &&
etc())
...
Краткосрочная память может вместить семь предметов, отдавать или брать два. Это подразумевает, что для выражения, включающего более пяти разнородных объектов, может потребоваться один, чтобы остановиться и подумать об этом.
Я не верю, что есть магическое число. Если все предикаты имеют смысл вместе, тогда я соберу их вместе. Это может включать разбиение оператора if на две строки, но я обычно никогда не вводю лишних операторов if, которые являются лишними. Но если это особенно долго, вы должны спросить себя, все ли утверждения действительно необходимы. Возможно, вы могли бы отфильтровать некоторые значения ранее или что-то в этом роде. Наибольшее беспокойство вызывает удобочитаемость. Если кому-то еще трудно это понять, вам необходимо провести рефакторинг своего кода. Но если разделить код на два разных оператора, если он редко делает код более читабельным, он просто занимает больше строк.
Не количество предикатов, а подсчет сложности. Пока вы можете понять, что код делает с минимальными усилиями, он выглядит нормально для меня.
Чтобы добавить к этому, я бы не стал переходить на множественные if, но добавляю функцию для предикатов. Особенно, если одинаковое количество предикатов используется в нескольких местах.
Это зависит от того, что вы делаете. Второе утверждение приводит к другому результату, когда вы обращаетесь к нему. (добавьте «не» перед ним) и это очень распространенный источник ошибок.
Я видел код с около 20 предикатами, который работает (или, по крайней мере, работает достаточно хорошо!) Эмпирическое правило, которым я пользуюсь, если это похоже на ужин с собаками, я считаю рефакторингом.
Я не думаю, что есть какие-либо правила, однако:
. Если применимо что-либо из вышеперечисленного, я бы переработал его.
Списки условий - это не столько потеря читаемости , сколько потеря читаемости . Особенно когда имеешь дело с плохими аргументами метода, иногда действительно проще попросить прощения, чем разрешения (например, см. Ответ на на этот вопрос ). Таким образом вы сохраняете свой код чистым и тестируемым, и либо исправляете вызывающую программу, либо позволяете им обрабатывать возникающее исключение.
Все зависит от того, что нужно сделать. Но одна вещь, которую вы, возможно, захотите рассмотреть, которая сделает некоторые алгоритмы менее многословными, - это оператор 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, некоторые могут быть сжаты и т. Д. Просто никогда не жертвуйте качеством исполнения кода ради красивости исходного кода.
Какой путь лучше? Ни. Семантика и того, и другого различна.
Я согласен, хотя разбиение облегчает отладку, но делает условные точки останова:)
Если это простая комбинация «И» или «ИЛИ», которая длиннее 3 тестов,