是否有太多的开关盒可以减少圈复杂度?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有太多的开关盒可以减少圈复杂度?相关的知识,希望对你有一定的参考价值。

我有一个函数来检查$ value的类型是否有效。我目前的代码是一个简单的开关案例,有太多案例超过了圈复杂度17。我需要添加更多案例以及降低复杂性。

 /**
 * Check type of attribute value
 * @param $type
 * @param $value
 * @return bool
 */
public function typeCheck($type, $value)
{
    $this->value = $value;
    switch ($type) {
        case 'string':
            return is_string($value) || is_integer($value) || is_bool($value);
        case 'StringNotNull':
            return is_string($value);
        case 'LongStringNotNull':
            return is_string($value);
        case 'SuperLongStringNotNull':
            return is_string($value);
        case 'FortyStringNotNull':
            return is_string($value) && (strlen($value) < 41);
        case 'integer':
            return is_numeric($value);
        case 'positiveInteger':
            return is_numeric($value) && ($value > 0);
        case 'boolean':
            return is_bool($value) || ($value == 'true' || $value = 'false');
        case 'float':
            return is_numeric($value);
        case 'decimal':
            return is_numeric($value);
        case 'PositiveDimension':
            return is_numeric($value) && ($value > 0);
        case 'Dimension':
            return is_numeric($value) && (strlen($value) < 13);
        case 'Barcode':
            $validator = $this->getBarcodeValidator();
            $validator->setBarcode($value);
            return is_string($value) && (strlen($value) < 17 && $validator->isValid());
        case 'dateTime':
            return true;
        case 'normalizedString':
            $this->value = strip_tags($value);
            return is_string($value);
        default:
            return is_string($value);
    }
}

有更好的方法吗?

答案

您可以使用数据结构替换开关:

private 

public function typeCheck($type, $value) {

    $typeTestMap = [
        'string' => function($value) { return is_string($value) || is_integer($value) || is_bool($value); },
        'FortyStringNotNull' => function($value) { return is_string($value) && (strlen($value) < 41); },
        ...
    ];

    if (isset($typeTestMap[$type])) {
        return $typeTestMap[$type]($value);
    } else {
        return is_string($value);
    }
}
另一答案

那么,您可以对具有相同功能的组进行分组:

public function typeCheck($type, $value)
{
    $this->value = $value;
    switch ($type) {
        case 'string':
            return is_string($value) || is_integer($value) || is_bool($value);
        case 'FortyStringNotNull':
            return is_string($value) && (strlen($value) < 41);
        case 'positiveInteger':
            return is_numeric($value) && ($value > 0);
        case 'boolean':
            return is_bool($value) || ($value == 'true' || $value = 'false');
        case 'float':
        case 'decimal':
        case 'integer':
            return is_numeric($value);
        case 'PositiveDimension':
            return is_numeric($value) && ($value > 0);
        case 'Dimension':
            return is_numeric($value) && (strlen($value) < 13);
        case 'Barcode':
            $validator = $this->getBarcodeValidator();
            $validator->setBarcode($value);
            return is_string($value) && (strlen($value) < 17 && $validator->isValid());
        case 'dateTime':
            return true;
        case 'normalizedString':
            $this->value = strip_tags($value);
            return is_string($value);
        case 'StringNotNull':
        case 'LongStringNotNull':
        case 'SuperLongStringNotNull':
        default:
            return is_string($value);
    }
}

这会减少你的CRAP指数。但是,如果您使用OO,您可能应该考虑使用Strategy模式,请查看更多信息https://phpenthusiast.com/blog/strategy-pattern-the-power-of-interface

以上是关于是否有太多的开关盒可以减少圈复杂度?的主要内容,如果未能解决你的问题,请参考以下文章

第一波瓜果盲盒发出去了,我有太多话要说!

第一波瓜果盲盒发出去了,我有太多话要说!

有没有办法可靠地检测录音何时有太多的背景噪音?

因为有太多的无奈,我选择了逞强

中介模式VS门面模式

有效的减少代码中太多的ifelse?-策略模式