Как я могу уменьшить код PHP с помощью множества проверок isset и повторяющихся, но переменных переменных аргументов? - PullRequest
5 голосов
/ 11 февраля 2011

Привет. Я изо всех сил пытаюсь уменьшить фрагмент кода, который выглядит довольно длинным, и я не уверен в его важности. Это функция для генерации множества сессионных массивов, используемая для заполнения форм, и она позволяет мне проверять наличие определенных значений в массиве аргументов, с возможностью для каждого отдельного генерировать запрошенные массивы. Здесь идет:

function prepOptional($formData) {

    $baseInfo=getBaseInfo();

    $_SESSION['fooData'] = (isset($formData['cbFoo']) ? prepBaseForm($baseInfo, 'foo',
            'Option foo') : '');

    $_SESSION['opt1Data'] = (isset($formData['cbOpt1']) ? prepBaseForm($baseInfo, 'opt1',
            'Option 1') : '');

    $_SESSION['barData'] = (isset($formData['cbBar']) ? prepBaseForm(prepOtherArray($formData), 'bar',
            'Option bar', 'Optional argument') : '');

}

Функция принимает массив формданных в качестве аргумента и в зависимости от содержащихся значений генерирует соответствующие массивы в сеансе; это происходит только после проверки наличия соответствующего флага, отсюда и issets и троичный оператор.

Вызываемая функция prepBaseForm отделяет добавление второго и третьего аргументов, соответствующих имени файла и понятному имени, к первому аргументу, который является массивом; он также принимает необязательный четвертый параметр, указывающий файл для объединения в заполненную форму.

Если значение отсутствует в массиве, код намеренно очищает соответствующую переменную сеанса до '', чтобы сохранить порядок генерации без изменений (с этой целью: есть ли лучший способ сделать это, учитывая, что есть сценарии, в которых данный порядок генерации будет нарушен?).

Фактический код имеет около двадцати блоков поколения с этим форматом, и он становится довольно длинным; Одна оптимизация, о которой я подумал, состояла в том, чтобы пройтись по заданным полям и обобщить процесс генерации, но, как вы видите, много раз аргументы различаются, или входной массив для функции prepBaseForm должен генерироваться другим способом. Любые идеи о том, как я мог бы заняться этим рефакторингом? Заранее благодарим за ваш ответ.

1 Ответ

4 голосов
/ 11 февраля 2011

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

function prepOptional($formData) {
    $baseInfo=getBaseInfo();

    $options = array(
        'foo' => 'Option foo', 
        'opt1' => 'Option Opt1',
        'bar' => 'Option Bar',
    );
    foreach ($options as $name => $text) {
        //Add defaults for formData and Session arrays)
        $formData += array('cb' . ucfirst($name) => '');
        $_SESSION += array($name . 'Data' => '');

        if ($formData['cb' . ucfirst($name)]) {
            $_SESSION[$name . 'Data'] = prepBaseForm(
                $baseInfo, 
                $name, 
                $text
            );
        }
    }
}
...