2011-09-22 2 views
1

IF 조건을 Java 및 C# 언어로 좋은 코딩 스타일로 간주하는지 여부를 작성하는이 방법입니까?IF 조건 내에서 메소드를 호출하는 것이 읽기 가능한 것으로 간주됩니까?

if (checkIfIdInFirstRange()){ 
    //call Range1 handling method 
}else if(checkIfIdInSecondRange()){ 
    //call Range2 handling method 
}else{ 
    //call error handling method 
} 

나는 IF 조건 자체 내부의 방법에 대해 궁금 해서요, 또는 그것을 좋아하기 위해 더 좋을 것이다 :

int idInRange = getIdInRange(); 
//handle isInRange 
+0

메소드는 어쨌든 부울 값을 반환 할 수 있으므로, 왜 안 되니? – BoltClock

답변

6

나는 이것이 좋은 생각합니다. 귀하의 질문과 같은 방법, 또는이 if 문

if (thisConditionIsTrue()){ 
    // Do this 
}elseif(anotherConditionIsTrue()){ 
    // Do this instead 
}elseif(isThisParameterOkay(someParameter)){ 
    // Yeh do this 
} 

일부 하드 코어 순수 주의자는 심지어 들여 쓰기> 3 레벨이있는 ​​경우, 귀하의 방법이 너무 중첩이라고 말할 것으로 흐르는 당신 문구 경우

더 나은입니다 더 작은 방법으로 분할되어야합니다.

+0

좋은 지적! 질문의 예와 관련해서는'bool isIdInFirstRange()'와'bool isIdInSecondRange()'와 같은 함수를 사용할 것을 제안합니다. – Stephan

+0

건강한 수준의 들여 쓰기 수준에 대해 더 자세히 읽으려면 가능한 한 내 코드를 유지 관리하기 위해 노력합니다. – medopal

+0

@medopal 호출 된 메서드가 그냥 어떤 조건을 검사하는 한 괜찮습니다. 그러나이 메서드가 응용 프로그램에 대한 중요한 논리를 수행하는 경우에는 전혀 좋지 않습니다. –

4

이렇게하는 것은만큼 부작용이없는 한 좋은 코딩 사례 입니다.

private bool checkIfIdInFirstRange() 
{ 
    return firstRange.Contains(ID); 
} 

그러나이 혼란을 만들 수 있습니다 일 :

checkIfIdInFirstRange() 경우이 OK입니다

private bool checkIfIdInFirstRange() 
{ 
    SomeStringProperty = "totally new value that no caller would ever expect after a call to this method"; 

    return firstRange.Contains(ID); 
} 

또 다른 가능한 해결책 - 손에서 문제의 실제 유형에 따라 - 수 인터페이스/기본 클래스를 정의하고 다형성을 사용합니다.

예 :

internal abstract class A 
{ 
    public void DoSomething(int ID) 
    { 
    if(IsInRange(ID)) 
     DoSomethingProtected(ID); 
    } 

    protected abstract bool IsInRange(int ID); 

    protected abstract void DoSomethingProtected(int ID); 
} 


internal class B : A 
{ 
    private List<int> firstRange = new List<int> { 42, 23, 5}; 
    protected override bool IsInRange(int ID) 
    { 
    return firstRange.Contains(ID); 
    } 
    protected override void DoSomethingProtected(int ID) 
    { 
    Console.WriteLine("{0}", ID); 
    } 
} 


public class Program 
{ 
    public static void Main(string[] args) 
    { 
    B foo = new B(); 
    foo.DoSomething(3); 
    foo.DoSomething(42); 
    } 
} 

주의 : IDE없이 작성 코드가 손에.

+3

술어 메서드의 부작용은 일반적으로 나쁜 것입니다. 그러나이 방법의 이름이 순수한 술어가 아니라는 것을 분명히 알게되면 독자가 그다지 문제가되어서는 안된다. 예를 들어 'tryToMove'라는 메서드가 있습니다 ... –

0

어, 대부분 코더에 달렸지 만 int를 선언하는 것은 약간 더 읽기 쉽습니다.

+0

항상 코더에 달렸지 만 다른 코더에서 읽을 수 있는지 묻는 질문이있었습니다. – medopal

0

IF 조건문에 메서드를 작성할 수 있습니다. 그러나 메서드가 두 번 이상 사용될 경우 먼저 반환 값을 저장하고 변수를 IF 조건으로 사용해야합니다.

0

코드를 작성하는 함수/메서드 이름을 작성할 수 있습니다 사용되는 곳에서 더 읽기 쉽습니다. 마찬가지로 : - isIdInFirstRange

마지막으로이 같은 경우 - 다른 사람 (및 스위치) 사다리를 피하려고

if (idInFirstRange()){ 
    //call Range1 handling method 
}else if(idInSecondRange()){ 
    //call Range2 handling method 
}else{ 

또한, 부울을 리턴하는 함수에 대한 일반적인 규칙은 is로 시작한다는 것입니다. 이런 경우 사전을 사용해보십시오. (https://stackoverflow.com/questions/6506340/if-if-else-or-switch-case/6506403#6506403)

1

예. 작은 공백을 사용하면 훨씬 더 읽기 쉬울 것입니다. 그런 식으로 끝내면 어디서 일을 시작하고 끝내는 지 알 수 없으며 else if()은 함수 호출처럼 보입니다.여분의 변수를 만들기

if (checkIfIdInFirstRange()) { 
    //call Range1 handling method 
} 
else if (checkIfIdInSecondRange()) { 
    //call Range2 handling method 
} 
else { 
    //call error handling method 
} 

당신이 경우/다른 스택 전에 그들 모두를 정의 할 필요가 있기 때문에 더 열심히 코드를 읽을 수 있도록 가능성이 높습니다. 그러나 모든 것은 사건에 달려 있습니다. 값 비싼 함수를 여러 번 사용하거나 변수가 함수보다 설명적인 이름을 만들 수있는 경우 변수를 사용하는 것이 더 나을 수도 있습니다.

1

실제로 여러 가지 방법을 테스트하고 단락 회로 평가를 사용하려는 경우에도 필요합니다.

는 예를 들어,이 안전 :

if (isResourceAvailable() && isResourceValid()) { 
    ... 
} 

이 더있을 수도 있지만 :

bool resAvailable = isResourceAvailable(); 
bool resValid = isResourceValid(); // can you call that alone? 

if (resAvailable && resValid) { 
    ... 
} 
+0

여기서는 Short-Circuiting을 사용하는 것이 좋겠지 만,이 특정한 경우에는 isAvailable을 isValid 안에 넣을 것입니다.하지만 감사합니다. – medopal

1

그것은 좋은 스타일로 당신이 호출하는 방법이 바로 그렇지 않은 것 무언가를 같이하다

if (a > 0 && a < 10) doSomething(); 

보다 나은

입니다 :이 자리에 코딩 된 경우 명확하게
if (isInRange(a, 0, 10)) doSomething(); 
관련 문제