繁体   English   中英

比开关盒更好的方法

[英]A better way than a switch case

我有一个使用类似于以下代码块的 switch-case 块的方法:

    switch ($totalMonthsFromImmigration) {
        case $totalMonthsFromImmigration <= 18:
            $this->clauses->put('immigrant_1', $this->clauses->get('immigrant'));
            $this->clauses->put('immigrant_2', null);
            $this->clauses->put('immigrant_3', null);
            break;
        case $totalMonthsFromImmigration <= 30:
            $this->clauses->put('immigrant_1', null);
            $this->clauses->put('immigrant_2', $this->clauses->get('immigrant'));
            $this->clauses->put('immigrant_3', null);
            break;
        case $totalMonthsFromImmigration <= 42:
            $this->clauses->put('immigrant_1', null);
            $this->clauses->put('immigrant_2', null);
            $this->clauses->put('immigrant_3', $this->clauses->get('immigrant'));
            break;
    }

从上面的例子可以看出,案例做的事情相似,但有一点不同。

有没有更优雅的方法来处理这种情况? 我真的不喜欢代码的重复。

执行此操作的另一种方法,如果您想从Switch case 更改,请尝试IF

if ($totalMonthsFromImmigration <= 18){
 $this->clauses->put('immigrant_1', $this->clauses->get('immigrant'));
} else if ($totalMonthsFromImmigration <= 30) {
 $this->clauses->put('immigrant_2', $this->clauses->get('immigrant'));
else if ($totalMonthsFromImmigration <= 42) {
 $this->clauses->put('immigrant_3', $this->clauses->get('immigrant'));
}

如果不需要像 @Jignesh Joisar 这样的默认值调用 setter 两次:

$this->clauses->put('immigrant_1', ($totalMonthsFromImmigration <= 18) ? $this->clauses->get('immigrant') : null);
$this->clauses->put('immigrant_2', ($totalMonthsFromImmigration > 18 && $totalMonthsFromImmigration <= 30) ? $this->clauses->get('immigrant') : null);
$this->clauses->put('immigrant_3', ($totalMonthsFromImmigration > 30 && $totalMonthsFromImmigration <= 42) ? $this->clauses->get('immigrant') : null);

尝试设置默认值,然后根据条件添加值

$this->clauses->put('immigrant_1', null);
$this->clauses->put('immigrant_2', null);
$this->clauses->put('immigrant_3', null);

switch ($totalMonthsFromImmigration) {
            case $totalMonthsFromImmigration <= 18:
                $this->clauses->put('immigrant_1', $this->clauses->get('immigrant'));
                break;
            case $totalMonthsFromImmigration <= 30:
                $this->clauses->put('immigrant_2', $this->clauses->get('immigrant'));
                break;
            case $totalMonthsFromImmigration <= 42:
                $this->clauses->put('immigrant_3', $this->clauses->get('immigrant'));
                break;
 }

我认为有一个数学公式可以代替使用 switch case 或 if else。 但我一个也没找到。 这是我根据我在这里看到的答案的解决方案:

    $this->clauses->put('immigrant_1', null);
    $this->clauses->put('immigrant_2', null);
    $this->clauses->put('immigrant_3', null);

    if ($totalMonthsFromImmigration <= 18) {
        $this->clauses->put('immigrant_1', $this->clauses->get('immigrant'));
    } else if ($totalMonthsFromImmigration <= 30) {
        $this->clauses->put('immigrant_2', $this->clauses->get('immigrant'));
    } else if ($totalMonthsFromImmigration <= 42) {
        $this->clauses->put('immigrant_3', $this->clauses->get('immigrant'));
    }
switch ($totalMonthsFromImmigration) {
         case $totalMonthsFromImmigration <= 42:
            $this->clauses->put('immigrant_1', $this->clauses->get('immigrant'));
            $this->clauses->put('immigrant_2', null);
            $this->clauses->put('immigrant_3', null);
        break;
        default:
           echo "Your logic you want greeter then 42"

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM