---
# System prepended metadata

title: 'The RED: Back to the Basics - 10년 이상 쓸 수 있는 지속 가능한 코드 작성'
tags: [석기]

---

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);
    ```
    
    위와 같이 깔끔하게 작성 할 수 있다.
    
