리팩토링 29. 클래스 인라인

    들어가기 전

    이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다.


    리팩토링 29. 클래스 인라인 (inline Class)

    • '클래스 추출하기'의 반대에 해당하는 리팩토링
      • 클래스 추출하기 : 너무 복잡한 클래스에서 하나의 새로운 클래스를 추출함.
      • 클래스 인라인 : 기존의 클래스를 삭제하고, 다른 클래스에 합침. 
    • Use Case
      • 리팩토링을 하는 중에 클래스의 책임을 옮기다보면 클래스의 존재 이유가 빈약해지는 경우가 발생할 수 있음. 
      • 두 개의 클래스를 여러 클래스로 나누는 리팩토링을 할 때, '클래스 인라인'을 적용해서 코드를 한 곳으로 모으고 '클래스 추출하기'를 적용해서 새롭게 분리하는 리팩토링을 할 수 있다. 

    클래스 인라인은 크게 두 가지 용도로 사용할 수 있다.

    1. 클래스의 존재가 빈약해진 클래스를 다른 클래스에 합칠 때 사용.
    2. 두 개의 클래스를 여러 개의 클래스로 분리하기 전에, 하나의 클래스로 먼저 모은 후 다시 클래스를 추출하는 리팩토링에서 전단계로 사용함. 

    코드

    아래 코드에는 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();
        }
    }

    인라인 클래스를 통해서 하나의 클래스를 다른 클래스로 합치는 과정은 다음과 같다. 

    1. 필드부터 먼저 옮긴다. 그렇게 해야 컴파일 에러를 덜 확인한다.
    2. 생성자를 만든다. 방금 복사해 온 필드만 입력받을 수 있는 생성자를 만든다.  (정확하게는 TrackingInformation을 필드로부터 제거하기 위한 생성자를 만듦.)
    3. 메서드를 TrackingInformation → Shipment로 복사함. 
    4. TrackingInformation 인스턴스를 사용하는 코드를 Shipment에서 모두 삭제한다. 
    5. 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

    댓글

    Designed by JB FACTORY