Skip to content

복합 리팩토링

Yongku cho edited this page Sep 5, 2018 · 1 revision

복합 리팩토링

상속 구조 정리(Tease Apart Interface)

하나의 상속 계층이 두 작업을 동시에 수행할 땐 상속 계층을 하나 더 만들어서 위임을 통해 다른 계층을 호출하자

// Before
class Deal { }
class ActiveDeal extends Deal { }
class PassiveDeal extends Deal { }
class TabularActiveDeal extends ActiveDeal { }
class TabularPassiveDeal extends PassiveDeal { }

// After
class Deal {
  constructor () {
    this.presentationStyle = new PresentationStyle()
  }
}
class ActiveDeal extends Deal { }
class PassiveDeal extends Deal { }

class PresentationStyle { }
class TabularPresentationDeal extends PresentationStyle { }
class TabularPresentationDeal extends PresentationStyle { }

절차 코드를 객체로 전환(Convert Procedual Design to Objects)

코드가 절차식으로 작성되어 있을 땐 데이터 레코드를 객체로 바꾸고, 기능을 쪼개서 각각의 객체로 옮기자

// Before
class OrderCalculator {
  determinePrice (order) { }
  determineTaxes (order) { }
}
class Order { }
class OrderLine { }

// After
class Order {
  getPrice () { }
  getTaxes () { }
}
class OrderLine {
  getPrice () { }
  getTaxes () { }
}

도메인 로직을 표현과 분리(Separate Domain from Presentation)

도메인 로직이 들어 있는 GUI클래스가 있을 땐 도메인 로직을 별도의 도메인 클래스로 떼어내자

// Before
class OrderWindow { }

// After
class Order { }
class OrderWindow {
  constructor () {
    this.order = new Order()
  }
}

계층구조 추출(Extract Hierarchy)

한 클래스에 기능이 너무 많고 일부분에라도 조건문이 많을 땐 각 조건에 해당하는 하위클래스를 작성해 계층구조를 만들자

// Before
class BillingScheme { }

// After
class BillingScheme { }
class BusinessBillingScheme extends BillingScheme { }
class ResidentialBillingScheme extends BillingScheme { }
class DisabilityBillingScheme extends BillingScheme { }
Clone this wiki locally