
객체
객체 추출하여 다른 객체 만들기
객체에서 특정한 프로퍼티만 추출하여 다른 객체를 만들고 싶을 때가 있다. 새로운 객체를 만들어 객체의 값을 할당하는 형태이다. 이 코드는 이해하기 어렵지 않지만 chatBot 변수사용의 중복이 발생한다.
const httpBody = {
name: chatBot.name,
fallbacks: chatBot.fallbacks,
config: chatBot.config,
tags: chatBot.tags,
}
해체를 통해 프로퍼티을 추출하고 할당하는 방식을 사용하면 중복을 줄일 수 있다.
const {name, fallbacks, config, tags} = chatBot
const httpBody = {name, fallbacks, config, tags}
만약에 프로퍼티의 중복을 줄이고 싶으면 pick함수으로 해결 가능하다.
const httpBody = pick(['name', 'fallbacks', 'config', 'tags'], chatBot)
const pick = (keys, obj) => keys
.map(key => ({[key]: obj[key]}))
.reduce((acc, obj) => Object.assign(acc, obj))
깊은 객체 비교
config.source.appId와 config.target.appId가 다른지를 비교하는 함수이다. 각 프로퍼티가 없을 때 반환을 하여 안전하게 비교가능하게 작성한 코드이다.
source, target의 유무와 각 appId의 유무를 확인하고 appId를 비교하는 등 많은 기능으로 해석하기 힘들게 한다.
const isSameAppId = config => {
const {source, target} = config
if (!target || !target.appId || !source || !source.appId) {
return false
}
return target.appId !== source.appId
}
해체에 기본값을 사용하면 가장 얕은 프로퍼티의 유무를 확인 할 필요없이 작성이 가능하다. 즉, 함수의 역할에 맞게 appId를 중심으로 표현이 가능하다.
const isSameAppId = config => {
const {source = {}, target = {}} = config
if (target.appId && source.appId) {
return target.appId !== source.appId
}
return false
}
객체 할당
객체의 프로퍼티에 값를 할당하는 코드이다. 이해하기 쉬운 코드지만 프로퍼티에 값을 할당하는 부분이 중복된다.
const circle = new Circle()
circle.radius = 100
circle.x = 50
circle.y = 50
Object.assign을 사용하면 중복을 제거할 수 있다.
const circle = Object.assign(new Circle(), {
radius: 100,
x: 50,
y: 50
})
728x90
'프런트엔드 > 리팩터링' 카테고리의 다른 글
레거시 코드 리팩터링 시리즈(5/5) 배열과 반복문 (0) | 2023.07.17 |
---|---|
레거시 코드 리팩터링 시리즈(4/5) 조건문 (0) | 2023.07.17 |
레거시 코드 리팩터링 시리즈(2/5) 스타일과 문구 (0) | 2023.07.17 |
레거시 코드 리팩터링 시리즈(1/5) (0) | 2023.07.17 |
리팩터링 정의와 장점 (0) | 2023.07.13 |