Как избежать больших заявлений переключателя? - PullRequest
4 голосов
/ 08 августа 2010

У меня есть внутреннее приложение, в котором одна функция содержит слишком много регистров переключения.

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

switch ($item){  
    case 'item1':  
        do_something();  
    case 'item2':  
        do_something_different():  
}

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

Обновление: ссылка на вставку

Ответы [ 4 ]

9 голосов
/ 08 августа 2010

Это просто не очень хорошая функция.Должно быть три функции: edit_name, edit_manager и edit_liscencedata.вы можете переместить все вещи, которые повторяются между делами, в конструктор класса Change, который вы должны определить.

3 голосов
/ 08 августа 2010

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

$machine = array('item1' => do_something, 'item_2' => do_something_different);
$machine['item1']();

Тогда он даже открыт для подключения, где вы можете включить файл, который говорит:

$machine['item3'] = do_something_else_else;
1 голос
/ 08 августа 2010

Из приведенного фрагмента кода очевидно, что вы сталкиваетесь с довольно серьезным случаем смешанных обязанностей и копирования кодирования вставки из-за отсутствия факторинга. Ваша функция редактирования обрабатывает материал как минимум на трех разных слоях и для трех разных объектов. Операции рефакторинга, которые я мог бы применить, - это извлечение классов Validator для каждого из различных наборов данных, с которыми вы работаете, классы Model для взаимодействия с базой данных в каждом случае и команды для связывания всех трех: принять данные, передать их через валидаторы, затем взаимодействуйте с их соответствующими моделями, чтобы сохранить данные. Затем модели будут генерировать записи об изменениях на основе успешных операций.

Если вы не склонны предпринимать такие существенные изменения прямо сейчас, хорошими первыми шагами будет разделение различных частей в вашей функции редактирования на другие, лучше разделенные функции и беспокойство о классах и полиморфизме только тогда, когда вы решите эту первую проблему. препятствие. Чтобы лучше понять, почему ваш код неисправен и что вы можете сделать, чтобы исправить его, я рекомендую прочитать что-то вроде Рефакторинга (Мартина Фаулера) или, возможно, Прагматического Программиста.

0 голосов
/ 08 августа 2010

Просто мысль, но вместо оператора switch вы можете захотеть иметь своего рода систему хуков, доступную для этого ...

так, для списка возможных вещей как

item1, item2, ..., itemN

вы можете попробовать что-то вроде

function item1action ( ) { /* ... */ }
function item2action ( ) { /* ... */ }
function itemNaction ( ) { /* ... */ }

и имеет какой-то метод по умолчанию, например

function itemDefaultAction ( ) { /* ... */ }

, чтобы вместо предыдущего оператора switch можно было сделать

$function = "{$item}action";
if (! function_exists($function)) {
    return itemDefaultAction();
}
call_user_func($function);
return call_user_func($function)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...