상관없는 하위문제 추출하기
더스틴 보즈웰, 트레버 파우커
느낌표 ! (인상 깊은 문장 | 문맥)
별도 함수로 추출
자바스크립트 코드의 상위수준 목적은 주어진 점과 가장 가까운 장소를 찾는 것이다.
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 에서는 함수를 분리할 때 얻을 수 있는 여러 장점을 골고루 알려주고있다.