[1팀 김휘린] Chapter 2-1. 클린코드와 리팩토링#51
Open
Hwirin-Kim wants to merge 69 commits intohanghae-plus:mainfrom
Open
Conversation
|
휘린님 글 너무 잘읽었습니다 |
Member
|
멋찌다 일주일동안 고생했어여 |
Comment on lines
+82
to
+99
| let hasKeyboard = false; | ||
| let hasMouse = false; | ||
| let hasMonitorArm = false; | ||
|
|
||
| // 상품 조합 보너스 포인트 계산 | ||
| items.forEach((item) => { | ||
| switch (item.id) { | ||
| case PRODUCT_IDS.p1: | ||
| hasKeyboard = true; | ||
| break; | ||
| case PRODUCT_IDS.p2: | ||
| hasMouse = true; | ||
| break; | ||
| case PRODUCT_IDS.p3: | ||
| hasMonitorArm = true; | ||
| break; | ||
| } | ||
| }); |
There was a problem hiding this comment.
이러면 더 쉽게 구할 수 있어요
Suggested change
| let hasKeyboard = false; | |
| let hasMouse = false; | |
| let hasMonitorArm = false; | |
| // 상품 조합 보너스 포인트 계산 | |
| items.forEach((item) => { | |
| switch (item.id) { | |
| case PRODUCT_IDS.p1: | |
| hasKeyboard = true; | |
| break; | |
| case PRODUCT_IDS.p2: | |
| hasMouse = true; | |
| break; | |
| case PRODUCT_IDS.p3: | |
| hasMonitorArm = true; | |
| break; | |
| } | |
| }); | |
| const hasKeyboard = items.some(x => x.id === PRODUCT_IDS.p1); | |
| const hasMouse = items.some(x => x.id === PRODUCT_IDS.p2); | |
| const hasMonitorArm = items.some(x => x.id === PRODUCT_IDS.p3); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
과제 체크포인트
배포링크
https://hwirin-kim.github.io/front_6th_chapter2-1/
기본과제
심화과제
과제 셀프회고
이번 basic과제를 완료하고 눈으로 동작이 다 잘되는것을 확인 한 후 테스트를 마지막으로 돌려보니 딱 하나의 테스트 케이스가 동작하지 않는걸 발견했습니다.
"진짜 이제 다했다!!" 라는 생각이였다가 막혀서 그런지 실제로 한 시간 정도 막혀있었는데 체감은 두 세시간은 막혀있던 기분이였습니다.
문제는 innerHTML로 DOM이 통째로 재렌더링되면서 버튼 요소가 새로 생성되는데, 테스트 코드에서 버튼을 변수로 캐시해두면 해당 버튼을 누르지 않아 제대로 동작하지 않는것을 발견했습니다.
그래서 버튼과 수량 요소는 클릭 직전에 querySelector로 다시 가져와야 정상 작동한다는 것을 배웠는데 그것을 새벽에 블로그에 잘 정리해뒀습니다.. 링크 : https://huirin.tistory.com/250
과제를 하면서 내가 제일 신경 쓴 부분은 무엇인가요?
첫 번째로 과제를 진행하며 제일 신경쓴 부분은 내가 의도하고 변경하고자 하는 부분을 변경하고 나서 테스트코드로 검증을 하는것이였습니다.
너무 별거 아니면서 충분히 예측 가능하다고 하더라도 일정 부분 수정을 하고 나면 반드시 테스트로 검증을 진행했습니다.
두 번째로 신경 쓴 부분은 너무 한번에 다 바꾸려고 하지 않기였습니다.
실제로 제일 처음엔 UI를 바로 분리시키고 값들을 나중에 넣어도 되지 않을까? 라고 생각했지만,,
너무 강하게 결합되어있는 UI와 비즈니스로직들에 의해 AI도 해결책을 주지 못하였습니다.
그렇게 한 번 완전히 첫 커밋으로 돌아가 이번엔 스토어를 만들고 상태부터 분리하려고 하였습니다.
그러나 스토어를 만드는것 역시 쉽지만은 않았는데, 코드 양이 너무 많아서 어디에서 어떻게 사용되고 있는지 잘 알지 못했기 때문에 어디에서 어떤 액션함수를 만들어서 써야할지 한 눈에 보이지 않았기 때문입니다.
그렇게 시행착오를 겪다가 마지막으로 시도한 방법은 스토어와 유사한 모양이지만, 그냥 단순히 객체야! 하는 느낌으로 전역변수 부분의 형태만 객체 형태로 바꾸고, 그에 알맞게 사용 하고 있는 곳을 따라가서 이름만 바꿔줬습니다.
위처럼 최초에는 상태관리 스토어처럼 액션에 의해 변경해야하거나 그렇지 않고, 전역에 선언된 객체일 뿐이였습니다. 그치만 그렇게라도 하고나니 조금씩 분리할 수 있는 단위도 보였고, "굳이 DOM에서 가져와야 하는 부분인가??" 하는 부분들도 보이기 시작했습니다.
그 부분이 보이기 시작할 때 부터 스토어의 필요성을 느꼈고,
단순한 전역 객체에서 시작한 스토어는, 점차 상태와 로직을 분리할 필요가 생기며 위와같이
createStore구조로 발전했습니다.그 후 액션 함수에서 조회 기능도 필요해지면서
ACTION_TYPE.QUERY같은 프로토콜을 붙이게 되었고, 점차 미니 상태 관리 라이브러리처럼 자라나게 되었습니다.이처럼 처음부터 모든걸 하려고 했다면 보이지 않았을 것들을 작게보면 잘 보인다는것을 깨달았고, 다시 한번 요약해보면 가장 중요하다고 느낀것은 *테스트이고 그 다음은 작은 단위부터 변경하기 입니다!
과제를 다시 해보면 더 잘 할 수 있었겠다 아쉬운 점이 있다면 무엇인가요?
####일단 회고를 한번 해보겠습니다..
사실 이번 과제를 진행하면서 DOM에서 정보를 얻어오는 대신 스토어를 만들어서 스토어로 데이터를 보관하는 역할을 만드는데 4일, 그리고 이제 역할이 줄어든 DOM을 분리하는데는 5시간이 채 안걸린것 같습니다.
물론 4일 안에는 수많은 리셋과 그 만큼 어떤 방향이 좋은 방향인지를 찾아가는 시간이 제일 많이 들었고, DOM에서 어떤 정보를 얻어서 비즈니스로직을 만드는 코드들을 분리하는데 두 번째로 많은 시간이 들었습니다.
이 부분들은 특히 AI를 거의 쓰지 않고 진행하여 더욱 시간이 많이 들었는데, 오히려 AI를 쓰지 않을 때 부터 작은 단위로 분석하기 시작하여 집중도도 높아지고 무언가 해결이 되는 기분이 들어 몰입이 되는 시간이였습니다.
그렇게 DOM과 비즈니스로직을 어느정도 떼어낸 후 부터는 AI에게 맡기면 정말 제가 예상한대로 잘 분리가 되었습니다. 그래서 그 뒤로 몇 시간 지나지 않아 basic과제를 마칠 수 있었습니다.
다시하면 더 잘해볼 수 있겠다, 아쉽다 하는 부분
리액트로 변환하는 과정은 사실상 AI 80%정도 라고 생각합니다. 일단 UI를 그리라고 시켰더니 거의 유사한 그림이 나왔고, 그 다음 테스트 코드를 복사해오라고 시켰더니 테스트를 리액트에 알맞게 가져왔고, 할인 및 계산 로직을 가져오라고 시켰더니 가져오고.. 이렇게 순차적으로 그저 시켰는데 정말 잘 가져왔습니다. 물론 과제 제출의 욕심이 있었기에 스스로 하기보다 처음부터 AI를 쓸 생각으로 진행했지만... basic부분을 하루라도 빨리 끝냈더라면 리액트로 변환하는 과정도 손수 진행해보고 싶은 마음이 들었습니다..
그냥 마음속으로는 내가 basic을 잘 만들어놔서 AI가 쉽게 가져온걸꺼야.. 라고 생각하는 중이긴 합니다..!!
리뷰 받고 싶은 내용이나 궁금한 것에 대한 질문 편하게 남겨주세요 :)
이번 리팩토링 과제를 진행하며 궁금했던 부분은 과연 함수를 어느정도까지 쪼개야 하는 걸까? 하는 것입니다.
예시로 어떤 막대하고도 심오한 일을 하는 함수가 있는데, 이 함수를 한 네 가지 정도의 일처리로 분류를 할 수 있었다고 가정해보겠습니다.
그런데 그렇게 분류된 네 개의 일처리 함수 중 일부는 2~3가지로 또 분류 될 만한 함수였습니다.
그런식으로 최초의 큰덩어리에서 그 밑 작은 일 단위로 보면 네 가지, 그런데 그 각각의 함수를 또 분류하려고 보면 2~3가지
이렇게 최소 단위까지 분리한걸 결국 어떤 함수들은 조립자 역할만 하게 될것이고, 그 조립자들을 또 조립한 거대한 함수를 만들어야 최초에 막대하고 심오한 일을 할 수 있는 함수가 될텐데, 그렇다면 이 함수는 한 가지 일을 하는 함수가 맞는 건가요..?
어느정도까지 함수의 일처리 단위를 쪼개야하는지 아직 잘 감이 오지 않습니다..