Advantages to Multiple Methods over Switch
Posted
by
tandu
on Programmers
See other posts from Programmers
or by tandu
Published on 2011-06-21T13:36:34Z
Indexed on
2011/06/21
16:30 UTC
Read the original article
Hit count: 214
php
|object-oriented
I received a code review from a senior developer today asking "By the way, what is your objection to dispatching functions by way of a switch statement?" I have read in many places about how pumping an argument through switch to call methods is bad OOP, not as extensible, etc. However, I can't really come up with a definitive answer for him. I would like to settle this for myself once and for all.
Here are our competing code suggestions (php used as an example, but can apply more universally):
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));
}
}
Part of his argument was "It (switch method) has a much cleaner way of handling default cases than what you have in the generic __call() magic method."
I disagree about the cleanliness and in fact prefer call, but I would like to hear what others have to say.
Arguments I can come up with in support of Oop
scheme:
- A bit cleaner in terms of the code you have to write (less, easier to read, less keywords to consider)
- Not all actions delegated to a single method. Not much difference in execution here, but at least the text is more compartmentalized.
- In the same vein, another method can be added anywhere in the class instead of a specific spot.
- Methods are namespaced, which is nice.
- Does not apply here, but consider a case where
Switch::go()
operated on a member rather than a parameter. You would have to change the member first, then call the method. ForOop
you can call the methods independently at any time.
Arguments I can come up with in support of Switch
scheme:
- For the sake of argument, cleaner method of dealing with a default (unknown) request
- Seems less magical, which might make unfamiliar developers feel more comfortable
Anyone have anything to add for either side? I'd like to have a good answer for him.
© Programmers or respective owner