들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 냄새 22. 데이터 클래스 (Data Class) 데이터 클래스 냄새 public 필드만 있는 클래스 (변경에 취약함) 필드에 대한 Getter/Setter만 있는 클래스 결과적으로는 데이터 클래스 냄새는 Getter / Setter만 있고 비즈니스 로직에 대한 메서드들이 없는 경우 가리킴. 왜 만들어질까? 코드가 적절한 위치에 있지 않기 때문에 이런 냄새가 생길 수 있음. 데이터 클래스의 필드를 사용하는 메서드가 다른 클래스에 존재하기 때문에 '데이터 클래스'가 만들어질 수 있음. 데이터 클래스 냄새 예외 '단계 쪼개기'에서 중간 데이터를 표현하는데 사용할 레코드는 불변 객체로 데이터를 전달하는 용도로 사용할 수 있음. 이 경우는..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 냄새 21. 서로 다른 인터페이스의 대안 클래스들 (Alternative Classes with Different Interfaces) 서로 다른 인터페이스의 대안 클래스 비슷한 일을 여러 클래스에서 서로 다른 규약을 사용해 지원하고 있는 경우를 가리키는 코드 냄새. 하나의 클래스 대신 다른 대안 클래스를 사용하려면, 두 클래스는 동일한 인터페이스를 구현하고 있어야 한다. 리팩토링 '함수 선언 변경하기'와 '함수 옮기기'를 사용해서 서로 동일한 인터페이스를 구현하게끔 코드를 수정할 수 있다. 두 클래스에서 일부 코드가 중복되는 경우에는 '슈퍼 클래스 추출하기'를 사용해 중복된 코드를 슈퍼클래스로 옮기고, 두 클래스를 새로운 슈퍼클래..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 리팩토링 41. 슈퍼클래스 추출하기(Extract Superclass) 슈퍼 클래스 추출하기 두 개 이상의 거대한 클래스가 있고, 상속 구조를 만들 수 있다면 슈퍼 클래스를 추출하면서 클래스의 크기를 줄일 수 있음. 방법 두 개의 클래스에서 비슷한 것들이 보인다면 상속을 적용하고, 슈퍼클래스로 'Pull Up Field' / 'Pull Up Method'를 사용한다. 슈퍼 클래스의 대안으로는 '클래스 추출하기'를 적용해 '위임'을 사용할 수도 있다. 접근 먼저 간단히 상속을 적용한다. 만약 상속 구조가 적절하지 않거나 필요하다면 '슈퍼클래스를 위임으로 교체하기'를 적용한다. 각 클래스에 공통이 되는 부분이 많고, 클래스 자체가 꽤 ..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 냄새 20. 거대한 클래스 (Large Class) 거대한 클래스 어떤 클래스가 너무 많은 일을 하다보면 필드도 많아지고, 중복 코드도 보이기 시작한다. 클라이언트들이 거대한 클래스가 제공하는 기능을 각각 일부만 사용한다면, 각각의 세부 기능을 별도의 클래스로 분리할 수 있다. 리팩토링 방법 '클래스 추출하기'를 사용해 관련있는 필드를 한 곳으로 모을 수 있다. 상속 구조를 만들 수 있다면 '슈퍼 클래스 추출하기' 또는 '타입 코드를 서브클래스로 교체하기'를 적용할 수 있다. 클래스 내부에 산재하는 중복 코드는 '메서드 추출'하여 제거할 수 있다. 거대한 클래스의 문제는 다음과 같다. 클래스의 책임이 많아지면 필드가 많아진다. 필드..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 냄새 19. 내부자 거래 (Insider Trading) '내부자 거래' 냄새는 다음 코드 형태를 의미한다. 어떤 모듈이 다른 모듈의 내부 정보를 지나치게 많이 알고 있는 상태. 이것은 모듈이 강하게 결합되어 있는 것을 의미함. 리팩토링 방법 적절한 모듈로 '함수 옮기기'와 '필드 옮기기'를 사용해 결합도를 낮출 수 있다. (참조하는 필드 기준) 여러 모듈이 자주 사용하는 공통적인 기능은 새로운 모듈을 만들어 잘 관리하거나, '위임 숨기기'를 사용해 특정 모듈의 중재자처럼 사용할 수도 있다. 상속으로 인한 결합도를 줄일 때는 '슈퍼클래스 또는 서브클래스를 위임으로 교체하기'를 사용할 수 있다. 코드로 살펴보기 CheckIn 클래스를..