Say you wrote some code below for projectA.
function do_task(){ // init my_init(); // calling a class function $v = class_A::some_method($p1, $p2, $p3, $p4, $p5, $p6, $p7); // return return $v; }
Now, your boss loves it. Then he asks you to do a very similar thing for projectB. Naively, you may do:
function do_task($project_type){ // init my_init(); // calling a class function if ($project_type == "projectA"){ $v = class_A::some_method($p1, $p2, $p3, $p4, $p5, $p6, $p7); }elseif ($project_type == "projectB"){ $v = class_B::some_method($p1, $p2, $p3, $p4, $p5, $p6, $p7); } // return return $v; }
Um… it would work, but imagine if you will soon have projectC, and D, and on… and what if you need to add one more parameter to the some_method function?
In my opinion, the do_task function needs to be generalized, by taking in the class name as a parameter. Then add a lookup function to translate project names to class names. See below:
function do_task($class_name){ // init my_init(); // calling a class function $my_class = new $class_name(); $v = $my_class::some_method($p1, $p2, $p3, $p4, $p5, $p6, $p7); // return return $v; } function lookup_class_name($project_name){ switch ($project_name){ case "projectA": return "class_A"; case "projectB": return "class_B"; // ... } } // main $class_name = lookup_class_name("projectB"); $v = do_task($class_name);
The code looks a lot more manageable now. 😉