2014-09-22 3 views
0

리팩터링 문제가 발생합니다. 비슷한 방법이 많이 있지만 한 줄을 추출하여 다른 개인적인 방법으로 만들 수는 없습니다.두 개의 foreach 루프가있는 리펙터 메소드

private function constructRules($rules, \Languages $langs) { 
    foreach ($rules as $fieldType => $rule) { 
     foreach ($langs->all() as $lang) { 
      //line below changes 
      $langRules[$fieldType . '[' . $lang->lang . ']'] = $rule; 
     }  
    } 

    return $langRules; 
} 

나는 4 개의 다른 장소에서이 foreach 루프를 사용합니다. foreach 루프를 찾아서 배열을 반환하면이 예제에서 $ langRules를 채우기 위해 foreach 루프를 하나의 메서드로 만들어야합니다. 아마 그것을 할 수있는 간단한 방법이 있지만 그것을 볼 수 없습니다 ...

+6

이 질문은 http://codereview.stackexchange.com/ –

+0

에 더 적합합니다. 방법이 무엇인지는 분명하지 않지만 매번 모든 언어가 실제로 필요합니까? 네가 할 수있는 것이 분명하다. –

+0

이것은 검토 대상 코드를 요구하지 않으므로 코드 검토 질문이 아닙니다. 그들은 이식성을 위해 리팩터링하는 방법을 요구하고 있습니다. 이것은 다른 점입니다. –

답변

2

그 코드의 "작업"부분을 콜백으로 분해하는 것이 아닌가요?

private function constructRulesUsingCallBack($rules, \Languages $langs, $task) { 
    $langRules = []; 
    foreach ($rules as $fieldType => $rule) { 
     foreach ($langs->all() as $lang) { 
      $task($langRules, $fieldType, $lang, $rule); 
     }  
    } 

    return $langRules; 
} 

$langRules = constructRulesUsingCallBack($rules, $langs, function (&$langRules, $fieldType, $lang, $rule) { 
    $langRules[$fieldType . '[' . $lang->lang . ']'] = $rule; 
}); 

나는 아니에요 노소 기정 PHP와, 그리고 (즉, 내가 일할 수있는 인라인 함수 표현에 필요한 보일러의 양에 만족하지,하지만 PHP는 매우 잘 폐쇄를 구현하지 않는 것 때문에 나는 여하튼 운동 할 수 있었다).

그러나 지금 루프를 처리하기 위해 constructRulesUsingCallBack() 함수를있는 그대로두고 해당 루프 내에서 무언가를 처리해야 할 때마다 콜백 본문의 다른 구현을 전달할 수 있습니다.

인 것처럼 보이며, 예를 기반으로합니다. 그렇지 않다면, pls 명확히하고 나는 당신의 요구를 충당하기 위해 이것을 보강 할 수 있습니다.

관련 문제