Альтернатива if (x> = 200 && x <= 299)? - PullRequest
3 голосов
/ 16 сентября 2011

В PHP (или любом другом подобном языке) есть лучшая альтернатива:

if(x >= 200 && x <= 299){
   return 'ok';
}

Моя цель - проверить, находится ли число в диапазоне кода 2xx (для запросов HTTP). Мне не нравится предложение double-if, потому что я должен определить конец диапазона, и по какой-то причине это непрактично при выполнении различных автоматических проверок.

Ответы [ 9 ]

9 голосов
/ 16 сентября 2011

В PHP (или любом другом подобном языке) есть лучшая альтернатива ...

Нет, на мой взгляд, нет.

Ваш код:

if (x >= 200 && x <= 299) {
    return 'ok';
}

очень хорошо читается и четко определяет, что проверяется.

6 голосов
/ 16 сентября 2011

Если вам нужно заявление, которое вы обязательно забудете через три месяца:

if(2 == (int)floor(x / 100)) ...

Если ничего другого, для удобства чтения оберните его в функцию, которая его описывает:

function isHttpSuccess(status) {
    return 2 == (int)floor(x / 100);
}
5 голосов
/ 16 сентября 2011

Если у вас есть функция, вы можете использовать возвращаемый трюк:

function getStatus(x) {
    if(x < 200) return 'status 1xx';
    if(x < 300) return 'status 2xx'; // will only get executed if x >= 200 as well
                                     // otherwise already returned '1xx'
    ...
}
1 голос
/ 16 сентября 2011
return in_array($code, range(200, 300));
1 голос
/ 16 сентября 2011

Когда вы повторяете задачу снова и снова и хотите повторно использовать код, вы должны написать новую функцию. В этих примерах предполагается, что вы хотите использовать операторы >= и <=, хотя часто я бы использовал >= и < для включения минимального значения и исключения максимального значения.

PHP-абстракция:

function between( $val, $min, $max )
{
  return $val >= $min && $val <= $max;
}

Абстракция JavaScript:

if ( !Number.prototype.between )
{
  Number.prototype.between = function(min,max){
    return this >= min && this <= max;
  };
}

Для вашей проблемы с диапазонами HTTP я бы использовал нижнюю включающую форму как:

if ( between( $val, 200, 300 ) )...

Конечно, имеет смысл изменить порядок параметров так, чтобы объявление было:

between( 200, $val, 300 );

Но на самом деле это зависит от вас.

Еще один абстрактный пример:

function between( $val, $min, $max, $mode = null )
{
  switch ( $mode )
  {
    case INCLUSIVE:
      return $val >= $min && $val <= $max;
    case EXCLUSIVE:
      return $val > $min && $val < $max;
    case TOP_INCLUSIVE:
      return $val > $min && $val <= $max;
    case BOTTOM_INCLUSIVE:
    default:
      return $val >= $min && $val < $max;
  }
}
0 голосов
/ 17 сентября 2011

Для вашей цели вам не нужен оператор равенства, все ответы целые.

if(x>199 && x<300)

так же просто, как жизнь.

0 голосов
/ 17 сентября 2011

В JavaScript:

if ([199,299,x].sort().indexOf(x) == 1)
0 голосов
/ 16 сентября 2011

В большинстве языков для этого нет встроенных сокращений. Но нет ничего плохого в написании собственной понятной функции полезности, такой как:

function inRange( $val, $low, $high )
{
    return ($val >= $low) && ($val <= $high);
}

, который вы затем использовали бы как:

if (inRange(x, 200, 299))
{
   return "ok";
}

Довольно просто, или будущий сопровождающий вашего кода, понять суть того, что вы здесь делаете - возможно, даже в большей степени, чем с оригинальным 'double-if'.

0 голосов
/ 16 сентября 2011

Вы можете написать свою собственную функцию, чтобы упростить ее:

function inRange(val,lower,upper) {
    return val >= lower && val <= upper;
}

Затем вызовите ее так:

if(inRange(x,200,299)) {
    //execute code
} else {
   //other code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...