냄새 16. 임시 필드

    들어가기 전

    이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 


    냄새 16. 임시 필드(Temporary Field)

    • 클래스에 있는 어떤 필드가 특정한 경우에만 값을 갖는 경우.
      • 어떤 필드가 특정한 경우에만 값을 갖는 경우, 그 특정한 경우가 아닐 때는 해당 클래스의 해당 필드가 임시 값을 가진다. 따라서 임시변수라고 의미한다. 
      • 어떤 객체의 필드가 '특정한 경우에만' 값을 가진다는 것을 이해하는 것은 일반적으로 예상하지 못하기 때문에 이해하기 어렵다.
    • 관련 리팩토링
      • '클래스 추출하기'를 사용해 해당 변수들을 옮길 수 있다.
      • '함수 옮기기'를 사용해서 해당 변수를 사용하는 함수를 특정 클래스로 옮길 수 있다.
      • '특이 케이스 추가하기'를 적용해 '특정한 경우'에 해당하는 클래스를 만들어 해당 조건을 제거할 수 있다. 

     

    클래스의 어떤 필드가 있고, 그 값이 임시적인 값이라고 보자. 예를 들어 일반적인 기본값은 null, "EMPTY" 같은 형태가 존재할 수 있을 것이다. 이런 임시적인 값을 '임시 필드 냄새'로 표현한다. 항상 값이 있는 필드와 임시 필드가 한 객체에 섞여있으면, 해당하는 클래스가 '어떤 경우에 임시 필드에 값을 가지는지'에  대해 이해하는데 많은 시간을 사용해야 한다. 

    임시적인 필드가 들어있다면, 최악의 경우에는 이렇게 더 코드가 더러워 질 수 있다.

    1. 이런 경우에 임시적인 필드의 값을 가진다. → 이걸 표현하는 코드 추가
    2. 임시적인 필드에 값이 있는 경우 이런 식으로 동작하고, 없다면 저런식으로 동작하고. → If ~ Else문 추가

    따라서 임시적인 필드를 제거하는 것이 중요하다. 

    이 때 가능한 리팩토링은 다음과 같다.

    • 클래스를 하나 만들고, 임시 필드와 해당되는 메서드들을 옮기는 형식
      • 임시 필드와 항상 값을 가지는 객체가 분리되면서, 의미를 더욱 명확히 할 수 있다.
    • 특이케이스로 추출하기 

    요지는 '임시 필드와 항상 값을 가지는 객체를 분리'시키는 것이다. 이를 통해 특정 케이스에만 값을 가지는 로직을 따로 고려하지 않아도 되게 된다. 

    댓글

    Designed by JB FACTORY