如何正确重构此功能?

时间:2021-03-17 18:46:19

标签: php function refactoring

我有以下 PHP 函数,它接受两个变量,使用多个 if/else 语句检查它们的值并操纵它们的值。如何让这段代码更具可读性和易于理解,即重构它?

    $myarr = somevalue();
    public function messy($var, $number) {
            if (is_array($var)) {
                foreach ($var as $i => $v) {
                    if (isset($myarr[$v])) {
                        if ($number == false || $number[$i] == "_NONE_" || $myarr[$v] == $number[$i]) {
                            unset($myarr[$v]);
                        }
                        else {
                            $myarr[$v] = $number[$i];
                        }
                    }
                    else {
                        if ($number != $check_value) {
                            $myarr = $myarr + array($v => $number[$i]);
                        }
                    }
                }
            }
            else {
                if (isset($myarr[$var])) {
                    if ($myarr[$var] == $number || $number == "_NONE_" || $number == false) {
                        unset($myarr[$var]);
                    }
                    else {
                        $myarr[$var] = $number;
                    }
                }
                else {
                    if ($number != false) {
                       $myarr = $myarr + array($var => $number);
                    }
                }
            }
        }

1 个答案:

答案 0 :(得分:1)

给您的一些一般提示:

  1. 从域而非编程角度为变量赋予有意义的名称(例如,不是 $key$value,而是 $orderId$order
  2. 尽量减少缩进量。你的缩进越多,手头的代码就越少
  3. 将其中的一部分提取到具有有意义名称的单独私有方法中(参见 1)
  4. 用提前返回替换 else 语句
  5. 将您正在修改的数据包装在一个类中并对其进行设计,以便您可以通过调用其上的方法来修改它

作为提取到私有方法 (3) 的一个小例子,您可以执行以下操作:

public function messy($var, $number) {
    if (is_array($var)) {
        $myarr = $this->handleArrayCase($var, $number);
    }
    else {
        $myArr = $this->handleNonArrayCase($var, $number);
    }
}

private function handleArrayCase($var, $number) {
    foreach ($var as $i => $v) {
        if (isset($myarr[$v])) {
            if ($number == false || $number[$i] == "_NONE_" || $myarr[$v] == $number[$i]) {
                unset($myarr[$v]);
            }
            else {
                $myarr[$v] = $number[$i];
            }
        }
        else {
            if ($number != $check_value) {
                $myarr = $myarr + array($v => $number[$i]);
            }
        }
    }

    return $myarr;
}

private function handleNonArrayCase($var, $number) {
    if (isset($myarr[$var])) {
        if ($myarr[$var] == $number || $number == "_NONE_" || $number == false) {
            unset($myarr[$var]);
        }
        else {
            $myarr[$var] = $number;
        }
    }
    else {
        if ($number != false) {
            $myarr = $myarr + array($var => $number);
        }
    }
    
    return $myarr;
}

请注意,这不是一个工作示例,它不遵循有意义名称的规则,因为我没有足够的上下文来这样做。

相关问题