❒ Description
우테코 6기 프리코스를 연습 삼아 해보는 과정에서 작성한 코드를 리펙토링 해봤다.
※ Commit link
❒ 요구 사항 및 로직 분석
1. Requirements
특정 금액 이상 사용을 하면 뱃지를 부여하는 요구사항이 있었다.
해당 요구사항을 충족하기 위해 Comparable, Stream API(sorted, reduce)를 사용해서 기능을 구현했다.
- NONE : 5000원 미만 ("없음")
- STAR : 5000원 이상
- TREE : 10000원 이상
- SANTA : 20000원 이상
2. Logic
- Badge를 부여하는 역할은 Badge Enum 클래스가 담당한다.
- 비교를 위해 Money 클래스의 크기를 내림차순 비교해야 한다.
- Comparable 인터페이스, Stream API - sorted
- 후보군 중 가장 높은 등급을 반환 해야한다.
- Stream API - reduce
구매 금액이 12000원 이라면 뱃지 후보는 NONE, STAR, TREE가 된다. 그 중 가장 높은 등급인 TREE를
구매자에게 부여해야 한다.
❒ 구현
1. Money implements Comparable
pubic class Money implements Comparable<Money> {
private long val;
//... 생략
@Override
public int compareTo(Money o) {
if (this.val - o.val) {
return -1;
}
if (this.val == o.val) {
return 0;
}
return 1;
}
}
2. 'assignBy' method (using Stream API - sorted, reduce)
더보기
public static Badge assignBy(Money money) {
return Arrays.stream(Badge.values())
.filter(badge -> money.boeThan(badge.limitMoney))
.sorted(Comparator.comparingLong(badge -> badge.limitMoney.getVal()))
.reduce((first, second) -> second)
.orElse(NONE);
}
public enum Badge {
NONE(Money.newOne(0), "없음"),
STAR(Money.newOne(5000), "별"),
TREE(Money.newOne(10000), "나무"),
SANTA(Money.newOne(20000), "산타")
;
private final Money limitPrice;
private final String name;
public static Badge assignBy(Money price) {
return Arrays.stream(Badge.values())
.filter(badge -> price.boeThan(badge.limitPrice))
.sorted(Comparator.comparing(badge -> badge.limitPrice))
.reduce((high, low) -> high)
.orElse(NONE);
}
}
리팩토링 전과 후를 비교 했을 때 아래의 점이 개선되었다.
- Money를 비교하는 역할 compareTo(Money money)를 Money가 가져가게 된다.
- 파라미터 변수명을 money -> price 로 변경하였다.
- reduce 변수명을 등급의 높고 낮음을 나타내기 위해 first, secound -> high,low로 변경하였다.
'Langauge > Java' 카테고리의 다른 글
Generic 제대로 알아보기. (0) | 2024.06.16 |
---|