구간을 표현하자! [Between 기능 소개]
해당 포스팅에서 언급된 내용은 Ndroid 에서 제공합니다.
최근, 사내에서 개발하는 프로젝트에서 주로 다루게 되었던 요구사항 중 하나는 특정 범위에 대하여 등급을 부여하는 것이었습니다.
예를들어, [80.01~100 이면 "S", 70.01~80.00 이면 "A"] 이런 식으로 특정 구간에 대한 점수를 구합니다.
이를 구현하는 문제는 생각보다 어려운 문제는 아니었지만, SWIFT 와 같은 최신언어에서는 범위에 관한 TYPE 을 제공하고 있는 것을 확인했던 차, JAVA 에도 이런 클래스가 있으면 좋겠다는 생각을 하게 되었습니다.
JAVA8 에서는 범위와 비슷한 문제에 대하여, [날짜 클래스 관련 Duration, Between 과 같은 클래스들이 배포]되었지만 아쉽게도 여러 형식을 호환하기 위한 구간 클래스는 아니었습니다.
그래서, N`s 오픈소스 프로젝트에서는 구간 관련 요구사항을 담을 수 있는 모듈을 제공하고자 하였습니다.
해당 모듈의 주목적은 특정 Generic Type 에 대한 구간을 객체로써 가지는 것을 목적으로 하며, 이를 이용할 수 있는 추가 모듈을 제공하는 것입니다.
사용법은 아래와 같습니다.
1. 구간 객체 생성 및 활용.
구간을 생성하고, 특정 값이 구간에 포함되는가에 대한 표현입니다.
1 2 3 4 5 6 7 | // 3 에서 7 사이의 구간 객체 생성. Between<Integer> between3to7 = Between.Just(3, 7); System.out.println("3에서 7 사이, 4 는 구간에 포함되는가? -> " + between3to7.contains(4) + "\n"); // CONSOLE LOG // 3에서 7 사이, 4 는 구간에 포함되는가? -> true | cs |
객체 생성 방식은 RxJava 의 Maybe 와 비슷한 경험을 제공하고자 하였으며,
기존 집합개념의 Set 의 Set::contains 와 개념적으로 비슷하기 때문에 같은 서명을 사용하고자 했습니다.
2. 구간 객체 관리 Map
Between 객체를 관리할 수 있는 자료구조가 있다면, 꽤 멋진 활용을 할 수 있을 것이라 생각했었습니다.
가장 먼저 생각한 것은 구간을 key 로 가지며, 구간에 포함되는 값을 매칭하면 해당 구간에 대한 value 를 얻을 수 있는 Map 을 구현하는 것이었습니다.
자료구조적으로 HashMap 은 아니지만, Map 과 비슷한 메소드 서명을 취할 수 있도록 Wrapping 하여 위의 요구사항을 충족하고자 했습니다. :-)
사용방법은 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | BetweenMap<Between<BigDecimal>, String> betweenStringBetweenMap = new BetweenMap<>(); // betweenStringBetweenMap.put(Between.Just(BigDecimal.valueOf(0.0), BigDecimal.valueOf(5.0)), "A"); betweenStringBetweenMap.put(Between.Just(BigDecimal.valueOf(5.1), BigDecimal.valueOf(10.0)), "S"); betweenStringBetweenMap.put(Between.Just(BigDecimal.valueOf(6.1), BigDecimal.valueOf(13.0)), "S++"); // BigDecimal map getter. // Return type -> Rx.Maybe betweenStringBetweenMap.getFirst(BigDecimal.valueOf(3.87)).subscribe(grade -> System.out.println("Maybe Type 결과 출력 ([3.87] 에 대한 등급) : " + grade)); // List Type Return. System.out.println("List Type 결과 출력 ([8.7] 에 대한 등급) : " + betweenStringBetweenMap.getToList(BigDecimal.valueOf(8.7))); // CONSOLE LOG // Maybe Type 결과 출력 ([3.87에 대한 등급) : A // List Type 결과 출력 ([8.7] 에 대한 등급) : [S, S++] | cs |
해당 모듈과 관련된 원본 주소는 아래에서 확인하실 수 있습니다.
이 포스팅이 보다 간결한 코딩을 하는 것에 도움이 되길 바래요 ~ @.@ ~
'개발이야기 > 오픈소스 N series ' 카테고리의 다른 글
예외처리를 간소화하여, 코드를 이쁘게 해보자! (9) | 2017.05.10 |
---|---|
Calendar 를 조금 더 쉽게 써보자, TimeUtil & TimeBuilder (0) | 2017.03.26 |
RxJava2 의 Maybe를 조금 더 적극적으로 써보자! MaybeUtil! (2) | 2017.03.16 |
안드로이드 람다 조합 (RxJava2 호환) (0) | 2017.03.08 |
조금 더 구체적인 안드로이드 개발 패턴화 (2) | 2017.01.30 |