반디북
데이터 지향 프로그래밍
Ch15
만혁

15. 디버그

코드를 한 단계씩 실행시키면 버그를 유발하는 코드를 찾을 수 있다.

하지만 디버거로 문제를 일으키는 시나리오를 재현 시키지는 못한다.

DOP 를 사용하면, 버그를 일으키는 시나리오의 맥락을 포착하고 REPL이나 단위테스트 같은 별도 프로세스에 재현할 수 있다.

15.1 프로그래밍 결정론

프로그래밍에 한정해서 원인은 함수 인자이고 결과는 반환값이고

상태를 다루는 모듈의 수를 최대한 줄이고 모든 모듈을 불변 데이터를 다룬다 가정했을때

함수 동작은 결정적이므로 동일한 인자는 언제나 동일한 반환값으로 이어진다.

function hasWordStartingWith(sentence, prefix) {
    console.log(sentence);
    console.log(prefix);
    
    var words = sentence.split(" ");
    
    return _.find(words, function(word) {
        return word.startsWith(prefix);
    }) != null;
}
 
hasWordStartingWith("I like the word \"reproducibility\"");
// true 반환
// 두 줄이 출력됨 
// I like the word "reproducibility"
// li

문자열이 인용 부호로 감싸져 있지 않게 된다.

즉 재현하기 어려워지는 상황이 되는데

이를 해결하기 위해서 문자열을 JSON 으로 직렬화 하면 해결 할 수 있다.

console.log(JSON.stringify("I like the word \"reproducibility\""));

15.3 모든 데이터 유형에서 재현

재현 가능성은 오염되지 않은 환경에서 특정 상황을 재현해볼 수 있게 해준다.

버그를 인지하기 위해서는 재현이 되고 안되고로 해결 속도의 차이가 크게 나타나는데

DOP 의 함수 컨텍스트를 포착한다면 재현하기 더 수월할것 같다

15.4 단위테스트

DOP 에서의 단위테스트는 간단하다

어떤 데이터로 함수를 호출하고 그 함수가 반환하는 데이터가 기대하는 것과 같은지 확인만 하면 된다.

하지만 종종 테스트 대상의 함수 입력 값을 만드는데 어려움을 느낄때가 있다.

이럴때 데이터를 수작업으로 준비하는 대신, 시스템이 테스트하려는 상황에 놓이게 만든 후

테스트 대상 함수의 내부 데이터를 포착하면 더욱 수월해진다.

우석