Лучше так, чем дело выключатель

Лучше так, чем дело выключатель

25.06.2020 12:04:05 Источник

У меня есть метод, который использует блоки 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;
    }

Как видно из приведенного выше примера, случаи делают похожие вещи, и есть небольшая разница.

Есть ли более элегантный способ справиться с этой ситуацией? Мне не очень нравится дублирование кода.

У вопроса есть решение - Посмотреть?

Ответы - Лучше так, чем дело выключатель / A better way than a switch case

Является ответом!
Jignesh Joisar

25.06.2020 12:07:56

попробуйте установить значение по умолчанию, а затем добавить значение на основе условия

$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;
 }
Lawraoke

25.06.2020 12:10:04

Другой способ сделать это, попробуйте, если вы хотите перейти от случая переключения

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'));
}
Benni

25.06.2020 12:13:34

Если вызов сеттера дважды для значений по умолчанию, таких как @Jignesh Joisar, не требуется:

$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);
idan

25.06.2020 12:39:23

Я думал, что есть математическая формула, чтобы вместо использования 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'));
    }
Kamal Maisuriya

25.06.2020 02:45:34

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"

}

Закрыть X