ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 클린코드 함수 - switch 문
    개발/프로그래밍 2020. 9. 27. 19:54

    switch 문 은 보통 함수가 길어질수밖에없다. 그래서 최대한 단 한번만 사용하는것이 좋다.

     

    Money calculatePay(Employee e){
        switch(e.type){
        	case COMMISIONED
              return calculateCommisionedPay(e);
            case HOURLY
              return calculateHourlyPay(e);
            case SALARIED
              return calculateSalariedPay(e);
            default :
              throw InvalidEmployeeType(e.type);        
        }
    }

    위와같은 switch 문은 여러 문제점을 가지고있다.

    동일한 구조를 가진 여러 함수들을 만들어야할 가능성이 많기 떄문이다.

    isPayday(Employee e, Date date) 

    고용 타입에따라 또 switch 문을 구현해야 급여일인지 아닌지 리턴하는 함수를 만들수있을것이고

    deliverPay(Employee e, Money pay)

    고용 타입에따라 또 switch 문을 구현해야 급여를 지급하는 함수를 만들것이다.

     

    이런 식으로 아주 많은 switch 문을 만들어야 할지 모른다.

    고용 타입이 또하나 생기게된다면 모든 switch문을 돌며 수정해야할것이다.

     

    클린코드에서는 switch문을 추상 팩토리에 숨기길 권장한다.

    추상 팩토리에서는 switch문을 통해 적절한 Employee 인스턴스를 생성할것이다.

    abstract class Employee{
      abstract bool isPayday();
      abstract Money calculatePay();
      abstarct void deliverPay(Money pay);
    }

    Employee 추상클래스를만들고

    추후에 고용 타입에따라 Employee를 오버라이드 해서 추상 함수를 구현하면 된다.

     

    interface EmployeeFactory{
      Employee makeEmployee(EmployeeRecord r);
    }

     

    class EmployeeImpl implements EmployeeFactory{
      makeEmployee(EmployeeRecord r){
        switch(r.type){
          case COMISSIONED:
            return ComissionedEmployee(r);
          case HOURLY:
            return HourlyEmployee(r)l
          case SALARIED:
            return SalariedEmployee(r);
          default:
            throw InvalidEmployee(r.type);
        }
      }
    }

    CommissionedEmployee 같은 각각 파생 클래스들은 Employee 추상 클래스를 오버라이드해서 각각 맞게 구현 하면된다.

    그러고 변경사항이 생길시 추후에는 저 팩토리만 수정하면 될것이다.

    이렇게 되면 단 하나의 switch 문을 사용해서 여러 기능을 구현할수있게 된다.

     

    댓글

Designed by Tistory.