本日、上級開発者から「ちなみに、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など)で解析できます。