2013-09-10 2 views
0

У меня есть синтаксический анализатор команд, который имеет одну и ту же структуру (разбор, проверка, выполнение, подтверждение/ошибка), но все они делают что-то другое (open, close, addnote, changestatus).парсер со структурой (php)

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

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

validate($commands){ 
foreach($commands as $command){ 
    switch($command['name']){ 
    case 'close': 
     validateClose($command); 
     break; 
    case 'addnote: 
     validateAddnote($command); 
     break; 
    ... 
    } 
    } 
} 

execute($commands){ 
foreach($commands as $command){ 
    switch($command['name']){ 
    case 'close': 
     executeClose($command); 
     break; 
    case 'addnote: 
     executeAddnote($command); 
     break; 
    ... 
    } 
    } 
} 

validateClose($command){ 
    // parse here for parameters, 3 
    // validate parameters 
    $command['valid'] = $validated; 
    if(!$validated) 
    $message = "Invalid because..."; 
} 

validateAddnote($command){ 
    // parse here for parameters, 1 
    // validate parameters 
    $command['valid'] = $validated; 
    if(!$validated) 
    $message = "Invalid because..."; 
} 

... 

executeClose($command){ 
    $db->status('close', params); 
    $message = "closed x with {params}"; 
} 

executeAddnote($command){ 
    $db->add('note', param); 
    $message = "Added {param} as note to x"; 
} 

... 
+0

ОЧЕНЬ сложно помочь, если нет примеров кода или демонстрации того, что вы делаете. – Rottingham

ответ

0

Я решил пойти с абстракцией и создать класс для команд с абстрактным классом и классом ребенка для каждой команды.

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

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

Смежные вопросы