The RED: Back to the Basics - 10년 이상 쓸 수 있는 지속 가능한 코드 작성 === ###### tags: `석기` --- ## 좋은 코드란 무엇인가 ## 테스트와 TDD, BDD 프론트엔드에서는 테스트가 쉽지 않다. ==TDD== - 테스트 커버리지가 자연스럽게 높다. - 버그 발생률 낮다. - 코드가 방대해지지 않는다. **순서** 1. 테스트를 먼저 작성. 2. 테스트를 통과하는 코드 작성. 3. 코드 리팩토링. - 처음에 지켜지다가.. 우선순위가 밀려 잘 지켜지기 어려운 것 같다. ## 리팩토링 - 소프트웨어의 겉보기 기능은 유지한 채, 코드를 이해하고 수정하기 쉽도록 내부적으로 구조를 바꾸는 것. - 3의 법칙 - 비슷한 작업을 3번째 진행한다? -> 리팩토링을 해야한다. **사실 리팩토링하기 전에는 테스트를 먼저 작성해야한다.** ### Code smell - 너무 큰 함수, 클래스 - 이름이 명확하지 않은 변수와 함수 이름 - 중복코드 - 전역변수 - 과도한 callback 과 중첩된 조건문 - 과도하게 긴 식별자 ### 리팩토링과 Test case - 해피패스? - 아주 쉬운 테스트 케이스만 작성하는 현상. - 이러면 안된다! - 엣지 케이스를 잡아내지 못한다. - 리팩토링이 너무 간단하면 (변수 이름만 변경), 안하는 경우가 많은데, 그러면 안된다. ### 리팩토링의 방법 1. 함수의 추출, 분리 ```javascript= function processPost(){ const posts = getPosts(); posts.forEach(post => { console.log(post); }) } ``` 위와 같은 코드를, ```javascript= function logPost(post) { console.log(post) } function processPost(){ const posts = getPosts(); posts.forEach(logPost) } ``` 이렇게. 2. 중간 변수 도입. ```javascript= const user = getUser(); if(user.authKey){ ... } ``` 위 코드를, ```javascript= const user = getUser(); const isLoggedIn = Boolean(user.authKey); if(isLoggedIn){ ... } ``` 이처럼 중간 변수를 생성해서 작업. 3. var 보다는 let, let 보다는 const. 4. 함수의 경우, 순수함수여야한다. - 똑같은 입력이 들어간다면 똑같은 출력이 나와야한다는 의미. 5. 조건식 통합 6. fast fail - 조건식에서 if-else가 아니라 if하고 바로 리턴하는 방식. 7. 반복문보다 pipe. ```javascript= const names = []; for (const i of input){ if(i.job === 'programmer'){ names.push(i.name); } } const names = input.filter(item => item.job === 'programmer').map(item => item.name); ``` 위와 같이 깔끔하게 작성 할 수 있다.