Приветствую. Я изо всех сил пытаюсь сократить сегмент кода, который выглядит довольно длинным, что меня не убеждает в его важности. Это функция для создания множества массивов сеансов, используемых для заполнения форм, и она заставляет меня проверять наличие определенных значений в массиве аргументов, с случаями для каждого отдельного, чтобы сгенерировать запрошенные массивы. Вот так:
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') : '');
}
Функция принимает массив formdata в качестве аргумента и в зависимости от содержащихся значений генерирует соответствующие массивы в сеансе; это происходит только после проверки наличия флага соответствия, следовательно, issets и тернарного оператора.
Вызываемая функция, PrepBaseForm, разделяет добавление второго и третьего аргументов, соответствующих имени файла и понятному имени, к первому аргументу, который является массивом; он также принимает необязательный четвертый параметр, указывающий файл, который нужно объединить с заполненной формой.
Если значение не присутствует в массиве, код намеренно очищает соответствующую переменную сеанса до '', чтобы сохранить порядок генерации без изменений (с этой целью: есть ли лучший способ сделать это, учитывая, что существуют сценарии, в которых данный порядок генерации будет нарушен?).
Фактический код имеет около двадцати блоков генерации с этим форматом, и он становится довольно длительный; одна оптимизация, о которой я думал, заключалась в том, чтобы перебрать заданные поля и обобщить процесс генерации, но, как вы можете видеть, часто аргументы различаются или входной массив для функции prepareBaseForm должен быть сгенерирован другим способом. Есть идеи, как мне справиться с этим рефакторингом? Заранее благодарим за ответ.