Уменьшать количество условных

У меня есть маленькая функция, которая вручает стоимость, у которой есть большее первенство, которое пока не определено нигде, только из-за порядка, как он оценил стоимость:

public function obtenerValorMasImportante($datos = null) {

    if ($datos->getDato1()) {
        return 'dato1';
    }
    if ($datos->getDatoX()) {
        return 'datox';
    }
    if ($datos->getLoQueSea()) {
        return 'loquesea';
    }
    if ($datos->getOtraCosa()) {
        return 'otracosa';
    }
    return false;
}

Проблема простая: код функционирует, но: Что происходит, если у меня есть 100 типов стоимости? был бы должен писать 100 if и это не хорошая идея, я не текут также идеи в этом моменте дня.

У меня нет большего контроля на объекте $datos, тогда это не выбор изменять это или добавлять информацию.

Как он мог бы уменьшать количество if? или в Вашем недостатке делать код, независимый от количества стоимости.

4
задан 16.08.2016, 22:37
3 ответа

Основываясь на ответах, предоставляемых Альваро и Иисусом (новые ответы втречены с радостью), я закончил тем, что использовал этот код, используя изменчивые функции:

public function obtenerValorMasImportante($datos = null) {

    $valores = ['Dato1', 'DatoX', 'LoQueSea', 'OtraCosa'];

    foreach ($valores as $valor) {
        $metodo = 'get' . $valor;

        if ($datos->{$metodo}()) {
            return strtolower($valor);
        }
    }
    return false;
}
3
ответ дан 24.11.2019, 13:38
  • 1
    Очень хорошо, три различных ответов. Правда - что и #233; sta - та, которая м и # 225; s он мне нравится трех, потому что виден м и # 225; s чистая и аккуратная. – Alvaro Montoro♦ 17.08.2016, 04:40
  • 2
    Я встречаюсь с Альваро, она очень простая, он делает работу и не вводит проблемы безопасности так как стоимость и м и # 233; все est и # 225; n в известном array. – Jesús Franco 31.08.2016, 18:08

Он не относится друг к другу, которого eval будьте "плохим", другая невыгода состоит в том, что ты не можешь захватывать ошибки легко, и код не является портативным в PHP 7, так как насильно нужно включать решение return или он возвратит NULL.

Кроме того, он не состоит necerio в том, чтобы использовать eval. Ты можешь называть dinámicamente метод с call_user_func.

Хотя в примере имя метода и стоимость возврата находятся в минус одном 'get' в цепи и возвращая strtolower($nombre_metodo), давайте предполагать, что это не так, и что у нас есть, что mapear имена методов, призванные в непохожую стоимость:

function obtenerValor($datos = null) {    
    $mapMetodoAValor = [
        'Dato1' => 'valorRetorno1',
        'DatoX' => 'valorRetornoOtro',
        /* siguen más metodos => valor ...*/
    ];
    foreach($mapMetodoAValor as $metodo => $valor) {
        if(call_user_func([$datos, 'get' . $metodo])) {
            return $valor;
        }
    }
    return false;
}

Если стоимость всегда равна в strtolower($metodo) array может быть проще, как пример Альваро, но снова, нет никакой необходимости использовать eval. Всегда предпочти call_user_func

5
ответ дан 24.11.2019, 13:38

Поскольку все у условных есть та же основная структура, это случай, в котором ты мог бы использовать eval. Идея состояла бы в том, чтобы ты изменил функцию для того, чтобы он делал что-то как это:

  1. Поверьте array со списком (упорядоченная по приказу первенства) с именами признаков, которые нужно подтвердить
  2. Пересеки список с первого элемента в последнего
    1. С eval распредели стоимость getter во вспомогательную переменную
    2. Подтверди стоимость вспомогательной переменной
    3. Если у него есть какая-то стоимость, возврати имя элемента array.

Код был бы таким:

function obtenerValorMasImportante($datos = null) {    
    $aux = array("Dato1", "DatoX", "LoQueSea", "OtraCosa");
    $val = null;
    for ($x = 0; $x < count($aux); $x++) {
        eval('$val = $datos->get' . $aux[$x] . '();');
        if ($val)
            return strtolower($aux[$x]);
    }
    return false;
}

Тогда сейчас единственным, что ты должен поддерживать, является список признаков, упорядоченных первенством.

Да, я знаю, что будут люди, которые скажут "но eval он дьявольский и не должен быть использованным", но это не является совсем правильным, особенно для этого случая, потому что ты будешь в контроль всего того, что он идет оценивать, а следовательно ты не подвергаешься риску делания одного eval с незнакомым вводом.

4
ответ дан 24.11.2019, 13:38
  • 1
    Он думал о soluci и # 243; n схвати и # 237; определяя array в начало, спасибо! я подожду, если есть м и # 225; s ответы и печатать и # 233; идея, которая у меня есть.:) – Shaz 17.08.2016, 00:55
  • 2
    Не необходимо использовать eval, call_user_func - лучший opci и # 243; n. Я помещаю пример в отдельный ответ. – Jesús Franco 17.08.2016, 01:24
  • 3
    @Jes и # 250; sFranco гениальный. Спасибо, не conoc и # 237; в этот м и # 233; все. Все они d и # 237; эксперт изучает немного 😀 – Alvaro Montoro♦ 17.08.2016, 01:27
  • 4
    Хотя твой пример гениален, tom и # 233; как основание для моего ответа. Не я atrev и # 237; чтобы издавать твой ответ из-за argumentaci и # 243; n в пользу eval. Или он оставлял аргументы делая смущено c и # 243; я говорю, или он удалял аргументы изменяя полностью ответ. – Jesús Franco 17.08.2016, 01:31