我今天收到一位高级开发人员的代码审查,询问“顺便问一下,您反对通过switch语句分派功能吗?” 我已经在很多地方读到了关于如何通过切换到调用方法来泵送参数是不好的OOP,而不是可扩展的,等等。但是,我无法真正为他提供明确的答案。我想一劳永逸地解决这个问题。
这是我们的竞争代码建议(以php为例,但可以更普遍地应用):
class Switch {
public function go($arg) {
switch ($arg) {
case "one":
echo "one\n";
break;
case "two":
echo "two\n";
break;
case "three":
echo "three\n";
break;
default:
throw new Exception("Unknown call: $arg");
break;
}
}
}
class Oop {
public function go_one() {
echo "one\n";
}
public function go_two() {
echo "two\n";
}
public function go_three() {
echo "three\n";
}
public function __call($_, $__) {
throw new Exception("Unknown call $_ with arguments: " . print_r($__, true));
}
}
他的部分论点是“与普通的__call()魔术方法相比,它(切换方法)在处理默认案例方面有一种更干净的方法。”
我不同意清洁度,实际上更喜欢打电话,但我想听听别人怎么说。
我可以提出支持该Oop
方案的论点:
- 就您必须编写的代码而言,它更简洁(更少,更易于阅读,更少考虑的关键字)
- 并非所有动作都委派给单个方法。此处的执行没有太大区别,但至少文本更加分隔。
- 同样,可以在类中的任何位置而不是特定位置添加另一种方法。
- 方法带有名称空间,这很好。
- 不适用于此处,而是考虑
Switch::go()
对成员而不是参数进行操作的情况。您必须先更改成员,然后再调用方法。因为Oop
您可以随时独立地调用方法。
我可以提出支持该Switch
方案的论点:
- 为了争辩,使用更干净的方法处理默认(未知)请求
- 似乎不那么神奇,这可能会使不熟悉的开发人员感到更自在
任何人都可以添加任何内容吗?我想给他一个很好的答案。
Oop
允许使用phpdoc来描述每种方法,可以由某些IDE(例如NetBeans)进行解析。