如何在代码分支过于混乱之前处理它?

时间:2015-07-03 16:33:13

标签: php coding-style standards

所以我的实际问题是,如果我有多个if-elseif案例寻找1个正确匹配,但所有案例都有很多相同的代码,但有些案例有点不同,哪种方式最有效?

按角色排序并重复代码?

$user_role = 2;

if ($user_role === 1) {
  codeMethod1();
  codeMethod2();
} elseif ($user_role === 2) {
  codeMethod1();
  codeMethod2();
  codeMethod3();
} elseif ($user_role === 3) {
  codeMethod2();
  codeMethod3();
}

或者,按代码/流程排序并制作巨大的if语句?

$user_role = 2;

if ($user_role === 1 || 2) {
  codeMethod1();
} 

codeMethod2();

if ($user_role === 2 || 3) {
  codeMethod3();
}

我意识到,对于某些人来说,这是一个愚蠢的问题,因为他们已经弄明白了。我是编程新手,我只是想从一开始就把它弄好。我不想破坏我的程序或毁掉那些可能需要修复我的代码的人。

更新

问题澄清的情景:

当用户进入我的网站时,我将其识别为5个类别中的1个。 一些用户会得到相同的治疗方法,但有些用户会得到非常不同的治疗方法。 大约有20种不同的方法,其中一些用户将全部使用它们而其他用户将使用很少的方法。

因此,列出每个类别所需的方法会更好和/或更有效,即使很多代码看起来都是一样的。

示例:

$user_role = getCurrentUserRole();

switch ($user_role) {
  case 1:
    (uses method1() to method10())
    break;

  case 2:
    (uses method5() to method15())
    break;

  case 3:
    (uses method10() to method20())
    break

  case 4:
    (uses method1() to method20())
    break

  case 5:
    method1();
    method4();
    method8();
    method15();
    method20();
}

或者,是否最好列出每个方法并使用if语句来查看$user_role是否需要它?

示例:

$user_role = getCurrentUserRole();

switch ($user_role) {
  // Check for method1
  case (1 || 4) {
    method1();
  }

  // Check for method2
  case (1 || 4) {
    method2();
  }

  ... skip ...

  // Check for method5
  case (1 || 2 || 4) {
    method5();
  }

  .. Continue checking role permission for each method ..
}

请忽略我的坏英语,并告诉我如果你没有得到我的问题,请详细说明。

2 个答案:

答案 0 :(得分:0)

您的用户角色功能下的组功能,只需为特定用户角色调用这些功能。

$user_role = 2;

switch($user_role){
    case 1:
        userRole1(); 
        break;

    case 2:
       userRole2();
       break;

    case 3:
      userRole3();
      break;
}

function userRole1(){
        codeMethod1();
        codeMethod2();
}
function userRole2(){
       codeMethod1();
       codeMethod2();
       codeMethod3();
}
function userRole3(){
      codeMethod2();
      codeMethod3(); 
}

答案 1 :(得分:0)

我使用角色→功能关联。

但在您的情况下,使用简单的地图将角色编号与可能的功能相关联可能更合适:

$role_funcs = [
    "method1" => [ 1, 2,        ],
    "method2" => [ 1, 2, 3,    5],
    "method3" => [       3,    5],
    "method4" => [ 1,    3, 4,  ],
    // …
    "method9" => [    2, 3,    5],
];

简要概述了将为哪个用户类运行哪些功能块。利用它是非常微不足道的:

foreach ($role_funcs as $callback=>$for_roles) {
    if (in_array($user_role, $for_roles)) {
        $callback();
    }
}

现在只有当你真正拥有所有功能时才有效。 (否则,您甚至可能希望更高目标,将用户和角色包装到对象中,以隐式使用其中一个调度程序模式。)