리팩터링 2판 1장 - 첫 번째 예시 1탄
어느덧 개발자로 커리어를 쌓아간지 2년이 지났다. 뭐 일단 아무것도 모르는 신입에서 주니어로에서 0.1% 나아진 기분이다. 진행하던 프로젝트가 커지고 코드 퀄리티를 고민하게 되면서 캡슐화, 추상화, 컴포넌트 분리, 렌더링, 사이드 이펙트 등등 기초적인 코드와 리액트가 어떻게 사용되어야 좋은 코드인지 검색 또는 인강으로만 찾아봤지 책을 읽어볼 생각은 못했다..(핑계) 그러다 어느 블로그를 보고 이 책을 알게 되었고 이제부턴 나의 코드 교과서처럼 사용하기 위해 정리를 시작한다. 난 기본적으로 하나의 뿌리를 제대로 심는걸 좋아한다.
책의 코드를 복사해서 넣고 이게 어떤 쓰임새인지 등등 정리를 해도 안볼걸 알기 때문에 개념을 위주로 기록을 할 예정이다. 그리고 개념을 바탕삼아 향후 코드를 짤때는 최대한 적용 할 것이다. 모든 것의 목적은 좋은 코드를 짜는 것이고 나중에 이직을 위한 밑거름이 될 것이라 생각해서이다. 그럼 24년 12월 겨울을 시작하여 끝까지 진행해보겠다. 우선 책의 서론에서 1~4장까지 꼼꼼히 읽고 이후부터는 빠르게 훑어보라는 가이드가 있으니 1~4장은 꼼꼼히 읽어보겠다.
리팩터링이란?
겉으로 드러나는 코드의 기능은 바꾸지 않으면서 내부 구조를 개선하는 방식으로 소프트웨어 시스템을 수정하는 과정이다. 즉 리팩터링한다는 것은 코드를 작성하고 난 뒤에 설게를 개선하는 일!
책 인용: '코딩 후 설계 개선이라니 정말 이상한 말이다.' 하지만 시간이 흐르면서 코드는 수정되게 마련이고 시스템의 무결성, 즉 설계에 맞춘 구조는 점점 뒤죽박죽이 되어간다.
리팩터링을 하면 일의 균현이 바뀐다. 처음부터 완벽한 설계를 갖추기보다는 개발을 진행하면서 지속적으로 설계한다. 그 결과 개발의 시작부터 끝날 때까지 프로그램은 줄곧 우수한 설계를 유지한다.
리팩터링의 첫단계는 리팩터링할 코드 영역을 꼼꼼하게 검사해줄 테스트 코드를 마련해야한다. 리팩터링 기법들이 버그 발생 여지를 최소화하도록 구성됐다고는 하나 실제 작업은 사람이 수행하기 때문에 언제든 실수할 수 있다.
1. 코드 분석을 통해 얻은 정보는 휘발성이 강하다. 내 머리속 지우개.. 그렇기 때문에 잊지 않기 위해서는 재빨리 코드에 반영해야한다. 코드 조각을 별도 함수로 추출하는 방식으로 앞서 파악한 정보를 코드에 반영하는 것이다.
이 글을 반문하면 어떤 코드를 봤을 때 잊어버릴 수 있겠다 싶은 내용은 함수를 추출하자! => 함수 추출하기!
2. 함수를 추출하고 나면 추출된 함수 코드를 자세히 들여다 보면서 지금보다 명확하게 표현할 수 있는 간단한 방법을 검토한다. (예시: thisAmount => result 변경) 함수의 반환 값은 항상 result (고민..)를 쓴다. 그러면 그 변수의 역할을 알 수 있다. 테스트하고 커밋!
3. 임시변수를 질의함수로 바꾸기! 매개변수가 루프돌때는 필요하지만 개별적으로 얻을 때는 필요없다..
이 부분은 내용의 이해가 필요했다. 임시 변수들 때문에 로컬 범위에 존재하는 이름이 늘어나서 추출 작업이 복잡해 질 수 있다. 대신 원하는 값을 리턴해주는 함수로 만들어 사용하자. 이게 변수 인라인하기! 변수를 인라인해서 함수 선언 바꾸기
! 즉 의도가 더욱 명확해지는 코드를 짤 수 있게 되었따. 이부분은 추후 더 알아보자
4. 지역변수를 제거해서 얻는 가장 큰 장접은 추출 작업이 훨 씬 쉬워진다는 것이다. 즉 코드를 추출할 때 의존성을 줄임으로써 수정이 용이해진다는 말!
5. 함수 선언 바꾸기!를 할때 이름을 짓는 과정은 쉽지 않다. 그러니 나중에 떠오르면 그때 바꿔도 된다.
6. 반복분쪼개기! 를 통해 반복문을 둘로 나눈다. 그리고 문장 슬라이드하기를 적용해서 변수를 선언하는 문장을 반복문 바로 앞에 옮긴다. 그러면 지역 변수 값 갱신과 관련한 문장을 임시 변수를 질의 함수로 바꾸기! 가 쉬워진다.
- 반복문 쪼개기로 변수 값을 누적시키는 부분을 분리한다.
- 문장 슬라이드하기로 변수 초기화 문장을 변수 값 누적 코드 바로 앞으로 옮긴다.
- 함수 추출하기로 적립 포인트 계산 부분을 별도 함수로 추출한다.
- 변수 인라인하기로 지역 변수를 제거한다