읽기 좋은 코드가 좋은 코드다 Ch 10

상관없는 하위문제 추출하기

더스틴 보즈웰, 트레버 파우커

Alt text

느낌표 ! (인상 깊은 문장 | 문맥)

별도 함수로 추출

자바스크립트 코드의 상위수준 목적은 주어진 점과 가장 가까운 장소를 찾는 것이다.

p.154

var findClosestlocation = function (lat, lng, array) {
    var closest;
    var closest_dist = Number.MAX_VALUE;
    
    for (var i = 0 ; i < array.length ; i += 1) {
        var lat_rad = radians(lat);
        var lng_rad = radians(lat);
        var lat2_rad = radians(array[i].latitude);
        var lng2_rad = radians(array[i].longitude);
        
        var dist = Math.acos(Math.sin(lat_rad) * Math.sin(lat2_rad) + 
                            Math.cos(lat_rad) * Math.cos(lat2_rad) * 
                            Math.cos(lng2_rad - lng_rad));
        
        if (dist < closest_dist) {
            closest = array[i];
            closest_dist = dist;
        }
    }
    
    return closest;
}

루프의 내부에 있는 코드는 대부분 주요 목적과 직접 상관없는 하위문제를 다룬다. 구 위에 있는 두 개의 위도/경도 점 사이의 거리를 계산하는데, 이 내용의 분량이 꽤 많으니 spherical_distance() 라는 별도의 함수로 추출하는 편이 좋다.

p.155

var spherical_distance = function (lat1, lng1, lat2, lng2) {
    var lat_rad = radians(lat);
    var lng_rad = radians(lat);
    var lat2_rad = radians(array[i].latitude);
    var lng2_rad = radians(array[i].longitude);

    return Math.acos(Math.sin(lat_rad) * Math.sin(lat2_rad) +
        Math.cos(lat_rad) * Math.cos(lat2_rad) *
        Math.cos(lng2_rad - lng_rad));
}

var findClosestlocation = function (lat, lng, array) {
    var closest;
    var closest_dist = Number.MAX_VALUE;

    for (var i = 0 ; i < array.length ; i += 1) {
        var dist = spherical_distance(lat, lng, array[i].latitude, array[i].longitude);

        if (dist < closest_dist) {
            closest = array[i];
            closest_dist = dist;
        }
    }

    return closest;
}

코드를 읽는 사람은 밀도 높은 기하 공식에 방해받지 않고 상위수준의 목적에 집중할 수 있으니 전반적으로 코드의 가독성이 높아졌다.

spherical_distance() 는 독립적인 테스트도 더 용이하다. spherical_distance() 는 나중에 재사용될 수 있는 종류의 함수다. 바로 이 때문에 이러한 함수가 ‘상관없는’ 하위문제가로 불리는 것이다. 이는 그 자체로 완결되었으며 애플리케이션이 자기 자신을 어떻게 사용하는지는 알 필요가 없다.

p.156

코드를 작성하다보면 낮은 수준의 코드를 작성할 때가 있다. 예를 들어 암호화 & 복호화, 인증, 수학 수식 등이 있을 것이다. 기능을 구현하기 위해서 처음에는 코드를 이해하며 작성하지만 시간이 지나서 자신이 보거나 혹 다른 사람이 보고서는 이해하기가 어렵다. 이럴 때 함수로 분리하면 input 과 output 만 보고 사용하면 된다. 또한 함수로 분리했을 때 unit test 작성에 유리하다. 만약 함수로 분리되지 않았다면 테스트를 더 큰 범위에서 밖에 하지 못한다. 예를 들어 로그인 기능을 함수로 분리해놓지 않으면 unit test 로 작성하지 못하고 http 를 통해 응답 값으로만 테스트가 가능하다.

함수를 분리한다는 것은 가독성과 재사용성, 테스트 용이성을 높일 수 있다.

지나치게 추출하기

대부분의 프로그래머는 충분히 적극적이지 않기 때문에 ‘적극적’이라는 표현을 일부러 사용했다. 하지만 너무 흥분해서 지나친 수준으로 나아가는 일도 벌어질 수 있다.

과하게 자잘한 함수를 사용하면 오히려 가독성을 해친다. 사용자가 신경 써야 하는 내용이 늘어나고, 실행 경로를 추적하려면 코드의 곳곳을 돌아다녀야 하기 때문이다.

p.165

무엇이든 과하면 안 좋듯 함수를 너무 많이 분리해도 가독성이 떨어지는 것 같다. 물론 가능하다면 함수를 분리 안하는 것보다는 낫겠지만..

Chapter 10 느낌

Chapter 10 에서는 함수를 분리할 때 얻을 수 있는 여러 장점을 골고루 알려주고있다.


읽기 좋은 코드가 좋은 코드다 Ch 9

변수와 가독성

읽기 좋은 코드가 좋은 코드다 Ch 11

한 번에 하나씩

NCloud LB & SourcePipeline 구축하기
tech collection 서비스 성능 개선하기
Selenium 복권 구매 자동화 만들어보기
디자인 패턴
책 리뷰
블로그 챌린지