리팩토링 29. 클래스 인라인
- etc/리팩토링
- 2023. 5. 10.
들어가기 전
이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다.
리팩토링 29. 클래스 인라인 (inline Class)
- '클래스 추출하기'의 반대에 해당하는 리팩토링
- 클래스 추출하기 : 너무 복잡한 클래스에서 하나의 새로운 클래스를 추출함.
- 클래스 인라인 : 기존의 클래스를 삭제하고, 다른 클래스에 합침.
- Use Case
- 리팩토링을 하는 중에 클래스의 책임을 옮기다보면 클래스의 존재 이유가 빈약해지는 경우가 발생할 수 있음.
- 두 개의 클래스를 여러 클래스로 나누는 리팩토링을 할 때, '클래스 인라인'을 적용해서 코드를 한 곳으로 모으고 '클래스 추출하기'를 적용해서 새롭게 분리하는 리팩토링을 할 수 있다.
클래스 인라인은 크게 두 가지 용도로 사용할 수 있다.
- 클래스의 존재가 빈약해진 클래스를 다른 클래스에 합칠 때 사용.
- 두 개의 클래스를 여러 개의 클래스로 분리하기 전에, 하나의 클래스로 먼저 모은 후 다시 클래스를 추출하는 리팩토링에서 전단계로 사용함.
코드
아래 코드에는 TrackingInformation / Shipment 클래스가 존재한다. 이 때, TrackingInformation 클래스를 Shipment 클래스로 합치고 싶은 상황을 가정하자. 여러 이유가 있겠지만, TrackingInformation이 따로 분리될 필요가 없다고 생각했기 때문일 것이다.
// TrackingInformation에 있는 모든 것을 Shipment로 옮기고 싶은 경우라고 가정해보자.
public class TrackingInformation {
private String shippingCompany;
private String trackingNumber;
public TrackingInformation(String shippingCompany, String trackingNumber) {
this.shippingCompany = shippingCompany;
this.trackingNumber = trackingNumber;
}
public String display() {
return this.shippingCompany + ": " + this.trackingNumber;
}
public String getShippingCompany() {
return shippingCompany;
}
public void setShippingCompany(String shippingCompany) {
this.shippingCompany = shippingCompany;
}
public String getTrackingNumber() {
return trackingNumber;
}
public void setTrackingNumber(String trackingNumber) {
this.trackingNumber = trackingNumber;
}
}
package me.whiteship.refactoring._08_shotgun_surgery._29_inline_class;
public class Shipment {
// 이 필드는 이제 삭제된다. 왜냐하면 해당 클래스가 Shipment로 합쳐지기 때문임.
private TrackingInformation trackingInformation;
public Shipment(TrackingInformation trackingInformation) {
this.trackingInformation = trackingInformation;
}
public TrackingInformation getTrackingInformation() {
return trackingInformation;
}
public void setTrackingInformation(TrackingInformation trackingInformation) {
this.trackingInformation = trackingInformation;
}
public String getTrackingInfo() {
return this.trackingInformation.display();
}
}
인라인 클래스를 통해서 하나의 클래스를 다른 클래스로 합치는 과정은 다음과 같다.
- 필드부터 먼저 옮긴다. 그렇게 해야 컴파일 에러를 덜 확인한다.
- 생성자를 만든다. 방금 복사해 온 필드만 입력받을 수 있는 생성자를 만든다. (정확하게는 TrackingInformation을 필드로부터 제거하기 위한 생성자를 만듦.)
- 메서드를 TrackingInformation → Shipment로 복사함.
- TrackingInformation 인스턴스를 사용하는 코드를 Shipment에서 모두 삭제한다.
- Shipment 클래스를 삭제한다.
리팩토링 결과는 다음과 같다.
public class Shipment {
// 이 필드는 이제 삭제된다. 왜냐하면 해당 클래스가 Shipment로 합쳐지기 때문임.
// private TrackingInformation trackingInformation;
// 필드를 먼저 옮김 + 생성자 새롭게 생성
private String shippingCompany;
private String trackingNumber;
public Shipment(String shippingCompany, String trackingNumber) {
this.shippingCompany = shippingCompany;
this.trackingNumber = trackingNumber;
}
public String display() {
return this.shippingCompany + ": " + this.trackingNumber;
}
public String getShippingCompany() {
return this.shippingCompany;
}
public void setShippingCompany(String shippingCompany) {
this.shippingCompany = shippingCompany;
}
public String getTrackingNumber() {
return this.trackingNumber;
}
public void setTrackingNumber(String trackingNumber) {
this.trackingNumber = trackingNumber;
}
}
'etc > 리팩토링' 카테고리의 다른 글
냄새 10. 데이터 뭉치 (Data Clumps) (0) | 2023.05.10 |
---|---|
냄새 9. 기능 편애 (0) | 2023.05.10 |
리팩토링 28. 함수 인라인 (0) | 2023.05.10 |
리팩토링 27. 필드 옮기기 (0) | 2023.05.10 |
냄새 8. 산탄총 수술 (0) | 2023.05.10 |