2015-07-03 3 views
1

Итак, мой фактический вопрос: если у меня есть несколько случаев 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(); 
} 

Я понимаю, что для некоторых людей это глупый вопрос, потому что они уже все поняли. Я новичок в программировании, и я просто хочу получить это с самого начала. Я не хочу разрушать свою программу или разрушать ее для людей, которые могут исправить мой код.

UPDATE

Сценарий вопрос осветления:

Когда пользователь вводит свой сайт, я определяю их как 1 из 5 категорий. Некоторые пользователи получат такое же лечение с некоторыми вариантами, в то время как другие получат дико различное лечение. Существует около 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(); 
} 

ИЛИ, это лучше, чтобы перечислить все методы и использовать, если заявления, чтобы увидеть, если $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 .. 
} 

Пожалуйста, игнорируйте мой плохой английский, и скажите мне, чтобы уточнить, если вы не получите мой вопрос.

+0

Используйте 'switch' вместо нескольких, если else при сравнении. Только одно значение: $ user_role –

+0

Switch к переключателю, когда сможете. Он делает код чистым.Кроме того, если вы их должны иметь, получите хорошую среду IDE. – Andrew

ответ

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(); 
} 
+0

ОП задал вопрос о дедупликации внутри кодовых блоков, а не для альтернативного синтаксиса сравнения. – mario

+0

@mario, я пропустил это, теперь обновлено. –

+0

Мне это нравится, но похоже, что вы только что переместили дублирование где-то в другом месте, это не функции для вызова больших частей кода? – guestedForAnwser

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(); 
    } 
} 

В настоящее время работает только что, конечно, если у вас действительно есть они все доступны как функции. (В противном случае вы можете даже нацелиться выше, обернуть пользователей и роли в объекты, чтобы использовать один из шаблонов диспетчера неявно.)