3-3-리듀서-리팩토링하기
유틸리티 함수 추출
케이스 리듀서 추출
데이터 관리를 도메인으로 분리하기
보일러 플레이트 줄이기
슬라이스로 리듀서 결합하기
초기 리듀서
const initialState = {
visibilityFilter : 'SHOW_ALL',
todos : []
};
function appReducer(state = initialState, action) {
switch(action.type) {
case 'SET_VISIBILITY_FILTER' : {
return Object.assign({}, state, {
visibilityFilter : action.filter
});
}
case 'ADD_TODO' : {
return Object.assign({}, state, {
todos : state.todos.concat({
id: action.id,
text: action.text,
completed: false
})
});
}
case 'TOGGLE_TODO' : {
return Object.assign({}, state, {
todos : state.todos.map(todo => {
if (todo.id !== action.id) {
return todo;
}
return Object.assign({}, todo, {
completed : !todo.completed
})
})
});
}
case 'EDIT_TODO' : {
return Object.assign({}, state, {
todos : state.todos.map(todo => {
if (todo.id !== action.id) {
return todo;
}
return Object.assign({}, todo, {
text : action.text
})
})
});
}
default : return state;
}
}유틸리티 함수 추출하기
위 리듀서에서 배열의 특정 항목을 업데이트하는 패턴이 발견할 수 있다. 업데이트된 필드를 포함하여 새로운 객체를 반환하는 함수를 만들어보자.
updateItemInArray의 updateItemCallback으로 업데이트 방식 정하는거 좋은듯
케이스 리듀서 추출
액션 별로 리듀서 동작을 함수로 정의하여 호출. 무슨일 일어나는지 명확해지고, 어떤 패턴이 보이기 시작할거다?
케이스 리듀서 추출
각 케이스를 자체함수로 나눌 수 있다.
각 액션에 대해 무슨 일이 일어나는지 매우 명확하다. 또한, 어떤 패턴이 나타나기 시작함을 볼 수 있다.
데이터 관리 도메인으로 분리하기
필터 로직과 todo로직을 분리시키자.
보일러 플레이트 줄이기
switch문을 케이스 함수를 위한 ActionType의 룩업테이블 만들기. createReducer를 통해 보일러 플레이트를 줄여보자.
슬라이스로 리듀서 결합하기
최상위 앱 리듀서에 대한 "상태의 조각"의 로직을 처리하기 위해 combineReducers 유틸을 사용할 수 있다.
앞에서 설명한 리듀서 종류를 참고하여 전체코드를 다시 보자
helperUtility
updateObject
createReducer
케이스 리듀서: case에 대한 handler
setVisibilityFilter
addTodo
슬라이스 리듀서: 전체 상태의 조각에 대한 핸들러
visibilityReducer
todosReducer
루트 리듀서
appReducer
위와 같은 리팩토링을 통해, 각 함수의 책임이 줄었고 의도가 명확해졌다. 실제로 작성하게되면 reducerUtilities.js, visibilityReducer.js, todosReducer.js, rootReducer.js와 같이 파일로 분리될거다.
Last updated
Was this helpful?