////
Search
Duplicate
🪀

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

엔지니어링이란 큰 문제를 작은 문제들로 쪼갠 다음, 각각의 문제를 해결하고 다시 하나로 합치는 일련의 작업이다.
이러한 원리를 코드에도 적용하면 튼튼해지며 가독성도 좋아진다.
이 장에서는 큰 흐름과 의존성이 얕은 문제들을 추출하는 방법에 대해 배워본다.
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
복사
위 함수의 메소드명인 가장 가까운 위치에 있는 객체를 반환하는 것을 적절한 추상화 수준으로 한눈에 알아볼 수 있게 되었다.

순수한 유틸리티 코드

문자열 포매팅, 해시테이블 사용, 파일 입출력과 같은 프로그램이 수행하는 작업에는 매우 기초적인 작업을 포괄하는 작업 집합들이 있다.
이러한 기본 유틸리티는 보통 프로그래밍 언어에 내장된 라이브러리에 있다. 이들은 앞서 언급했듯 세부적인 구현 사항이므로 추출해내기 좋은 친구들이다.

일반적인 목적의 코드

비즈니스 로직의 동작을 수행함에 있어서 해당 동작을 직접적으로 수행하지 않는 친구들을 분리해내는 것이 비즈니스 로직을 파악하는 데 도움이 된다.
이들이 일반적인 목적의 코드다.

요약

일반적인 목적의 코드를 프로젝트의 특정 코드에서 분리하라.
생각보다 많은 코드가 일반적이며 일반적인 문제를 해결하기 위한 라이브러리와 헬퍼 함수들로 이루어진 그룹을 만들면 남아있는 코드는 비즈니스 로직뿐일 것이다.