객체 간의 기능 이동 - 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)