2024. 7. 7. 20:52ใ๋์
[์ค๋ธ์ ํธ 4์ฅ] - ์ค๊ณ ํ์ง๊ณผ ํธ๋ ์ด๋ ์คํ
์ด๋ฒ ์ฅ์ ์ํ ์๋งค ์์คํ ์ ์ฑ ์์ด ์๋ ์ํ๋ฅผ ํํํ๋ ๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ๋ฅผ ์ดํด๋ณด๊ณ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์ค๊ณํ ๊ตฌ์กฐ์ ์ด๋ค ์ฐจ์ด์ ์ด ์๋์ง ์ดํด๋ณด๋ ์ฑํฐ์ ๋๋ค.
๋ฐ์ดํฐ ์ค์ฌ์ ์ํ ์๋งค ์์คํ
๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ๋ '๋ฐ์ดํฐ๊ฐ ๋ฌด์์ธ๊ฐ'๋ฅผ ๋ฌป๋ ๊ฒ์ผ๋ก ์์ํ๋ค. ๋จผ์ Movie์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ผ๋ก ์์ํ์. ํธ์๋ฅผ ์ํด ์ ๊ทผ์์ ์์ ์๋ ๋กฌ๋ถ์ผ๋ก ๋์ฒดํ๋ค.
@Getter
@Setter
public class Movie {
private String title;
private Duration runningTime;
private Money fee;
private List<DiscountCondition> discountConditions;
private MovieType movieType;
private Money discountAmount;
private double discountPercent;
}
ํ ์ธ ์ ์ฑ ์ ์ข ๋ฅ๋ฅผ ๊ฒฐ์ ํ๋ ์ด๊ฑฐํ ํ์ ์ MovieType์ผ๋ก ์ค์ ํ๋ค.
public enum MovieType {
AMOUNT_DISCOUNT, // ๊ธ์ก ํ ์ธ ์ ์ฑ
PERCENT_DISCOUNT, // ๋น์จ ํ ์ธ ์ ์ฑ
NONE_DISCOUNT // ๋ฏธ์ ์ฉ
}
๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ์์๋ ๊ฐ์ฒด๊ฐ ํฌํจํด์ผ ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ง์คํ๋ค. movieType์ด ๊ธ์ก ํ ์ธ ์ ์ฑ ์ด๋ผ๋ฉด discountAmount ๊ฐ์ด ํ์ํ๊ณ , ๋น์จ ํ ์ธ ์ ์ฑ ์ด๋ผ๋ฉด discountPercent๊ฐ ํ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์บก์ํ๋ฅผ ์ํด ์ ๊ทผ์์ ์์ ์๋ฅผ ์ถ๊ฐํ๋ค.
๋ค์์ผ๋ก ํ ์ธ ์กฐ๊ฑด์ ๊ตฌํํ๋ ๋ฐ ํ์ํ ๋ฐ์ดํฐ๋ ๋ฌด์์ธ๊ฐ? ๋จผ์ ํ์ฌ์ ํ ์ธ ์กฐ๊ฑด์ ์ข ๋ฅ๋ฅผ ์ ์ฅํ ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ค.
public enum DiscountConditionType {
SEQUENCE, // ์๋ฒ์กฐ๊ฑด
PERIOD // ๊ธฐ๊ฐ์กฐ๊ฑด
}
๋ํ ๊ธฐ๊ฐ์กฐ๊ฑด๊ณผ ์๋ฒ ์กฐ๊ฑด์์ ์ฌ์ฉ๋๋ ์ธ์คํด์ค ๋ณ์๋ค์ ์ถ๊ฐํด์ผ ํ๋ค.
@Getter
@Setter
public class DiscountCondition {
private DiscountConditionType type;
private int sequence;
private DayOfWeek dayOfWeek;
private LocalTime startTime;
private LocalTime endTime;
}
๋ง์ฐฌ๊ฐ์ง๋ก Screening, Reservation, Customer ํด๋์ค๋ฅผ ์ถ๊ฐํ๋ค.
// Screening.java
@Getter
@Setter
public class Screening {
private Movie movie;
private int sequence;
private LocalDateTime whenScreened;
}
// Reservation.java
@Getter
@Setter
public class Reservation {
private Customer customer;
private Screening screening;
private Money fee;
private int audienceCount;
}
// Customer.java
@Getter
@Setter
public class Customer {
private String name;
private String id;
}
์ํ์๋งค ์๋ฎฌ๋ ์ด์
ReservationAgency๋ ๋ฐ์ดํฐ ํด๋์ค๋ค์ ์กฐํฉํด์ ์ํ ์๋งค ์ ์ฐจ๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ค.
public class ReservationAgency {
public Reservation reserve(Screening screening, Customer customer, int audienceCount) {
Movie movie = screening.getMovie();
boolean discountable = false;
for (DiscountCondition condition: movie.getDiscountConditions()) {
if (condition.getType() == DiscountConditionType.PERIOD) {
discountable = screening.getWhenScreened().getDayOfWeek().equals(condition.getDayOfWeek()) &&
condition.getStartTime().compareTo(screening.getWhenScreened().toLocalTime()) <= 0 &&
condition.getEndTime().compareTo(screening.getWhenScreened().toLocalTime()) >= 0;
} else {
discountable = condition.getSequence() == screening.getSequence();
}
if (discountable) {
break;
}
}
Money fee;
if (discountable) {
Money discountAmount = Money.ZERO;
switch (movie.getMovieType()) {
case AMOUNT_DISCOUNT:
discountAmount = movie.getDiscountAmount();
break;
case PERCENT_DISCOUNT:
discountAmount = movie.getFee().times(movie.getDiscountPercent());
break;
case NONE_DISCOUNT:
discountAmount = Money.ZERO;
break;
}
fee = movie.getFee().minus(discountAmount).times(audienceCount);
} else {
fee = movie.getFee().times(audienceCount);
}
return new Reservation(customer, screening, fee, audienceCount);
}
}
์ค๊ณ ํธ๋ ์ด๋ ์คํ
'์บก์ํ', '์์ง๋', '๊ฒฐํฉ๋'๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฑ ์ ์ฃผ๋ ์ค๊ณ์ ๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ๋ฅผ ๋น๊ตํด๋ณด์.
์บก์ํ
์ํ์ ํ๋์ ํ๋์ ๊ฐ์ฒด ์์ ๋ชจ์ผ๋ ์ด์ ๋ ๋ด๋ถ ๊ตฌํ์ ์ธ๋ถ๋ก๋ถํฐ ๊ฐ์ถฐ์ ๋ณ๊ฒฝ ํ๊ธํจ๊ณผ๋ฅผ ์ค์ด๊ธฐ ์ํด์๋ค. ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ถ๋ถ์ '๊ตฌํ'์ด๋ผ๊ณ ๋ถ๋ฅด๊ณ ์๋์ ์ผ๋ก ์์ ์ ์ธ ๋ถ๋ถ์ '์ธํฐํ์ด์ค'๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ด๋ฅผ ์ํ ์ฅ์น๋ก '์บก์ํ'๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ๊ฐ์ฅ ์ค์ํ ์๋ฆฌ๋ ๋ถ์์ ํ ๊ตฌํ ์ธ๋ถ์ฌํญ์ ์์ ์ ์ธ ์ธํฐํ์ด์ค ๋ค๋ก ์บก์ํํ๋ ๊ฒ์ด๋ค.
'์ ์ง๋ณด์์ฑ์ด ๋ชฉํ๋ค. ์ฌ๊ธฐ์ ์ ์ง๋ณด์์ฑ์ด๋ ๋๋ ค์ ์์ด, ์ฃผ์ ํจ ์์ด, ์ ํญ๊ฐ ์์ด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๋ฅ๋ ฅ์ ๋งํ๋ค. ๊ฐ์ฅ ์ค์ํ ๋๋ฃ๋ ์บก์ํ๋ค. ์บก์ํ๋ ์ด๋ค ๊ฒ์ ์จ๊ธฐ๋ ๊ฒ์ ์๋ฏธํ๋๋ฐ ์ด๋ฅผ ํตํด ๋ป๋ฐ์ ํผํด๊ฐ ๋ฐ์ํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ์ฌ์ ์ ๋ฐฉ์งํ ์ ์๋ค. ์์ง๋, ๊ฒฐํฉ๋, ์ค๋ณต ์ญ์ ํ๋ฅญํ ์ฝ๋๋ฅผ ๊ท์ ํ๋ ๋ฐ ํต์ฌ์ ์ธ ํ์ง์ธ ๊ฒ์ด ์ฌ์ค์ด์ง๋ง ์บก์ํ๋ ์ฐ๋ฆฌ๋ฅผ ์ข์ ์ฝ๋๋ก ์๋ดํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์ค์ํ ์ 1์๋ฆฌ๋ค.'
์์ง๋์ ๊ฒฐํฉ๋
์์ง๋๋ ๋ชจ๋์ ํฌํจ๋ ๋ด๋ถ ์์๋ค์ด ์ฐ๊ด๋ผ ์๋ ์ ๋๋ฅผ ๋ํ๋ธ๋ค. ๊ฒฐํฉ๋๋ ์์กด์ฑ์ ์ ๋๋ฅผ ๋ํ๋ด๋ฉฐ ๋ค๋ฅธ ๋ชจ๋์ ๋ํด ์ผ๋ง๋ ๋ง์ ์ง์์ ๊ฐ๊ณ ์๋์ง๋ฅผ ๋ํ๋ด๋ ์ฒ๋๋ค.
๋ณ๊ฒฝ์ ๊ด์ ์์ ์์ง๋๋ '๋ณ๊ฒฝ์ด ๋ฐ์ํ ๋ ๋ชจ๋ ๋ด๋ถ์์ ๋ฐ์ํ๋ ๋ณ๊ฒฝ์ ์ ๋'๋ก ์ธก์ ํ ์ ์๋ค. ๊ฐ๋จํ ๋งํด ํ๋์ ๋ณ๊ฒฝ์ผ๋ก ๋ชจ๋ ์ ์ฒด๊ฐ ๋ณ๊ฒฝ๋๋ค๋ฉด ์์ง๋๊ฐ ๋ฎ์ ๊ฒ์ด๋ค. ์์ง๋๊ฐ ๋์ ์ค๊ณ์์๋ ํ๋์ ์๊ตฌ์ฌํญ ๋ณ๊ฒฝ์ ๋ฐ์ํ๊ธฐ ์ํด ์ค์ง ํ๋์ ๋ชจ๋๋ง ์์ ํ๋ฉด ๋๋ค.
๊ฒฐํฉ๋ ์ญ์ ๋ณ๊ฒฝ์ ๊ด์ ์์ 'ํ ๋ชจ๋์ด ๋ณ๊ฒฝ๋๊ธฐ ์ํด์ ๋ค๋ฅธ ๋ชจ๋์ ๋ณ๊ฒฝ์ ์๊ตฌํ๋ ์ ๋'๋ก ์ธก์ ํ ์ ์๋ค. ์ด๋ค ๋ชจ๋์ ๋ณ๊ฒฝํ์ ๋ ๋ค๋ฅธ ๋ชจ๋๋ค์ ์์ ํด์ผ ํ๋ค๋ฉด ์ด๋ ๊ฒฐํฉ๋๊ฐ ๋์ ๊ฒ์ด๋ค.
๋ณดํต ๋ด๋ถ ๊ตฌํ์ ๋ณ๊ฒฝํ์ ๋ ๋ค๋ฅธ ๋ชจ๋์ ์ํฅ์ด ๋ผ์น๋ฉด ๊ฒฐํฉ๋๊ฐ ๋์ ๊ฒ์ด๊ณ ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค๋ฅผ ๋ณ๊ฒฝํ์ ๋๋ง ๋ค๋ฅธ ๋ชจ๋์ ์ํฅ์ด ๋ผ์น ๋ ๊ฒฐํฉ๋๊ฐ ๋ฎ๋ค๊ณ ํํํ๋ค.
๋ฐ์ดํฐ ์ค์ฌ์ ์ํ ์๋งค ์์คํ ์ ๋ฌธ์ ์
๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ๋ ์บก์ํ๋ฅผ ์๋ฐํ๊ณ ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌํ์ ์ธํฐํ์ด์ค์ ๋๋ฌ๋๊ฒ ํ๋ค.
์ด ๋๋ฌธ์ ๋ค์ ์ธ ๊ฐ์ง ๋ฌธ์ ์ ๋ค์ด ์กด์ฌํ๋ค.
- ์บก์ํ ์๋ฐ
- ๋์ ๊ฒฐํฉ๋
- ๋ฎ์ ์์ง๋
๋กฌ๋ถ์ ํตํด ์ ๊ทผ์์ ์์ ์๋ฅผ ์ฌ์ฉํด์ ๋ณ์์ ์ ๊ทผํ๋ ๊ฒ์ ์บก์ํ์ ์์น์ ์งํค๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๊ทธ๋ ์ง ์๋ค. getFee์ setFee๋ ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค์ ๋ ธ๊ณจ์ ์ผ๋ก fee๋ผ๋ ์ธ์คํด์ค ๋ณ์๊ฐ ์๋ ๊ฒ์ ๋๋ฌ๋ด๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ๋ณ์๋ฅผ ๊ฐ๊ณ ์จ๋ค๋ฉด ์ด ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ fee๋ผ๋ ์ด๋ฆ์ ๋ณ์๊ฐ ๋ณ๊ฒฝ๋์์ ๋ ์ ๋ถ ์ํฅ์ ๋ฐ๊ฒ ๋๋ค. ์ด๋ ๋์ ๊ฒฐํฉ๋๋ก ์๊ธฐ๋ ์ผ์ด๋ค.
์๋น ํ๋ฝ์ ์ด์ฒ๋ผ ์ ๊ทผ์์ ์์ ์์ ๊ณผ๋ํ๊ฒ ์์กดํ๋ ์ค๊ณ ๋ฐฉ์์ '์ถ์ธก์ ์ํ ์ค๊ณ ์ ๋ต'์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.์ด ์ ๋ต์ ๊ฐ์ฒด์ ํ๋ ฅ์ ๊ณ ๋ คํ์ง ์๊ณ ๋ค์ํ ์ํฉ์์ ์ฌ์ฉ๋ ๊ฒ์ด๋ผ๋ ๊ฐ์ ํ์ ์ค๊ณ๋ฅผ ํ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ด๋ถ ๊ตฌํ์ด ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค์ ๊ทธ๋๋ก ๋๋ฌ๋๊ฒ ๋๋ฉด์ ์บก์ํ์ ์์น์ ์๋ฐํ๋ ๋ณ๊ฒฝ์ ์ทจ์ฝํ ์ค๊ณ๋ฅผ ์ป๊ฒ ๋๋ค.
์๋ก ๋ค๋ฅธ ์ด์ ๋ก ๋ณ๊ฒฝ๋๋ ์ฝ๋๊ฐ ํ๋์ ๋ชจ๋ ์์ ๊ณต์กดํ ๋ ๋ชจ๋์ ์์ง๋๊ฐ ๋ฎ๋ค๊ณ ๋งํ๋ค. ๋ฐ๋ผ์ ๊ฐ ๋ชจ๋์ ์์ง๋๋ฅผ ์ดํด๋ณด๊ธฐ ์ํด์๋ ์ฝ๋๋ฅผ ์์ ํ๋ ์ด์ ๊ฐ ๋ฌด์์ธ์ง ์ดํด๋ด์ผ ํ๋ค.
ReservationAgency๋ ๋ค์๊ณผ ๊ฐ์ ์์ ์ฌํญ์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ์ ์ฝ๋๋ฅผ ์์ ํด์ผ ํ ๊ฒ์ด๋ค.
- ํ ์ธ ์ ์ฑ ์ด ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ
- ํ ์ธ ์ ์ฑ ๋ณ๋ก ํ ์ธ ์๊ธ์ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ
- ํ ์ธ ์กฐ๊ฑด์ด ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ
- ํ ์ธ ์กฐ๊ฑด๋ณ๋ก ํ ์ธ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ๋ฐฉ๋ฒ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ
- ์๋งค ์๊ธ์ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ
ํ ์ธ ์ ์ฑ ์ ์ ํํ๋ ์ฝ๋์ ํ ์ธ ์กฐ๊ฑด์ ํ๋จํ๋ ์ฝ๋๊ฐ ํจ๊ป ์กด์ฌํ๊ธฐ์ ์๋ก์ด ํ ์ธ ์ ์ฑ ์ ์ถ๊ฐํ๋ ์์ ์ด ํ ์ธ ์กฐ๊ฑด์๋ ์ํฅ์ ๋ฏธ์น ์ ์๋ค.
์ด์ฒ๋ผ ์ด๋ค ์๊ตฌ์ฌํญ ๋ณ๊ฒฝ์ ์์ฉํ๊ธฐ ์ํด ํ๋ ์ด์์ ํด๋์ค๋ฅผ ์์ ํด์ผ ํ๋ ๊ฒ์ ์ค๊ณ์ ์์ง๋๊ฐ ๋ฎ๋ค๋ ๊ฒ์ด๋ค.
์ค์ค๋ก ์์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฑ ์์ง๋ ๊ฐ์ฒด
์์ง๋๋ฅผ ๋์ด๊ธฐ ์ํด ๊ฐ์ฒด ๋ด๋ถ์ ์ ์ฅ๋๋ ๋ฐ์ดํฐ๋ณด๋ค ๊ฐ์ฒด๊ฐ ํ๋ ฅ์ ์ฐธ์ฌํ๋ฉด์ ์ํํ ์ฑ ์์ ์ ์ํ๋ ์คํผ๋ ์ด์ ์ ์ด์ ์ ๋ง์ถฐ์ผ ํ๋ค. ๋ฐ๋ผ์ ๊ฐ์ฒด๋ฅผ ์ค๊ณํ ๋ "์ด ๊ฐ์ฒด๊ฐ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ํฌํจํด์ผ ํ๋๊ฐ?"๋ผ๋ ์ง๋ฌธ์ ๋ค์์ ๋ ๊ฐ๋ก ๋ถ๋ฆฌํด์ผ ํ๋ค.
- ์ด ๊ฐ์ฒด๊ฐ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ํฌํจํด์ผ ํ๋๊ฐ?
- ์ด ๊ฐ์ฒด๊ฐ ๋ฐ์ดํฐ์ ๋ํด ์ํํด์ผ ํ๋ ์คํผ๋ ์ด์ ์ ๋ฌด์์ธ๊ฐ?
๋ ์ง๋ฌธ์ ์กฐํฉํ๋ฉด ๊ฐ์ฒด์ ๋ด๋ถ ์ํ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์๊ณผ ์ ์ฅ๋ ์ํ์ ๋ํด ํธ์ถํ ์ ์๋ ์คํผ๋ ์ด์ ์ ์งํฉ์ ์ป์ ์ ์๋ค.
๋จผ์ DiscountCondition ํ์ ์ ์๋ ๋ฐ์ดํฐ์ ๋ํด ์ํํ ์ ์๋ ์คํผ๋ ์ด์ ์ด ๋ฌด์์ธ์ง ์์๋ณด์. ๋ ๊ฐ์ง ํ ์ธ ์กฐ๊ฑด์ ํ๋จํ ์ ์๋๋ก isDiscountable ๋ฉ์๋๋ฅผ ๋ง๋ค์ด๋ณด์.
@Getter
@Setter
public class DiscountCondition {
private DiscountConditionType type;
private int sequence;
private DayOfWeek dayOfWeek;
private LocalTime startTime;
private LocalTime endTime;
public boolean isDiscountable(DayOfWeek dayOfWeek, LocalTime time) {
if (type != DiscountConditionType.PERIOD) {
throw new IllegalArgumentException();
}
return this.dayOfWeek.equals(dayOfWeek) && this.startTime.compareTo(time) <= 0 && this.endTime.compareTo(time) >= 0;
}
public boolean isDiscountable(int sequence) {
if (type != DiscountConditionType.SEQUENCE) {
throw new IllegalArgumentException();
}
return this.sequence == sequence;
}
}
์ด์ Movie๋ฅผ ๋ณ๊ฒฝํด๋ณด์. Movie์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์คํผ๋ ์ด์ ์ ๋ฌด์์ธ๊ฐ? Movie๊ฐ ํฌํจํ๋ ๋ฐ์ดํฐ๋ฅผ ์ดํด๋ณด๋ฉด ์ํ ์๊ธ์ ๊ณ์ฐํ๋ ์คํผ๋ ์ด์ ๊ณผ ํ ์ธ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ์คํผ๋ ์ด์ ์ด ํ์ํ ๊ฒ ๊ฐ๋ค.
@Getter
@Setter
public class Movie {
private String title;
private Duration runningTime;
private Money fee;
private List<DiscountCondition> discountConditions;
private MovieType movieType;
private Money discountAmount;
private double discountPercent;
public Money calculateAmountDiscountedFee() {
if (movieType != MovieType.AMOUNT_DISCOUNT) {
throw new IllegalArgumentException();
}
return fee.minus(discountAmount);
}
public Money calculatePercentDiscountedFee() {
if (movieType != MovieType.PERCENT_DISCOUNT) {
throw new IllegalArgumentException();
}
return fee.times(discountPercent);
}
public Money calculateNoneDiscountFee() {
if (movieType != MovieType.NONE_DISCOUNT) {
throw new IllegalArgumentException();
}
return Money.ZERO;
}
public boolean isDiscountable(LocalDateTime whenScreened, int sequence) {
for(DiscountCondition condition : discountConditions) {
if (condition.getType() == DiscountConditionType.PERIOD) {
if (condition.isDiscountable(whenScreened.getDayOfWeek(), whenScreened.toLocalTime())) {
return true;
}
} else {
if (condition.isDiscountable(sequence)) {
return true;
}
}
}
return false;
}
}
Screening ์ญ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์คํผ๋ ์ด์ ์ ๊ตฌํํ์ฌ ์์จ์ฑ์ ๋์ด์.
@Getter
@Setter
public class Screening {
private Movie movie;
private int sequence;
private LocalDateTime whenScreened;
public Money calculateFee(int audienceCount) {
switch (movie.getMovieType()) {
case AMOUNT_DISCOUNT:
if (movie.isDiscountable(whenScreened, sequence)) {
return movie.calculateAmountDiscountedFee().times(audienceCount);
}
break;
case PERCENT_DISCOUNT:
if (movie.isDiscountable(whenScreened, sequence)) {
return movie.calculatePercentDiscountedFee().times(audienceCount);
}
break;
case NONE_DISCOUNT:
return movie.calculateNoneDiscountFee().times(audienceCount);
}
return movie.calculateNoneDiscountFee().times(audienceCount);
}
}
์ด์ ์ด ์์จ์ ์ธ ๊ฐ์ฒด๋ค์ ์ฌ์ฉํด์ ์ํ๋ฅผ ์๋งคํด๋ณด์.
public class ReservationAgency {
public Reservation reserve(Screening screening, Customer customer, int audienceCount) {
Money fee = screening.calculateFee(audienceCount);
return new Reservation(customer, screening, fee, audienceCount);
}
}
๊ฒฐํฉ๋ ์ธก๋ฉด์์ ReservationAgency์ ๋ชฐ๋ ค์๋ ์์กด์ฑ์ด ์ถฉ๋ถํ ๊ฐ์ ๋์๋ค.
ํ์ง๋ง ์ฌ์ ํ ๋ถ์กฑํ๋ค.
์บก์ํ ๊ด์ ์์ ๋ ๋ฒ์งธ ์ค๊ณ๊ฐ ์ฒซ ๋ฒ์งธ๋ณด๋ค ํฅ์๋ ๊ฑด ์ฌ์ค์ด์ง๋ง ์ฌ์ ํ ์บก์ํ๋ฅผ ์๋ฐํ๋ ๋ถ๋ถ์ด ์กด์ฌํ๋ค.
Screening์ isDiscountable(DayofWeek dayOfWeek, LocalTime time) ๋ฉ์๋๋ ๋ด๋ถ์ dayOfWeek, time ๋ณ์๋ฅผ ํฌํจํ๊ณ ์์์ ๋ ธ์ถํ๊ณ ์๋ค. Movie์ญ์ ๋ด๋ถ ๊ตฌํ์ ์ธํฐํ์ด์ค์ ๋ ธ์ถ์ํค๊ณ ์๋ค. calculateAmountDiscountedFee๋ ์ด๋ฆ์ผ๋ก ๋ด๋ถ ๊ตฌํ์ ๋ ธ์ถ์ํค๊ณ ์๋ค. ํด๋น ๋ฉ์๋ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ค๋ฉด? ์๋ก์ด ํ ์ธ์ ์ฑ ์ ์ถ๊ฐํ๋ค๋ฉด? ์ด๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ ์ฝ๋ ์ญ์ ์์ ํด์ผ ํ๋ค.
๋ด๋ถ ์์ฑ์ ์บก์ํํ๋๋ผ๋ ๋ด๋ถ ๊ตฌํ์ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ์ธ๋ถ์ ๊ฐ์ฒด๊ฐ ์ํฅ์ ๋ฐ๋๋ค๋ฉด ์บก์ํ๋ฅผ ์๋ฐํ ๊ฒ์ด๋ค. ์ค๊ณ์์ ๋ณํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ๊ณ ๋ คํ๊ณ ๋ณํ๋ ๊ฐ๋ ์ ์บก์ํํด์ผ ํ๋ค. ์ ๋ ๊ฐ์ ๋ฉ์๋ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ด๋ฅผ ์ธํฐํ์ด์ค๋ก ํ ๋จ๊ณ ์ถ์ํํด์ ๋ณ์์ ๋ฉ์๋์ ์ด๋ฆ์ ์จ๊ธฐ๋ ๊ฒ์ด ํด๋ผ์ด์ธํธ ์ฝ๋ ๋ณ๊ฒฝ์ ํ๊ธํจ๊ณผ๋ฅผ ์ค์ผ ์ ์์ ๊ฒ์ด๋ค.
๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ์ ๋ฌธ์ ์
๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ๊ฐ ๋ณ๊ฒฝ์ ์ทจ์ฝํ ์ด์ ๋ ๋ ๊ฐ์ง๋ค.
- ๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ๋ ๋ณธ์ง์ ์ผ๋ก ๋๋ฌด ์ด๋ฅธ ์๊ธฐ์ ๋ฐ์ดํฐ์ ๊ดํด ๊ฒฐ์ ํ๋๋ก ๊ฐ์ํ๋ค.
- ๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ์์๋ ํ๋ ฅ์ด๋ผ๋ ๋ฌธ๋งฅ์ ๊ณ ๋ คํ์ง ์๊ณ ๊ฐ์ฒด๋ฅผ ๊ณ ๋ฆฝ์ํจ ์ฑ ์คํผ๋ ์ด์ ์ ๊ฒฐ์ ํ๋ค.
๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ์ ์์์ "์ด ๊ฐ์ฒด๊ฐ ํฌํจํด์ผ ํ๋ ๋ฐ์ดํฐ๊ฐ ๋ฌด์์ธ๊ฐ?"์ด๋ค. ์์๋ถํฐ ๋ด๋ถ ๊ตฌํ์ ์ด์ ์ ๋ง์ถฐ ์๊ฐํ๋ ๊ฒ์ด๋ค.
๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ ๋ฐฉ์์ ์ต์ํ ๊ฐ๋ฐ์๋ค์ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ๋ ์ ์ฐจ์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ๋ฐ๋ฅธ๋ค. ๊ฐ์ฒด๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ์งํฉ์ฒด์ผ ๋ฟ์ด๊ณ ์ ๊ทผ์์ ์์ ์๋ฅผ ๊ณผ๋ํ๊ฒ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ๋ค. ์ด๋ก์ธํด ์บก์ํ๋ ๋ฌด๋์ง๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ์งธ ์ค๊ณ์ฒ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์คํผ๋ ์ด์ ์ ๊ฐ์ฒด ๋ด๋ถ์ ๋ง๋ค๊ฒ ๋๋๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ์ค์ฌ์ผ๋ก ์คํผ๋ ์ด์ ์ ์ ์ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ด๋ถ ๊ตฌํ์ด ์ธํฐํ์ด์ค์ ๋๋ฌ๋๊ฒ ๋๋ค. ์ด ๋ํ ์บก์ํ๋ฅผ ์๋ฐํ๊ฒ ๋๊ณ ๋ณ๊ฒฝ์ ์ทจ์ฝํด์ง๋ค.
์ฌ๋ฐ๋ฅธ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ๋ฌด๊ฒ ์ค์ฌ์ ํญ์ ๊ฐ์ฒด์ ๋ด๋ถ๊ฐ ์๋ ์ธ๋ถ์ ์์ด์ผ ํ๋ค. ํ์ง๋ง ๋ฐ์ดํฐ ์ค์ฌ์ค๊ณ๋ ๋ด๋ถ๋ก ํฅํ๋ค. ๊ฐ์ฒด์ ์ธํฐํ์ด์ค๊ฐ ๋ด๋ถ ๊ตฌํ์ ์ข ์๋ผ ์์๊ธฐ ๋๋ฌธ์ ๋ด๋ถ ๊ตฌํ์ด ๋ณ๊ฒฝ๋์์ ๋ ํ๋ ฅํ๋ ๊ฐ์ฒด ๋ชจ๋๊ฐ ์ํฅ์ ๋ฐ์ ์ ๋ฐ์ ์๋ ๊ฒ์ด๋ค.
'๋์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ค๋ธ์ ํธ 3์ฅ] - ์ญํ , ์ฑ ์, ํ๋ ฅ (0) | 2024.07.07 |
---|---|
[์ค๋ธ์ ํธ 2์ฅ] - ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ (0) | 2024.06.29 |
[์ค๋ธ์ ํธ 1์ฅ] - ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์ (0) | 2024.06.29 |