본문 바로가기

클린코드

[Refactoring] 19. 내부자 거래

 

코딩으로 학습하는 리팩토링 - 인프런 | 강의

리팩토링은 소프트웨어 엔지니어가 갖춰야 할 기본적인 소양 중 하나입니다. 이 강의는 인텔리J와 자바를 사용하여 보다 실용적인 방법으로 다양한 코드의 냄새와 리팩토링 기술을 설명하고 직

www.inflearn.com

| 인프런 - 백기선님의 코딩으로 학습하는 리팩토링 강의를 수강하며 정리한 글입니다.


내부자 거래
  • 어떤 모듈이 다른 모듈의 내부 정보를 지나치게 많이 알고 있는 코드 냄새로 지나치게 강한 결합도가 생길 수 있다.
  • 관련 리팩토링
    • 함수 옮기기, 필드 옮기기 -> 함수, 필드를 옮겨 결합도를 낮출 수 있다.
    • 위임 숨기기 -> 특정 모듈의 중재자처럼 사용
    • 슈퍼 클래스, 서브 클래스를 위임으로 교체하기 -> 상속으로 인한 결합도 줄이기
Before
public class CheckIn {

    public boolean isFastPass(Ticket ticket) {
        LocalDate earlyBirdDate = LocalDate.of(2022, 1, 1);
        return ticket.isPrime() && ticket.getPurchasedDate().isBefore(earlyBirdDate);
    }
}

public class Ticket {

    private LocalDate purchasedDate;

    private boolean prime;

    public Ticket(LocalDate purchasedDate, boolean prime) {
        this.purchasedDate = purchasedDate;
        this.prime = prime;
    }

    public LocalDate getPurchasedDate() {
        return purchasedDate;
    }

    public boolean isPrime() {
        return prime;
    }
}

=> CheckIn에서 Ticket을 지나치게 많이 참조하고 있다. : 해당 메서드의 필요성 검토 필요

After
public class Ticket {

    private LocalDate purchasedDate;

    private boolean prime;

    public Ticket(LocalDate purchasedDate, boolean prime) {
        this.purchasedDate = purchasedDate;
        this.prime = prime;
    }

    public LocalDate getPurchasedDate() {
        return purchasedDate;
    }

    public boolean isPrime() {
        return prime;
    }

    public boolean isFastPass(Ticket ticket) {
        LocalDate earlyBirdDate = LocalDate.of(2022, 1, 1);
        return isPrime() && purchasedDate.isBefore(earlyBirdDate);
    }
}

=> isFastPass 메서드를 Ticket으로 옮긴다.