#[코드 재구성의 길]if/else-판단 논리 조정, 추출 방법, 논리 최적화

4826 단어 재구성
카탈로그
1. 앞말
2. 방법
3. 분해 조건 표현식 - 복잡한 조건의 분해
4. 병합 조건 표현식 - 반복된 반환 결과
5. 중복된 조건 세션-중복 코드 병합

1. 앞말


if/else는 자바 언어의 가장 기초적인 기능이다. if/else는 필수적이지만 if/else를 남용한다. 특히 각종 대량의 if/else 플러그인은 코드의 가독성, 유지보수성에 큰 해를 끼칠 수 있기 때문에 코드를 읽는 사람에게 재난이다.
코드를 재구성하는 목적은if/else를 없애는 것이 아니라, 모두가if/else를 어떻게 잘 쓰는지 하는 것이다

2. 방법


본 블로그에서 제가 소개한 방법은 판단 논리를 조정하고 추출하는 방법, 논리 최적화입니다. 이번에는 다음과 같은 재구성 기법을 소개합니다.
분해 조건 표현식
결합 조건식
반복되는 조건 세션 병합
우선 분해 조건 표현식if/else의 사용 장면, 복잡한 조건(if-then-else) 문장을 살펴보자.

3. 분해 조건 표현식 - 복잡한 조건의 분해


사례:
이전에 돼지고기의 자유를 예로 들면 내가 돼지고기를 사는 가격(가격=중량*단가)을 계산하려고 했는데 가격은 돼지고기의 자유 전과 자유 후의 단가가 다르다.
if(date.before(pigfreedom_start) || date.before(pigfreedom_end) )

    price = weight * pigfreedomRate;

else price = weight * normalRate;

원인 분석:
복잡한 조건 논리는 종종 코드의 가독성을 떨어뜨려서 왜 이렇게 썼는지, 이렇게 쓴 의미가 무엇인지 알 수 없게 한다.
방법:
  • if단락을 추출하여 여러 개의 독립 함수로 분해하고 각 작은 블록 코드의 용도에 따라 함수에 명명
  • 원 함수에 대응하는 코드를 교체하고 새로 만든 함수를 호출하여 자신의 의도를 명확하게 표현한다
  • //   
    if(date.before(pigfreedom_start) || date.before(pigfreedom_end) )
    
        price = weight * pigfreedomRate;
    
    else price = weight * normalRate;
    
    //      
    if(isPigFreedom(date))
    
        price = pigFreedomAfter(weight);
    
    else price = pigFreedomBefore(weight);
    
    private boolean isPigFreedom(Date date){
        return date.before(pigfreedom_start) || date.before(pigfreedom_end);
    }
    
    private double pigFreedomBefore(int weight){
        return weight * normalRate;
    }
    
    private double pigFreedomAfter(int weight){
        return weight * pigfreedomRate;
    }

     

    4. 병합 조건 표현식 - 반복된 반환 결과


    병합 조건 표현식if/else의 사용 장면, 일련의 조건 테스트, 모두 같은 결과를 되돌려줍니다.
    사례:
    String buyPork(){
        if (pig_price > 30) return "not buy";
        if (pig_weight < 500) return "not buy";
        if (notPigQuality) return "not buy"; 
    }

    원인 분석:
    이상의 일련의 검사를 통해 우리는 검사 조건이 각각 다르지만 최종 행위는 일치한다는 것을 발견했다.
    원래 코드가 표현한 정보는 다음과 같다. 여기에 일련의 조건 검사가 있는데 동시에 판단하고'동시 발생'을 해야 한다.무엇을 할 것인가
    우리가 필요로 하는 표현은 한 번의 조건 검사만 있으면 되고 여러 개의'병렬'조건만 검사해야 한다는 것이다.왜 그랬을까
    방법:
  • 이 조건문들이 합병의 필요성이 있는지, 부작용이 있는지 확인한다.
  • 적당한 논리 조작부호(&||)를 사용하여 일련의 관련 조건 표현식을 하나로 통합
  • //   
    String buyPork(){
        if (pig_price > 30) return "not buy";
        if (pig_weight < 500) return "not buy";
        if (notPigQuality) return "not buy"; 
    }
    
    //        ,     
    String buyPork(){
        if ((pig_price > 30) || (pig_weight < 500) || (notPigQuality)) 
            return "not buy";
    }
    
    //      --   
    String buyPork(){
        if (isNotBuyPork())  return "not buy";
    }
    
    boolean isNotBuyPork(){
        return ( (pig_price > 30) || (pig_weight < 500) || (notPigQuality) );
    }

    보충: 논리와 사용
    //   
    String buyPork(){
        if(pig_price < 30){
            if(pig_weight > 500){
                if(pigQuality){
                     return "buy";
                }               
            }
        }else{
            return "not buy";
        }
    }
    
    //        ,     
    String buyPork(){
        if( (pig_price < 30) && (pig_weight > 500) && (pigQuality) ) return "buy";
        else return "not buy";
    }
    
    //      
    String buyPork(){
        if(isBuyPork()) return "buy";
        else return "not buy";
        //     
        //return if(isBuyPork()) ? "buy" : "not buy";
    }
    
    boolean isBuyPork(){
        return ( (pig_price < 30) && (pig_weight > 500) && (pigQuality) );
    }
    

    5. 중복된 조건 세션-중복 코드 병합


    반복되는 조건 세션if/else의 사용 장면을 병합하여 조건 표현식의 각 지점에 같은 코드를 가지고 있습니다.
    사례:
    if(isPigFreedom){
        total = price * 0.98;
        buy();
    }else{
        total = price * 0.85;
        buy();
    }

    원인 분석:
    조건 표현식의 모든 지점이 같은 단락의 코드를 실행하여 코드가 불필요하게 생겼다.
    방법:
  • '실행 방식이 조건에 따라 변하지 않는다'는 코드를 구분
  • 공통 코드의 위치에 따라 이동 코드
  • //   
    if(isPigFreedom){
        total = price * 0.98;
        buy();
    }else{
        total = price * 0.85;
        buy();
    }
    
    //      
    if(isPigFreedom){
        total = price * 0.98;
    }else{
        total = price * 0.85;
    }
    buy();

    사고:
  • 이상에 적용됩니까?
  • 공통 코드가 한 곳에 그치지 않으면 어떻게 처리합니까?

  •  
    추천서적: 기존 코드의 디자인 재구성 개선

    좋은 웹페이지 즐겨찾기