들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 리팩토링 38. 중재자 제거하기 (Remove Middle Man) '중재자' 냄새는 다음과 같다. 캡슐화가 과도한 경우, 너무 많은 메서드가 단순 위임 메서드가 될 수 있다. 왜 클래스를 바로 호출하지 않고 위임해서 호출하는거지? 라는 생각이 들 때, 코드는 '중재자 냄새'를 풍긴다. '위임 숨기기'의 반대에 해당하는 리팩토링임. 필요한 캡슐화의 정도는 시간 / 상황 / 사람에 따라 바뀔 수 있다. 따라서 중재자 / 위임 숨기기의 리팩토링을 적절히 균형을 맞추는 것이 좋다. 캡슐화의 정도를 '중재자 제거하기'와 '위임 숨기기' 리팩토링을 통해 조절할 수 있다. 리팩토링 방법 위임하고 있는 객체를 클라이언트가 사용할 수 있도록 ge..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 냄새 18. 중재자 (Middle Man) '중재자' 냄새는 다음을 의미한다. 캡슐화가 과도해서, 많은 메서드가 단순히 메서드 체이닝을 랩핑하는 '중재자 냄새'로 판단할 수 있음. 메서드 체인의 반대에 해당하는 냄새다. 캡슐화 캡슐화를 통해 내부의 구체적인 정보를 최대한 감출 수 있다. 그러나 어떤 클래스의 메서드가 대부분 다른 클래스로 메서드 호출을 위임하고 있다면 중재자를 제거하고 클라이언트가 해당 클래스를 직접 사용하도록 코드를 개선할 수 있음. 관련 리팩토링 '중재자 제거하기' 리팩토링을 사용해 클라이언트가 필요한 클래스를 직접 사용하도록 개선할 수 있음. '함수 인라인'을 사용해 메서드 호출한 쪽으로 코드를 보내서 중재자를..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다 리팩토링 37. 위임 숨기기 (Hide Deligate) 캡슐화란 어떤 모듈이 시스템의 다른 모듈을 최소한으로 알아야 한다는 것이다. 그래야 어떤 모듈을 변경할 때, 최소한의 모듈만 그 변경에 영향을 받는다. 그런 상태일 때만 코드의 확장 변경이 손쉽다. 객체 지향은 '필드를 메서드로 숨기기'도 있지만, '메서드를 메서드로 숨기기'도 가능하다. person.department().manager(); → person.getManager() (메서드 체이닝을 메서드로 숨김 : 위임 숨기기) 이전의 코드는 Department를 통해 Manager에 접근할 수 있다는 정보를 알아야 하지만, getManager()를 통해 위임을 숨긴다면 클라..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 냄새 17. 메세지(메서드) 체인 (Message Chains) 메세지(메서드) 체인 냄새는 다음을 의미함. 레퍼런스를 따라 계속해서 메서드 호출이 이어지는 코드. this.member.getCredit().getLevel().getDescription() 문제점 해당 코드를 사용하는 클라이언트는 코드 체인을 모두 이해해야 함. 체인 중 일부가 변경된다면 클라이언트의 코드도 변경해야함. 관련 리팩토링 '위임 숨기기'를 사용해 메세지 체인을 캡슐화를 할 수 있음. '함수 추출하기'로 메세지 체인 일부를 함수로 추출한 다음, '함수 옮기기'으로 해당 함수를 적절한 이동을 할 수 있다. (함수 추출하기 → 함수 옮기기) 메서드 체인은 왜..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 냄새 16. 임시 필드(Temporary Field) 클래스에 있는 어떤 필드가 특정한 경우에만 값을 갖는 경우. 어떤 필드가 특정한 경우에만 값을 갖는 경우, 그 특정한 경우가 아닐 때는 해당 클래스의 해당 필드가 임시 값을 가진다. 따라서 임시변수라고 의미한다. 어떤 객체의 필드가 '특정한 경우에만' 값을 가진다는 것을 이해하는 것은 일반적으로 예상하지 못하기 때문에 이해하기 어렵다. 관련 리팩토링 '클래스 추출하기'를 사용해 해당 변수들을 옮길 수 있다. '함수 옮기기'를 사용해서 해당 변수를 사용하는 함수를 특정 클래스로 옮길 수 있다. '특이 케이스 추가하기'를 적용해 '특정한 경우'에 해당하는 클래스를 만들어 해당 조건을..