•
엔지니어링이란 큰 문제를 작은 문제들로 쪼갠 다음, 각각의 문제를 해결하고 다시 하나로 합치는 일련의 작업이다.
•
이러한 원리를 코드에도 적용하면 튼튼해지며 가독성도 좋아진다.
•
이 장에서는 큰 흐름과 의존성이 얕은 문제들을 추출하는 방법에 대해 배워본다.
1.
주어진 함수나 코드를 보고 스스로에게 질문하라, 이것보다 더 추상화된 수준에서 보았을 때, 이 코드의 목적은 무엇인가?
2.
코드의 모든 줄에 질문을 던져라 이 코드는 직접적인 목적을 위해서 존재하는가? 아니면 필요는 하나 본질적인 책임과 상관없는 하위문제를 해결하는가?
3.
만약 상당히 원래의 책임과 직접적으로 관련되지 않았고 분량도 많다면 추출하여 별도의 함수로 둔다.
소개를 위한 예: findClosestLocation()
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(lng);
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;
}
Java
복사
•
위의 구현에서 추상화 수준은 뒤죽박죽이다.
•
우리는 단순히 findClosestLocation이라는 메소드가 지닌 책임인 배열 중, 가장 가까이 있는 배열 값을 찾아주겠구나라는 가벼운 마음으로 이 함수의 구현을 읽어보려했건만 코사인 법칙을 마주하게 된다.
•
따라서 for문 안의 다음 부분은 적절한 메소드명을 붙여주어 추출하는 것이 추상화 수준에 이롭다.
var lat_rad = radians(lat);
var lng_rad = radians(lng);
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));
Java
복사
•
그럼 이렇게 된다.
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;
}
Java
복사
•
위 함수의 메소드명인 가장 가까운 위치에 있는 객체를 반환하는 것을 적절한 추상화 수준으로 한눈에 알아볼 수 있게 되었다.
순수한 유틸리티 코드
•
문자열 포매팅, 해시테이블 사용, 파일 입출력과 같은 프로그램이 수행하는 작업에는 매우 기초적인 작업을 포괄하는 작업 집합들이 있다.
•
이러한 기본 유틸리티는 보통 프로그래밍 언어에 내장된 라이브러리에 있다. 이들은 앞서 언급했듯 세부적인 구현 사항이므로 추출해내기 좋은 친구들이다.
일반적인 목적의 코드
•
비즈니스 로직의 동작을 수행함에 있어서 해당 동작을 직접적으로 수행하지 않는 친구들을 분리해내는 것이 비즈니스 로직을 파악하는 데 도움이 된다.
•
이들이 일반적인 목적의 코드다.
요약
•
일반적인 목적의 코드를 프로젝트의 특정 코드에서 분리하라.
•
생각보다 많은 코드가 일반적이며 일반적인 문제를 해결하기 위한 라이브러리와 헬퍼 함수들로 이루어진 그룹을 만들면 남아있는 코드는 비즈니스 로직뿐일 것이다.