2011-09-07 8 views
5

메서드 호출, 예를 들어 ClassA.search (a, b, flag)가 3 개의 컨트롤러에서 사용되고있는이 코드가 발생했습니다. 다음은이 방법의 단순화 된 버전입니다.이것은 방법을 재사용/공유하는 좋은 방법입니까?

public List<Result> search(Object a, Object b, boolean flag) { 
    //do some code logic here, common to the 3 controllers 
    //at the middle there is: 
    if (flag) { 
     //code that affects 2 Controllers 
    } else { 
     //code affects only 1 
    } 
    //some more common code 
    //some more code with the flag if else 
} 

코드가 재사용되었으므로이 방법을 사용하는 것이 좋습니다. 또는 코드 재사용을 가능하게하지만 메소드 호출자 (클라이언트) 코드 사용자 정의 (이 코드를 세 가지 다른 메소드로 분할했지만 여전히 공통 코드 리팩터링 메소드를 선언 할 수 있음)에이 플래그를 도입하지 않는 것이 더 좋은 방법일까요?

답변

6

는 첫째, 추출 기능을 가진 라인을 주석 :

public void search(Object a, Object b, boolean flag) 
{ 
    commonToThree(); 
    if (flag) 
    { 
     affectTwoControllers(); 
    } 
    else 
    { 
     affectsOnlyOne(); 
    } 
    alsoCommon(); 
} 
이제 코드 냄새 flag 부울 인수, 제거

:

public void searchWithTrueFlag(Object a, Object b) { 
    commonToThree(); 
    affectTwoControllers(); 
    alsoCommon(); 
} 

public void searchWithFalseFlag(Object a, Object b) { 
    commonToThree(); 
    affectsOnlyOne(); 
    alsoCommon(); 
} 
+0

로컬 변수를 필드로 변환하여 작동시키지 않는다면 이에 동의 할 것입니다. –

+0

왜 지역 변수가 잘못 되었습니까? 매개 변수를 통해 반복적으로 전달해야하는 상태가 중요 할 경우 생성자의 마지막 필드로 초기화 된 상태로 한 번만 객체를 만들고 한 번만 사용하십시오. 스테로이드 기능 ;-). –

+0

그렇지만 필드가있는 클래스 (및 생성자?)를 추가하는 것은 하나의 플래그를 피하기위한 많은 작업입니다. ;) –

3

좋지만 좋지는 않습니다. 하나의 부울은 의미가 있지만 더 많이 추가하면 올바른 방향으로 들어 가지 않습니다.

항상 불가능하지만, 일반적으로 수행하는 더 나은 코드를 얻을 수 :

functionOne: 
    sharedCodeOne() 
    specificCode 
    sharedCodeTwo() 

functionTwo: 
    sharedCodeOne() 
    specificCode 
    sharedCodeTwo() 

언제나처럼, 일반화 된 주장을하기 어렵다 :이 항상 분명 실제/수 없습니다.

+1

+1 : 코드의 세 섹션이 로컬 변수를 공유하지 않는 경우에 유용합니다.(또는 소수만 공유) –

+1

@Peter : 나는 완전히 동의합니다 - 저는 이것이 지역 변수의 수와 범위를 줄이기 위해 실제로이 접근 방식을 사용하는 것이 유리하다고 생각합니다. (어떤 사람들은 그것들을 둘러싸고있는 수업의 들판으로 바꾸어 사물을 엉망으로 만든다.) –

+1

@ Englen, 나는이 일을하기 위해 필드를 추가하는 것이 좋지 않다는 것에 동의한다. –

0

비교적 간단한 방법입니다. 대안이 있지만 더 복잡 할 수 있습니다. (방문자를 건네거나 컨트롤러의 메서드를 호출하여 해당 컨트롤러에서 수행 할 작업을 말한 경우)

이 방법은 코드의 세 섹션간에 로컬 변수를 공유하는 경우에 가장 적합하며 대신 필드를 사용해야합니다.

0

내가 대답하려고 다른 접근 방식을 취할 것 일반적인 방법 으로이 질문 :

주요 목표 깨끗한 코드해야합니다. 정확히 이것은 정확히 어떤 경우에 달려 있습니다. 그러나 여러 곳에서 코드를 복사하여 붙여 넣는 것이 좋지 않습니다. 변경해야 할 경우 여러 곳을 변경해야하기 때문에 한 곳 이상의 부품이 사용하는 공통 부분을 추출하는 것은 좋지 않습니다. 모든 상황에서 그들.

코드를 읽는 사람 (또는 지금부터 몇 주일 후이 작업을 수행해야하는 사람)이 항상 가능한 일을 빨리 이해해야한다는 것을 상상해보십시오. 그래서, 어떤 경우를 복사하거나 일반적인 방법으로 추출하는 것이 더 나은 경우에 따라 달라집니다.

플래그 자체가 나쁘지는 않지만 실제로는 자바 메소드에서 과도하게 사용해야하는 것은 아닙니다. 종종 이러한 상황은 메소드를 오버로딩하고 다른 메소드를 사용함으로써 잘 해결 될 수 있습니다. 따라서 일반적인 경우는 하나에서 수행되고 다른 하나에서는 특별한 추가가 수행됩니다. 또는 여러 하위 메서드를 포함하고 여러 메서드를 호출하여 메서드를 작성할 수 있지만 너무 많은 매개 변수를 전달할 필요가없는 경우에만 의미가 있습니다.

한 가지 규칙 (완전히 주관적이지만 많은 프로젝트에서 얻은 교훈에 기반 함)을 제공 할 수 있습니다. 구체적인 구현 방법에 대한 일반적인 구현 방법을 선호하십시오. 코드가 더 많아지고 영리하지는 않지만 이해하고 확장하고 디버그하는 것이 훨씬 쉽습니다.

관련 문제