Php 如何正确重构这个函数?

Php 如何正确重构这个函数?,php,function,refactoring,Php,Function,Refactoring,我有下面的PHP函数,它接受两个变量,使用多个if/else语句检查它们的值,并操纵它们的值。我如何使这段代码更可读、更容易理解,即重构它 $myarr = somevalue(); public function messy($var, $number) { if (is_array($var)) { foreach ($var as $i => $v) { if (isset

我有下面的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);
                    }
                }
            }
        }

给您的一些一般提示:

  • 从域而不是编程角度为变量指定有意义的名称(例如,不是
    $key
    $value
    ,而是
    $orderId
    $order
  • 尽量减少缩进量。你拥有的缩进越多,你手头的代码就失去了越多的思维能力
  • 将部分内容提取到具有有意义名称的单独私有方法中(请参见1)
  • 用早期返回替换else语句
  • 将要修改的数据包装在一个类中,并对其进行设计,以便通过对其调用方法进行修改
  • 作为提取到私有方法的一个小示例(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;
    }
    

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

    什么是“相应的”mean@dazed-我想说的是“操纵他们的价值观”。糟糕的英语我投票结束这个问题,因为它应该转到。你能举例说明如何将部分提取到私有方法中吗?我在回答中添加了一个例子