객체 간의 기능 이동 - ChoDragon9/posts GitHub Wiki

객체 간의 기능 이동

메서드 이동(Move Method)

메서드가 자신이 속한 클래스보다 다른 클래스의 기능을 더 많이 이용할 때

// Before
class MyClass1 {
  aMethod () {}
}
class MyClass2 { }

// After
class MyClass1 { }
class MyClass2 {
  aMethod () {}
}

필드 이동(Move Field)

어떤 필드가 자신이 속한 클래스보다 다른 클래스에서 더 많이 사용될 때

// Before
class MyClass1 {
  constructor () {
    this.aField = 0
  } 
}
class MyClass2 { }

// After
class MyClass1 { }
class MyClass2 {
  constructor () {
    this.aField = 0
  } 
}

클래스 추출(Extract Class)

두 클래스가 처리해야 할 기능이 하나의 클래스에 들어 있을 때

// Before
class Person {
  constructor () {
    this.name = 1
    this.officeAreaCode = 2
    this.officeNumber = 3
  }
  getTelephoneNumber () { }
}

// After
class Person {
  constructor () {
    this.name = 1
  }
  getTelephoneNumber () { }
}

class TelephoneNumber {
  constructor () {
    this.areaCode = 2
    this.number = 3
  }
  getTelephoneNumber () { }
}

클래스 내용 직접 삽입(Inline Class)

클래스에 기능이 너무 적을 때

// Before
class Person {
  constructor () {
    this.name = 1
  }
  getTelephoneNumber () { }
}

class TelephoneNumber {
  constructor () {
    this.areaCode = 2
    this.number = 3
  }
  getTelephoneNumber () { }
}

// After
class Person {
  constructor () {
    this.name = 1
    this.officeAreaCode = 2
    this.officeNumber = 3
  }
  getTelephoneNumber () { }
}

대리 객체 은폐(Hide Delegate)

클라이언트가 객체의 대리 클래스를 호출할 때

// Before
class Person { }
class Department { }
class Client {
  constructor () {
    this.person = new Person()
    this.department = new Department()
  }
}

// After
class Department { }
class Person {
  constructor () {
    this.department = new Department()
  }
}
class Client {
  constructor () {
    this.person = new Person()
  }
}

과잉 중개 메서드 제거(Remove Middle Man)

클래스에 자잘한 위임이 너무 많을 때

// Before
class Department { }
class Person {
  constructor () {
    this.department = new Department()
  }
}
class Client {
  constructor () {
    this.person = new Person()
  }
}

// After
class Person { }
class Department { }
class Client {
  constructor () {
    this.person = new Person()
    this.department = new Department()
  }
}

외래 클래스에 메서드 추가(Introduce Foreign Method)

사용 중인 서버 클래스에 메서드를 추가해야 하는 데 그 클래스를 수정할 수 없을 때

// Before
const newStart = new Date(prevEnd.getYear(), prevEnd.getMonth(), prevEnd.getDate() + 1)

// After
const nextDay = (date) => {
  return new Date(date.getYear(), date.getMonth(), date.getDate() + 1)
}
const newStart = nextDay(prevEnd)