2011-01-13 4 views
2

3 개의 다른 독점 조건에 대해 처리해야하는 보통 크기의 C 파일에서 작업하고 있습니다. (만약 조건 1이 존재한다면, 2가 존재한다면 다른 것을하고 마찬가지로). 따라서 파일의 여러 위치에서 if/else 검사를 수행해야합니다. 이는 더러워 보입니다. 나는이 수표를 내고있는 곳이 50 곳있다.if-else 검사를 많이하지 마십시오

코드를 더 깨끗하게 보이게하는 더 좋은 방법이 있습니까?

+5

코드의 현재 모습을 보여줄 수 있습니까? –

+0

수업을 필요로하는 것 같지만 C까지는 습득이 불가능합니다. – dzendras

+0

C에서 객체 지향 코드를 시뮬레이트 할 수 있습니다. 상속과 같은 기능을 지원하지 않습니다. –

답변

5

조건이 정말로 배타적이면 3 가지 기능, 즉 각 프로세스마다 하나씩 시작해야합니다. 공통 코드를 세 개의 프로세스 함수에서 호출 할 수있는 자체 함수로 분리하십시오. 조건부 왼쪽은 세 개의 프로세스 함수 중 어느 것을 호출할지 결정해야하는 조건입니다.

+0

감사 빌을 사용할 수 있습니다. 하지만 여기서는 제 50+ 조건 검사 사이에 더 많은 공통 코드가 있습니다. 또한, 이것은 많은 함수 호출이 아니겠습니까? 여기 당신의 도움을 감사하십시오. – hari

+0

@hari : 예, 50 건 이상의 조건 ​​확인이있는 경우 50 개 이상의 함수 호출로 끝날 수도 있습니다. 결과로 나오는 3 개의 최상위 함수는 꽤 선형 적이어야합니다. 왜냐하면 그것들은 단지 일련의 호출 일 것이기 때문입니다. 함수에 설명적인 이름을 지정하면이 코드가 지금까지 읽은 코드 중 가장 읽을 수있는 코드 일 수 있습니다. :) –

+0

도와 줘서 고마워, 빌. – hari

1

제가 이해한다면 - 같은 조건을 반복해서 확인 하시겠습니까?

그렇다면이 코드는 한 번만 사용하고 코드를 복제해야하는 경우이 코드를 기능에 넣으십시오.

1

몇몇 도로는 고려해야 할 그 조건 참조 (또는 참조 할 수있다) 같은 변수에 경우

  • switch 문은 코드를 더 읽기 쉽게하기 위해 도움이 될 수 있습니다.

  • 제어문이 단순한 경우 (예 : 과제) if ... else if ... else ... 구문의 매크로는 #define 수 있습니다.

  • 케이스 사이의 공통 부분이 비교적 작은 경우 세 가지 다른 기능을 정의하는 것이 가장 좋습니다. 그래도 적당한 양의 코드 중복이 발생할 수 있습니다.

  • 공통 부품이 더 큰 경우 기능으로 이동하고 각 부품에 대해 별도의 기능을 정의하십시오. "부분"기능이 너무 복잡 해지면 생성 된 개체 코드의 크기가 커지지 만 대신 매크로를 사용할 수 있습니다. 그런 다음이 "부분"함수 또는 매크로를 사용하여 세 가지 경우 각각에 대해 별도의 함수를 만듭니다.

마지막 두 개의 길은 코드 중복을 최소화하거나 조건부 검사를 하나로 줄입니다.

추신 : "공통 부분"이란 세 가지 경우 중 실제로 활성화되어있는 것에 관계없이 실행되는 코드 부분을 의미합니다.

2

은 두 가지 옵션이 있습니다, 그들은 당신의 상태는 조건이 변경되지 않습니다 의미, C 코드 파일에 걸쳐 같은 경우 코드가)

1.

를 해결하는 문제에 의존하지만, 코드는 작동한다 여러 장소에서 다르게. 즉

/* prepare */ 
if(cond == 1){ 
    /*prepare 1 */ 
}elseif(cond == 2){ 
    /*prepare 2 */ 
} 

/* run */ 
if(cond == 1){ 
    /*run 1 */ 
}elseif(cond == 2){ 
    /* run 2 */ 
} 

이 경우 당신은 단지 하나의 조건으로 일을 리팩토링해야한다. 즉

/* process and run */ 
if(cond == 1){ 
    /* process 1 */ 
    /* run 1 */ 
}elseif(cond == 2){ 
    /* process 2 */ 
    /* run 2 */ 
} 

코드 전체에서 조건이 변경된 경우입니다. 즉코드는 간단하게 리팩토링 너무 복잡이 경우

cond = DEFAULT_COND /* = 1 */; 
/* prepare */ 
if(cond == 1){ 
    cond = prepare_1(); 
}elseif(cond == 2){ 
    cond = prepare_2(); 
} 

/* run */ 
if(cond == 1){ 
    /* run 1 */ 
}elseif(cond == 2){ 
    /* run 2 */ 
} 

때문에 "실행"코드가 있지만,이 경우, "프로세스"코드에 의해 변경되었을 수 있습니다 평가시 COND 변수 이런 경우. 코드를 단일 조건으로 리팩토링 할 수 없게됩니다.