디어는 사용자의 요금을 계산하기 위해 다양한 상황을 고려합니다.
최근에 다양한 할인과 벌금을 사용하여 지자체와 협력하는 경우가 점점 많아지고 있어 요금제에 새로운 할인/벌금 조건을 추가하는 일을 쉽게 만드려고 합니다. 어떻게 하면 앞으로 발생할 수 있는 다양한 할인과 벌금 조건을 기존의 요금제에 쉽게 추가할 수 있는 소프트웨어를 만들 수 있을까요?
우선은 사용자의 이용에 관한 정보를 알려주면 현재의 요금 정책에 따라 요금을 계산해주는 API를 만들어주세요. 그 다음은, 기능을 유지한 채로 새로운 할인이나 벌금 조건이 쉽게 추가될 수 있게 코드를 개선하여 최종 코드를 만들어주세요.
다음과 같은 정보들이 도움이 될 것 같아요.
이용에는 다음과 같은 정보들이 있습니다.
use_deer_name (사용자가 이용한 킥보드의 이름)
use_end_lat, use_end_lng (사용자가 이용을 종료할 때 위도 경도)
use_start_at, use_end_at (사용자가 이용을 시작하고 종료한 시간)
데이터베이스에는 킥보드에 대해 다음과 같은 정보들이 있습니다.
deer_name (킥보드의 이름으로 고유한 값)
deer_area_id (킥보드가 현재 위치한 지역의 아이디)
데이터베이스에는 지역에 대해 다음과 같은 정보들이 있습니다.
area_id (지역 아이디로 고유한 값)
area_bounday (지역을 표시하는 MySQL spatial data로 POLYGON)
area_center (지역의 중심점)
area_coords (지역의 경계를 표시하는 위도, 경도로 이루어진 점의 리스트)
데이터베이스에는 파킹존에 대해 다음과 같은 정보들이 있습니다.
parkingzone_id (파킹존 아이디로 고유한 값)
parkingzone_center_lat, parkingzone_center_lng (파킹존 중심 위도, 경도)
parkingzone_radius (파킹존의 반지름)
데이터베이스에는 반납금지구역에 대해 다음과 같은 정보들이 있습니다.
forbidden_area_id (반납금지구역 아이디로 고유한 값)
forbidden_area_boundary (반납금지구역을 표시하는 MySQL spatial data로 POLYGON)
forbidden_area_coords (반납금지구역의 경계를 표시하는 위도, 경도로 이루어진 점의 리스트)
다음 체인으로 넘어가거나 계산을 하거나 체인을 추가하는 메소드를 공통으로 묶었다.
추상클래스를 상속하여 기본요금을 계산하는 클래스를 구성한다. 이와 같은 방식으로 할인과 벌금에 대한 클래스를 선언한다. 이후 체인을 관리하는 클래스를 만들어 요금체계에 맞게 체인의 순서를 설정하여 계산한다. 
체인을 실행하는 메소드와 이용정보를 토대로 data를 만들어 주는 메소드가 있다.
요금체계에 맞게 체인의 순서를 설정한다.

