들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 냄새 24. 주석(Comments) 주석을 남겨야 할 것 같다면 먼저 코드를 리팩토링 하라. 불필요한 주석을 줄일 수 있다. 주석은 좋은 냄새에 해당한다. 주석 중 일부는 안 좋은 코드 냄새를 나타내기도 하기 때문이다. 예를 들어 주석 자체가 '긴 메서드 냄새'를 암시하는 힌트가 될 수도 있다. 관련 리팩토링 '함수 추출하기'를 사용해 설명이 필요한 부분을 별도의 메서드로 빼낸다. '함수 선언부 변경하기'를 사용해 함수 이름을 재정의 할 수 있다. (함수의 이름이 직관적이지 않은 경우) 시스템적으로 어떤 필요한 규칙(Validation)이 있다면, 'Assertion 추가하기'를 적용할 수 있다. 주석으로 시스템적으로 가정하고 있는..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 냄새 23. 상속 포기 (Refused Bequest) 상속 포기 냄새 서브 클래스가 슈퍼 클래스에서 제공하는 메서드나 데이터를 잘 활용하지 않는다는 것은 해당 상속 구조에 문제가 있음을 의미함. 즉, 슈퍼 클래스에서 제공하는 기능이 공통 기능에 어울리지 않음을 의미함. 리팩토링 방법 기존의 서브클래스 또는 새로운 서브 클래스를 만들고 슈퍼클래스에서 '메서드와 필드를 내려주면 (Push Down Method / Field)' 슈퍼클래스에 공통으로 사용하는 기능만 남길 수 있다. 서브클래스가 슈퍼클래스의 기능을 재사용하고 싶지만, 인터페이스를 따르고 싶지 않은 경우에는 '슈퍼클래스 또는 서브클래스를 위임으로 교체하기' 리팩토링을 적용..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 리팩토링 42. 레코드 캡슐화 하기(Encapsulate Record) 변하는 데이터를 다룰 때는 레코드보다는 객체를 선호한다. 책에서 말하는 '레코드'란, public 필드로 구성된 데이터 클래스를 말함. (자바의 Record와는 다름) 데이터를 메서드 뒤로 감추면 객체의 클라이언트는 어떤 데이터가 저장되어 있는지 신경 쓸 필요가 없다. 필드 이름을 변경할 때 점진적으로 변경할 수 있다. 하지만 자바의 Record는 불변 객체라서 이런 리팩토링이 필요없다. 리팩토링 public 필드를 private 필드로 변경 Getter / Setter를 통해 필드에 접근하도록 변경. 책에서 이야기하는 Records는 public한 필드로 구성..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 냄새 22. 데이터 클래스 (Data Class) 데이터 클래스 냄새 public 필드만 있는 클래스 (변경에 취약함) 필드에 대한 Getter/Setter만 있는 클래스 결과적으로는 데이터 클래스 냄새는 Getter / Setter만 있고 비즈니스 로직에 대한 메서드들이 없는 경우 가리킴. 왜 만들어질까? 코드가 적절한 위치에 있지 않기 때문에 이런 냄새가 생길 수 있음. 데이터 클래스의 필드를 사용하는 메서드가 다른 클래스에 존재하기 때문에 '데이터 클래스'가 만들어질 수 있음. 데이터 클래스 냄새 예외 '단계 쪼개기'에서 중간 데이터를 표현하는데 사용할 레코드는 불변 객체로 데이터를 전달하는 용도로 사용할 수 있음. 이 경우는..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 냄새 21. 서로 다른 인터페이스의 대안 클래스들 (Alternative Classes with Different Interfaces) 서로 다른 인터페이스의 대안 클래스 비슷한 일을 여러 클래스에서 서로 다른 규약을 사용해 지원하고 있는 경우를 가리키는 코드 냄새. 하나의 클래스 대신 다른 대안 클래스를 사용하려면, 두 클래스는 동일한 인터페이스를 구현하고 있어야 한다. 리팩토링 '함수 선언 변경하기'와 '함수 옮기기'를 사용해서 서로 동일한 인터페이스를 구현하게끔 코드를 수정할 수 있다. 두 클래스에서 일부 코드가 중복되는 경우에는 '슈퍼 클래스 추출하기'를 사용해 중복된 코드를 슈퍼클래스로 옮기고, 두 클래스를 새로운 슈퍼클래..