解析器与结构(PHP)

时间:2013-09-10 20:44:34

标签: php parsing command structure

我有一个命令解析器,每个命令都有类似的结构(解析,验证,执行,确认/错误),但它们都做了不同的事情(open,close,addnote,changestatus)。

我被要求更改错误消息,并且必须分别对所有命令进行相同的更改,因为它们都有不同的参数并从数据库中的不同表中提取。但它们大多都是一样的。有更简单的方法吗? (而不是switch-case和硬编码所有命令)

我知道还有更多的更改,我宁愿不复制/粘贴,每次都会为每个命令更改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";
}

 ...

1 个答案:

答案 0 :(得分:0)

我决定使用抽象并为每个命令创建一个带有抽象类和子类的命令的类。

我丢弃了交换机并使用变量类名来创建每个命令的实例。

这些更改确实清理了一些内容,使其更具可读性,并使其更加灵活,并且可以轻松地对单个命令或所有命令进行更改而无需重复。