2010-06-03 4 views
6

함수가 몇 군데에서 호출되고 실행할 조건이 충족되어야하는 경우 해당 조건을 어디에 검사해야합니까? 내 경우에는 드로잉을위한 것입니다. 마우스 버튼을 누르고 있으면 그리기 로직을 ​​실행합니다 (드래그 할 때의 마우스 이동 핸들러에서 수행됩니다).모범 사례 - 함수 실행의 조건부를 평가할 때

옵션 하나는 함수에 넣으라고합니다. 그것은 검사받는 것이 보장됩니다. 원한다면 추상화됩니다.

public function Foo() { 
    DoThing(); 
} 

private function DoThing() { 
    if (!condition) return; 
    // do stuff 
} 

나는이 함께이 문제는 멀리 DoThing에서 할 수있다 Foo의 코드를 읽을 때, 그것은 버그처럼 보이는 것입니다. 첫 번째 생각은 조건이 점검되지 않는다는 것입니다.

옵션 2는 전화하기 전에 확인해야합니다.

public function Foo() { 
    if (condition) DoThing(); 
} 

더 읽기는하지만 이제는 어디에서나 전화를 걸면 걱정할 필요가 없습니다.

옵션 3은 함수의 이름을보다 구체적으로 변경하는 것입니다.

public function Foo() { 
    DoThingOnlyIfCondition(); 
} 

private function DoThingOnlyIfCondition() { 
    if (!condition) return; 
    // do stuff 
} 

"올바른"해결책입니까? 아니면 좀 지나치게 먼가요? 이 함수 이름이 모두 코드를 복제하기 시작하면 모든 것이 같았다고 생각합니다.

이것은 주관적입니다 : 당연히 옳은 대답은 아니지만 여기에도 여전히 완벽하다고 생각합니다. 보다 나은 프로그래머의 조언을 얻는 것이 내가 배우는 두 번째 방법입니다. 주관적인 질문은 Google이 대답 할 수없는 것과 정확히 같습니다.

답변

5

DRY에 따르면, 나는 첫 번째 것으로 갈 것입니다. 당신이 패턴에 익숙해지면

public function Foo() { 
    DoThing(); 
} 

private function DoThing() { 
    if (!condition) return; 
    // do stuff 
} 

, 그렇게 코드에서 고독한 DoThing()을보고 부담스러워 아닙니다. 당신은 EnsureThingDone()처럼 그것을 읽기 시작할 것입니다. 나는 함수 내부의 전제 조건을 확인하고자

+2

이것은 구조 질문에 응답합니다. 이름에 관해서는, 조금 더 생각하면 알기 쉽고 반복적이지 않은 대안이 생겨야한다. 아마도 DoThing()을위한'DrawOnDrag()'의 정점에있을 것입니다. – Novelocrat

0

,

public function DoThing() 
{ 
    ValidatePreconditions(); 
    DoWork(); 
} 

private function DoWork() 
{ 
    //Do the actual work; 
} 

이 방법은 내가 모든 적절한 전제 조건 내 함수의 실행 전에 충족 확신하고 소비자가 unnecesary 코드 매를 추가 할 필요가 없습니다 내 함수가 호출되는 시간.

0

유형 시스템을 사용할 수 있습니다. 전제 조건이 전달되는 경우에만 인스턴스화 할 수있는 객체를 DoThing하도록 매개 변수를 만듭니다.

이렇게하려면 깔끔한 방법은 DoThing을 해당 개체에서 인스턴스 메서드로 만드는 것입니다.

2

옵션 4는 세 번째 함수에서 술어와 실제 호출을 래핑합니다.

function DoThing() { 
    // do stuff 
} 

function DoThingOnlyIfCondition() { 
    if (!condition) return; 
    DoThing(); 
} 

function Foo() { 
    DoThingOnlyIfCondition(); 
} 

// Foo version 2 
function FooBar() { 
    DoThing(); 
} 

이제 Foo 또는 가장 적합한 DoXXX() 버전을 사용할 수있는 기능이 무엇이든간에.