Alternative to if(x >= 200 && x <= 299)?


Alternative to if(x >= 200 && x <= 299)?

在PHP(或任何类似的语言)中,是否有更好的替代方法:

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

我的目标是验证一个数字是否在2xx代码范围内(对于HTTP请求)。我不喜欢双if子句,因为我必须定义范围的末尾,而且由于某些原因,在进行各种自动验证时,它不实用。

在PHP(或任何类似的语言)中,是否有更好的替代…

没有没有,在我看来。

代码:

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

可读性很强,并且清楚地定义了要检查的内容。

如果你想要一个你肯定会在三个月后忘记它的意思的语句:

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

如果没有别的,为了可读性起见,将它包装在一个描述它的函数中:

function isHttpSuccess(status) {
    return 2 == (int)floor(x / 100);
}

如果你有一个函数,你可以使用return 'trick':

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'
    ...
}

哇,这个帖子已经超过10年了!添加另一个答案可能只是徒劳无益(可怕的表达),但这里是…

最初的问题是关于PHP的,但提供的代码示例看起来像JavaScript。以下是两种语言的一些想法(尽管投票最多的答案可能是最好的——仅仅因为我们可以做一些事情并不意味着我们应该)

在JavaScript中,字符串是通过索引提供对字符的快速访问的对象,所以这可以工作:

if (x.toString()[0] === '2') {
    return 'ok';
}

如果我们传递的不是x,而是Response.status或类似的,那么对易读性的关注就变得有些没有意义了:

if (Response.status.toString()[0] === '2') {
    return 'ok';
}
在PHP中

if (substr($x, 0, 1) === '2') {
    return 'ok';
}

if (substr((string)$response->getStatusCode(), 0, 1) === '2') {
    return 'ok';
}

更进一步(也许太过分了?)我们可以写一个函数来解析状态码"分组"

const getStatusCodeGroup = (code) => {
  const groups = {
    '1': 'Informational responses (100–199)',
    '2': 'Successful responses (200–299)',
    '3': 'Redirection messages (300–399)',
    '4': 'Client error responses (400–499)',
    '5': 'Server error responses (500–599)'
  }
  return groups[code.toString()[0]] ?? 'Throw IRL';
}

当您一遍又一遍地重复一个任务,并且希望重用代码时,您应该编写一个新函数。这些示例假设您想使用>=<=操作符,尽管我通常会使用>=<来包含最小值并排除最大值。

一个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;
  }
}

您可以编写自己的函数使其更容易:

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

然后像这样调用它:

if(inRange(x,200,299)) {
    //execute code
} else {
   //other code
}

在大多数语言中都没有内置的简写。但是自己写一个清晰的实用函数也没有错,比如:

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

,然后用作:

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

对于未来的代码维护者来说,这很容易理解你在这里做的事情的要点——可以说比原来的'double-if'更容易。

JavaScript中:

if ([199,299,x].sort().indexOf(x) == 1)

对于您的目的,您不需要相等运算符,所有的响应都是整数。

if(x>199 && x<300)

是最简单的生活。

return in_array($code, range(200, 299));