在我的应用程序中,某些查询字符串将执行某些类方法,我目前正在使用一堆switch语句来实现这一点。例如:
switch (true) {
case isset($_GET['action']):
switch($_GET['action']) {
case 'delete':
if ($obj->delete($x)) {
// do something
} else {
// do something
}
break;
case 'update':
if ($obj->update($x)) {
// do something
} else {
// do something
}
break;
case 'edit':
if ($obj->edit($x)) {
// do something
} else {
// do something
}
break;
}
break;
and so forth.....................
}
上面是一个调低的例子,在某些情况下还有其他的switch语句。我发现使用这种方法比一堆if语句更清晰 - 但我真正想要的是处理这些调用的一种更有效的方法,因为现在开始变得难以维护。
我在做什么不好的做法?
我是否可以为此阅读建议的模式?
答案 0 :(得分:0)
如果这真的是你的代码,那么:
$x = '???';
if(isset($_GET['action'])){
$action = $_GET['action'];
if(method_exists($obj, $action) && $obj->{$action}($x)){
// printf('%s done!', $action);
}
}
答案 1 :(得分:0)
这是不好的做法。当你的switch
失控时,你做错了!
OTP 的想法很好,但我会稍微改变一下。
如果它太大,我会将整个处理部分转换为一个类。 请参阅下面的概念验证。一个名为action的方法的类更多维持得比switches from hell
。
/**
* Handles the actions.
*/
class GetHandler {
/**
* Place errors here from the handling method.
*/
public $Errors = array();
public function __construct(){
// setup the $obj here and stuff
}
public function update(){
// do stuff
}
public function edit(){
// do stuff
}
public function delete(){
// do stuff
}
public function __invoke(){
// no handler handling here
$this->Errors[] = 'Invalid action performed.';
}
} // class GetHandler;
// Expose the GetHandle in globals if this code is not in global scope
$GLOBALS['GetHandler'] = $GetHandler = new GetHandler();
// Now forward the action to the handler
if(!empty($_GET['action']) and is_string($_GET['action'])){
// Now check if the method exists
if(method_exists($GetHandler, $_GET['action'])){
call_user_func(array($GetHandler, $_GET['action']));
}else{
// invoke the object and let it handle errors
call_user_func($GetHandler);
}
}else{
// invoke the object and let it handle errors
call_user_func($GetHandler);
}
// Later on, anywhere... you can do error checking
if(!empty($GLOBALS['GetHandler']->Errors)){
foreach($GLOBALS['GetHandler']->Errors as $Error){
echo $Error, PHP_EOL;
}
}else{
// handle a success
// use $GLOBALS['GetHandler'] custom properties to get success data
}
仍然,IMO,巨大的交换机并不好。