들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 리팩토링 40. 서브클래스를 위임으로 바꾸기 (Replace Subclass With Delegate) 어떤 객체의 행동이 카테고리에 따라 바뀐다면, 보통 상속을 사용해서 일반적인 로직은 슈퍼클래스에 두고 특이한 케이스에 해당하는 로직을 서브클래스를 사용해 표현한다. 하지만 대부분의 프로그래밍 언어에서 상속은 오직 한번만 사용할 수 있다. 만약 어떤 객체를 두 가지 이상의 카테고리로 구분해야 한다면? 위임을 사용하면 얼마든지 여러가지 이유로 여러 다른 객체로 위임을 할 수 있다. 슈퍼클래스가 바뀌면 모든 서브클래스에 영향을 줄 수 있다. 따라서 슈퍼클래스를 변경할 때 서브 클래스까지 신경써야한다. 만약 서브클래스가 전혀 다른 모듈에..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 리팩토링 39. 슈퍼클래스를 위임으로 바꾸기 (Replace Superclass with Delegate) 객체지향에서 '상속'은 기존의 기능을 재사용하는 쉬우면서 강력한 방법이지만, 때로는 적절하지 않은 경우도 있다. 서브클래스는 슈퍼클래스의 모든 기능을 지원해야 한다. Stack이라는 자료구조를 만들 때, List를 상속받는 것이 좋을까? 다 지원하는 것은 맞지 않다. 따라서 Stack / List는 상속 구조에 어울리지 않음. 서브 클래스는 슈퍼클래스 자리를 대체하더라도 잘 동작해야 한다. 리스코프 치환 원칙 서브클래스는 슈퍼클래스의 변경에 취약하다. 그렇다면 상속을 사용하지 않는 것이 좋은가? 상속은 적절한 경우에 사용하다면..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 리팩토링 38. 중재자 제거하기 (Remove Middle Man) '중재자' 냄새는 다음과 같다. 캡슐화가 과도한 경우, 너무 많은 메서드가 단순 위임 메서드가 될 수 있다. 왜 클래스를 바로 호출하지 않고 위임해서 호출하는거지? 라는 생각이 들 때, 코드는 '중재자 냄새'를 풍긴다. '위임 숨기기'의 반대에 해당하는 리팩토링임. 필요한 캡슐화의 정도는 시간 / 상황 / 사람에 따라 바뀔 수 있다. 따라서 중재자 / 위임 숨기기의 리팩토링을 적절히 균형을 맞추는 것이 좋다. 캡슐화의 정도를 '중재자 제거하기'와 '위임 숨기기' 리팩토링을 통해 조절할 수 있다. 리팩토링 방법 위임하고 있는 객체를 클라이언트가 사용할 수 있도록 ge..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 냄새 18. 중재자 (Middle Man) '중재자' 냄새는 다음을 의미한다. 캡슐화가 과도해서, 많은 메서드가 단순히 메서드 체이닝을 랩핑하는 '중재자 냄새'로 판단할 수 있음. 메서드 체인의 반대에 해당하는 냄새다. 캡슐화 캡슐화를 통해 내부의 구체적인 정보를 최대한 감출 수 있다. 그러나 어떤 클래스의 메서드가 대부분 다른 클래스로 메서드 호출을 위임하고 있다면 중재자를 제거하고 클라이언트가 해당 클래스를 직접 사용하도록 코드를 개선할 수 있음. 관련 리팩토링 '중재자 제거하기' 리팩토링을 사용해 클라이언트가 필요한 클래스를 직접 사용하도록 개선할 수 있음. '함수 인라인'을 사용해 메서드 호출한 쪽으로 코드를 보내서 중재자를..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다 리팩토링 37. 위임 숨기기 (Hide Deligate) 캡슐화란 어떤 모듈이 시스템의 다른 모듈을 최소한으로 알아야 한다는 것이다. 그래야 어떤 모듈을 변경할 때, 최소한의 모듈만 그 변경에 영향을 받는다. 그런 상태일 때만 코드의 확장 변경이 손쉽다. 객체 지향은 '필드를 메서드로 숨기기'도 있지만, '메서드를 메서드로 숨기기'도 가능하다. person.department().manager(); → person.getManager() (메서드 체이닝을 메서드로 숨김 : 위임 숨기기) 이전의 코드는 Department를 통해 Manager에 접근할 수 있다는 정보를 알아야 하지만, getManager()를 통해 위임을 숨긴다면 클라..