
๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ฑ ์์ด๋ค.
์ฑ ์์ ์ค์ฌ์ผ๋ก ์์คํ ์ ํ๋ณด(์ญํ , ๊ฐ์ฒด, ํด๋์ค)๋ก ๋ถํ ํ๋ค.
๊ฐ์ฒด์งํฅ ์ค๊ณ๋ 2๊ฐ์ง ๋ฐฉ์์ผ๋ก ์์คํ ์ ๊ฐ์ฒด๋ก ๋ถํ ํ ์ ์๋ค.
๋ฐ์ดํฐ ์ค์ฌ์ ๊ด์ ์์ ๊ฐ์ฒด๋ ์์ ์ด ํฌํจํ๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋๋ฐ ํ์ํ ์คํผ๋ ์ด์
์ ์ ์ํ๋ค. -> ์ํ์ ์ด์
์ฑ
์ ์ค์ฌ์ ๊ด์ ์์ ๊ฐ์ฒด๋ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์์ฒญํ ์ ์๋ ์คํผ๋ ์ด์
์ ์ํด ํ์ํ ์ํ๋ฅผ ๋ณด๊ดํ๋ค. -> ์ฑ
์์ ์ด์
์์คํ ์ ๋ถํ ํ๊ธฐ ์ํด์๋ ์ฑ ์์ ์ด์ ์ ๋ง์ถฐ์ผ ํ๋ค.
๊ฐ์ฒด์ ์ํ๋ฅผ ๊ตฌํ์ ์ํ๋ค. ๊ตฌํ์ ๋ถ์์ ํ๊ธฐ ๋๋ฌธ์ ๋ณํ๊ธฐ ์ฝ๋ค.
์ํ๋ฅผ ๋ถํ ์ ์ค์ฌ์ถ์ผ๋ก ๋ณด๋ฉด, ๊ตฌํ์ ๊ดํ ์ธ๋ถ์ฌํญ์ด ๊ฐ์ฒด์ ์ธํฐํ์ด์ค์ ์ค๋ฉฐ๋ค๊ฒ ๋์ด ์บก์ํ์ ์์น์ด ๋ฌด๋์ง๋ค.
์ด์ ๋ฐํด ๊ฐ์ฒด์ ์ฑ ์์ ์ธํฐํ์ด์ค์ ์ํ๋ค.
์์ํ๊ฒ ๋ฐ์ดํฐ์ accessot, mutator๋ง ์กด์ฌํ๋ ํด๋์ค๋ค

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);
}
}
Discountcondition์ ๋ํด ๋ฃจํ๋ฅผ ๋๋ฉด์ ํ ์ธ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค.
discountable ๋ณ์์ ๊ฐ์ ์ฒดํฌํ๊ณ ์ ์ ํ ํ ์ธ ์ ์ฑ
์ ๋ฐ๋ผ ์๋งค ์๊ธ์ ๊ณ์ฐํ๋ค.
๊ฐ์ฒด์งํฅ ์ปค๋ฎค๋ํฐ์์๋ ์ค๋ ๊ธฐ๊ฐ ๋์ ์ข์ ์ค๊ณ์ ํน์ง์ ํ๋จํ ์ ์๋ ๊ธฐ์ค์ ๊ดํ ๋ค์ํ ๋ ผ์๊ฐ ์์ด ์๋ค. ์ฌ๊ธฐ์๋ ๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ์ ์ฑ ์ ์ค์ฌ ์ค๊ณ์ ์ฅ๋จ์ ์ ๋น๊ตํ๊ธฐ ์ํด ์บก์ํ, ์์ง๋, ๊ฒฐํฉ๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค.
์ํ์ ํ๋์ ํ๋์ ๊ฐ์ฒด ์์ ๋ชจ์ผ๋ ์ด์ ๋ ๋ด๋ถ ๊ตฌํ์ ๊ฐ์ถ๊ธฐ ์ํด์๋ค.
ํ๋๊ฐ ์๋๋ฌ๋๊ฒ ํ๊ธฐ ์ํจ
์ค์ง ์ธํฐํ์ด์ค๋ง ๋ฐ์ผ๋ก ๋๋ฌ๋๋ค. ๋ณ๊ฒฝ๋ ์ ์๋ ์ด๋ค ๊ฒ์ด๋ผ๋ ์บก์ํํด์ผ ํ๋ค.
์ ์ง๋ณด์์ฑ์ด ๋ชฉํ๋ค. ์ฌ๊ธฐ์ ์ ์ง๋ณด์์ฑ์ด๋ ๋๋ ค์ ์์ด, ์ฃผ์ ํจ ์์ด, ์ ํญ๊ฐ ์์ด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๋ฅ๋ ฅ์ ๋งํ๋ค. ๊ฐ์ฅ ์ค์ํ ๋๋ฃ๋ ์บก์ํ๋ค. ์บก์ํ๋ ์ด๋ค ๊ฒ์ ์จ๊ธด๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ฐ๋ฆฌ๋ ์์คํ ์ ํ ๋ถ๋ถ์ ๋ค๋ฅธ ๋ถ๋ถ์ผ๋ก๋ถํฐ ๊ฐ์ถค์ผ๋ก์จ ๋ป๋ฐ์ ํผํด๊ฐ ๋ฐ์ํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ์ฌ์ ์ ๋ฐฉ์งํ ์ ์๋ค. ๋ง์ฝ ์์คํ ์ด ์์ ํ ์บก์ํ๋๋ค๋ฉด ์ฐ๋ฆฌ๋ ๋ณ๊ฒฝ์ผ๋ก๋ถํฐ ์์ ํ ์์ ๋ก์์ง ๊ฒ์ด๋ค. ๋ง์ฝ ์์คํ ์ ์บก์ํ๊ฐ ํฌ๊ฒ ๋ถ์กฑํ๋ค๋ฉด ์ฐ๋ฆฌ๋ ๋ณ๊ฒฝ์ผ๋ก๋ถํฐ ์์ ๋ก์ธ ์ ์๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋ก ์์คํ ์ ์งํํ ์ ์์ ๊ฒ์ด๋ค. ์์ง๋, ๊ฒฐํฉ๋, ์ค๋ณต ์ญ์ ํ๋ฅญํ(๋ณ๊ฒฝ ๊ฐ๋ฅํ) ์ฝ๋๋ฅผ ๊ท์ ํ๋ ๋ฐ ํต์ฌ์ ์ธ ํ์ง์ธ ๊ฒ์ด ์ฌ์ค์ด์ง๋ง ์บก์ํ๋ ์ฐ๋ฆฌ๋ฅผ ์ข์ ์ฝ๋๋ก ์๋ดํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์ค์ํ ์ 1์๋ฆฌ๋ค[Bain08].
๊ตฌ์กฐ์ ์ค๊ณ ๋ฐฉ๋ฒ์ด ์ฃผ๋ํ๋ ์๋์ ๊ธฐ์ค์ด๋ ๊ฐ์ฒด์งํฅ์ ์๋์๋ ์ฌ์ ํ ์ ํจํ๋ค.
์์ง๋ย
๊ฒฐํฉ๋
๋ณ๊ฒฝ์ ๊ด์ ์์ ์์ง๋๋ ๋ณ๊ฒฝ์ด ๋ฐ์ํ ๋ ๋ชจ๋ ๋ด๋ถ์์ ๋ฐ์ํ๋ ๋ณ๊ฒฝ์ ์ ๋๋ค.
ํ๋์ ๋ณ๊ฒฝ์ ์์ฉํ๊ธฐ ์ํด ๋ชจ๋ ์ ์ฒด๊ฐ ํจ๊ป ๋ณ๊ฒฝ๋๋ค๋ฉด ์์ง๋๊ฐ ๋์ ๊ฒ์ด๊ณ , ์ผ๋ถ๋ง ๋ณ๊ฒฝ๋๋ค๋ฉด ์์ง๋๊ฐ ๋ฎ์ ๊ฒ์ด๋ค.
๋ํ ํ๋์ ๋ณ๊ฒฝ์ ๋ํด ํ๋์ ๋ชจ๋๋ง ๋ณ๊ฒฝ๋๋ฉด ์์ง๋๊ฐ ๋์ง๋ง, ๋ค์์ ๋ชจ๋์ด ๋ณ๊ฒฝ๋๋ฉด ์์ง๋๊ฐ ๋ฎ์ ๊ฒ์ด๋ค.

์ ๊ทธ๋ฆผ์ ๋ณ๊ฒฝ๊ณผ ์์ง๋ ์ฌ์ด์ ๊ด๊ณ๋ฅผ ๊ทธ๋ฆผ์ ํํธํ ๊ฒ์ด๋ค.
๋์ ์์ง๋(High Cohesion)
๋ฎ์ ์์ง๋(Low Cohesion)
์์ง๋๊ฐ ๋์์๋ก ๋ณ๊ฒฝ์ ๋์๊ณผ ๋ฒ์๊ฐ ๋ช ํํด์ง๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ฌ์์ง๋ค.

๊ฒฐํฉ๋ ์ญ์ ๋ณ๊ฒฝ์ ๊ด์ ์์ ์ค๋ช
ํ ์ ์๋ค. ๊ฒฐํฉ๋๋ ํ ๋ชจ๋์ด ๋ณ๊ฒฝ๋๊ธฐ ์ํด์ ๋ค๋ฅธ ๋ชจ๋์ ๋ณ๊ฒฝ์ ์๊ตฌํ๋ ์ ๋๋ก ์ธก์ ํ ์ ์๋ค.
๋ฎ์ ๊ฒฐํฉ๋(Low Coupling)
๋์ ๊ฒฐํฉ๋(High Coupling)
๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ๋ ์บก์ํ๋ฅผ ์๋ฐํ๊ณ ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌํ์ ์ธํฐํ์ด์ค์ ์ผ๋ถ๋ก ๋ง๋ ๋ค.
๋ฐ๋ฉด, ์ฑ
์ ์ค์ฌ์ ์ค๊ณ๋ ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌํ์ ์์ ์ ์ธ ์ธํฐํ์ด์ค ๋ค๋ก ์บก์ํํ๋ค.
์บก์ํ์ ์ ๋๊ฐ ๊ฐ์ฒด์ ์์ง๋์ ๊ฒฐํฉ๋๋ฅผ ๊ฒฐ์ ํ๋ค๋ ์ฌ์ค์ ๊ธฐ์ตํด์ผ ํ๋ค.
๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ๊ฐ ๊ฐ์ง ๋ํ์ ์ธ ๋ฌธ์ ์ ๋ค
public class Movie {
private Money fee;
public Money getFee() {
return fee;
}
public void setFee(Money fee) {
this.fee = fee;
}
}
get, set ๋ฉ์๋๋ Movie ๋ด๋ถ์ Money ํ์ ์ fee๋ผ๋ ์ด๋ฆ์ ์ธ์คํด์ค ๋ณ์๊ฐ ์กด์ฌํ๋ค๋ ์ฌ์ค์ ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค์ ๋ ธ๊ณจ์ ์ผ๋ก ๋๋ฌ๋ธ๋ค.
Movie๊ฐ ์บก์ํ์ ์์น์ ์ด๊ธฐ๊ฒ ๋ ๊ทผ๋ณธ์ ์ธ ์์ธ์ ๊ฐ์ฒด๊ฐ ์ํํ ์ฑ ์์ด ์๋๋ผ ๋ด๋ถ์ ์ ์ฅํ ๋ฐ์ดํฐ์ ์ด์ ์ ๋ง์ท๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฐ์ฒด์ ์ค์ํ ๊ฒ์ ์ฑ ์์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ตฌํ์ ์บก์ํํ ์ ์๋ ์ ์ ํ ์ฑ ์์ ํ๋ ฅ์ด๋ผ๋ ๋ฌธ๋งฅ์ ๊ณ ๋ คํ ๋๋ง ์ป์ ์ ์๋ค.
์ง๊ธ๊น์ง ์ดํด๋ณธ ๊ฒ์ฒ๋ผ ๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ๋ ์ ๊ทผ์์ ์์ ์๋ฅผ ํตํด ๋ด๋ถ ๊ตฌํ์ ์ธํฐํ์ด์ค์ ์ผ๋ถ๋ก ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์บก์ํ๋ฅผ ์๋ฐํ๋ค. ๊ฐ์ฒด ๋ด๋ถ์ ๊ตฌํ์ด ๊ฐ์ฒด์ ์ธํฐํ์ด์ค์ ๋๋ฌ๋๋ค๋ ๊ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌํ์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ๋์ ์์์ ๋จ์ง ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌํ์ ๋ณ๊ฒฝํ์์๋ ์ด ์ธํฐํ์ด์ค์ ์์กดํ๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ๋ค๋ ํจ๊ฒ ๋ณ๊ฒฝํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.

์ ๊ทธ๋ฆผ์ ์ดํด๋ณด๋ฉด ๋๋ถ๋ถ์ ์ ์ด ๋ก์ง์ ๊ฐ์ง๊ณ ์๋ ์ ์ด ๊ฐ์ฒด์ธ ReservationAgency๊ฐ ๋ชจ๋ ๋ฐ์ดํฐ ๊ฐ์ฒด์ ์์กดํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค. DiscountCondition์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด DiscountCondition๋ฟ๋ง ์๋๋ผ ReservationAgency๋ ํจ๊ป ์์ ํด์ผ ํ๋ค.
์๋ก ๋ค๋ฅธ ์ด์ ๋ก ๋ณ๊ฒฝ๋๋ ์ฝ๋๊ฐ ๋ชจ๋ ์์ ๊ณต์กดํ๋ฉด ์์ง๋๊ฐ ๋ฎ๋ค.
์ฝ๋๋ฅผ ์์ ํ๋ ์ด์ ๋ฅผ ์ฐพ์๋ณด์
ReservationAgency๊ฐ ๋ณ๊ฒฝ๋๋ ์ด์
๋ฎ์ ์์ง๋๋ ๋๊ฐ์ง ์ธก๋ฉด์์ ์ค๊ณ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํจ๋ค
๋ณ๊ฒฝ์ ์์ธ์ด ๋ค๋ฅธ ์ฝ๋๋ค์ด ํ๋์ ๋ชจ๋ ์์ ๋ญ์ณ์์ด ๋ณ๊ฒฝ๊ณผ ์๋ฌด ์๊ด ์๋ ์ฝ๋๋ค์ด ์ํฅ์ ๋ฐ๋๋ค.
ํ๋์ ์๊ตฌ์ฌํญ ๋ณ๊ฒฝ์ ์ํด ์ฌ๋ฌ ๋ชจ๋์ ๋์์ ์์ ํด์ผ ํ๋ค.

์บก์ํ๋ ์ค๊ณ์ ์ 1์๋ฆฌ๋ค. ๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ๊ฐ ๋ฎ์ ์์ง๋์ ๋์ ๊ฒฐํฉ๋๋ผ๋ ๋ฌธ์ ๋ก ๋ชธ์ด์ ์๊ฒ ๋ ๊ทผ๋ณธ์ ์ธ ์์ธ์ ๋ฐ๋ก ์บก์ํ์ ์์น์ ์๋ฐํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฐ์ฒด๋ ์์ ์ด ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง๋ฅผ ๋ด๋ถ์ ์บก์ํํ๊ณ ์ธ๋ถ์ ๊ณต๊ฐํด์๋ ์๋๋ค. ๊ฐ์ฒด๋ ์ค์ค๋ก์ ์ํ๋ฅผ ์ฑ ์์ ธ์ผ ํ๋ฉฐ ์ธ๋ถ์์๋ ์ธํฐํ์ด์ค์ ์ ์๋ ๋ฉ์๋๋ฅผ ํตํด์๋ง ์ํ์ ์ ๊ทผํ ์ ์์ด์ผ ํ๋ค.
์์ : ์ฌ๊ฐํ์ ๋๋น์ ๋์ด๋ฅผ ์ฆ๊ฐ์ํค๋ ์ฝ๋
class AnyClass{
void anyMethod(Rectangle rectangle, int multiple){
rectangle.setRight(rectangle.getRight()*multiple)
rectangle.setBottom(rectangle.getBottom()*multiple)
}
}
ํด๋น ์ฝ๋์ ๋ฌธ์ ์
ํด๊ฒฐ ๋ฐฉ๋ฒ: ์บก์ํ๋ฅผ ๊ฐํ์ํค์
class Rectangle{
public void enlarge(int multiple){
right *= multiple;
bottom *= multiple;
}
}
Rectangle ๋ด๋ถ์ ๋๋น์ ๋์ด๋ฅผ ์กฐ์ ํ๋ ๋ก์ง์ ์บก์ํํ๋ฉด ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๊ฐ์ฒด๋ฅผ ์ค๊ณํ ๋ "์ด ๊ฐ์ฒด๊ฐ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ํฌํจํด์ผ ํ๋๊ฐ?"๋ผ๋ ์ง๋ฌธ์ ๋ค์๊ณผ๊ฐ์ ๋ ๊ฐ์ ๊ฐ๋ณ์ ์ธ ์ง๋ฌธ์ผ๋ก ๋ถ๋ฆฌํด์ผ ํ๋ค.
์ด์ ์ ์ค๊ณ๋ฅผ ์์ ํด๋ณด์.
๋ฐ๋ผ์ ์ด ๊ฐ์ฒด๋ค์ด ์ค์ค๋ก ์ฑ ์์ง๋๋ก ๋ง๋ค์.
์ฒซ๋ฒ์งธ ์ค๊ณ

๋๋ฒ์งธ ์ค๊ณ

๋ ์ค๊ณ๋ฅผ ๋น๊ตํด๋ณด์. ๋ฌด์์ด ๋ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ๋ณด์ด๋๊ฐ?
์ต์ํ ๊ฒฐํฉ๋ ์ธก๋ฉด์์ ReservationAgency์ ์์กด์ฑ์ด ๋ชฐ๋ ค์๋ ์ฒซ ๋ฒ์งธ ์ค๊ณ๋ณด๋ค๋ ๋ ๋ฒ์งธ ์ค๊ณ๊ฐ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ๋ณด์ธ๋ค.
์ฌ์ค ๋ ๋ฒ์งธ ์ค๊ณ ์ญ์ ๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ ๋ฐฉ์์ ์ํ๋ค๊ณ ํ ์ ์๋ค.
๊ทธ ์ด์ ๋ฅผ ์์๋ณด์.
๋ถ๋ช ํ ์์ ๋ ๊ฐ์ฒด๋ค์ ์๊ธฐ ์์ ์ ๋ฐ์ดํฐ๋ฅผ ์ค์ค๋ก ์ฒ๋ฆฌํ๋ค. ์๋ฅผ ๋ค์ด DiscountCondition์ ์๊ธฐ ์์ ์ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด ํ ์ธ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ์ค์ค๋ก ํ๋จํ๋ค.
DiscountCondition์ ๋ด๋ถ ์ธ์คํด์ค ๋ณ์์ ํ์ ์ ์ธํฐํ์ด์ค๋ก ์ธ๋ถ์ ๋ ธ์ถํ๋ค.
Movie๋ ํ ์ธ ์ ์ฑ ์ ์ข ๋ฅ(case, if)๋ฅผ ์ธํฐํ์ด์ค์ ๋ ธ์ถ์ํค๊ณ ์๋ค.
์บก์ํ์ ์ง์ ํ ์๋ฏธ
์ฌ์ค ์บก์ํ๋ ๋ณ๊ฒฝ๋ ์ ์๋ ์ด๋ค ๊ฒ์ด๋ผ๋ ๊ฐ์ถ๋ ๊ฒ์ ์๋ฏธํ๋ค. ๋ด๋ถ ์์ฑ์ ์ธ๋ถ๋ก๋ถํฐ ๊ฐ์ถ๋ ๊ฒ์ '๋ฐ์ดํฐ ์บก์ํ'๋ผ๊ณ ๋ถ๋ฆฌ๋ ์บก์ํ์ ํ ์ข ๋ฅ์ผ ๋ฟ์ด๋ค.
์ง์ ํ ์บก์ํ๋ ์์ฑ ํ์ ์ด๊ฑด, switch๋ฌธ์ case์ด๊ฑด ๊ด๊ณ์์ด ๊ตฌํ๊ณผ ๊ด๋ จ๋ ๊ฒ์ ๋ชจ๋ ๊ฐ์ถ๋ ๊ฒ์ด๋ค.
์ฌ์ฉ ๊ฐ์ฒด ๋ด๋ถ์ type์ ๊บผ๋ด์ switchํ๋ ๊ฒฝ์ฐ, ๋ด๋ถ type์ ์ผ์ด์ค๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ฌ์ฉ์ฒ๋ฅผ ๋ฐ๊ฟ์ค์ผ ํ๋ค.
DiscountCondition์ ๋ง์กฑ ์ฌ๋ถ ํ๋จ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋๋ฉด isDiscountable์ ๋ฉ์๋ ํ๋ผ๋ฏธํฐ๋ ๋ณ๊ฒฝํด์ผ ํ๋ค. (whenScreened,sequence ๋ ๋ค ์ฐ๊ณ ์์)
DiscountCondition ๋ณ๊ฒฝ => Movie ๋ณ๊ฒฝ => Screening ๋ณ๊ฒฝ
ํ๋์ ๋ณ๊ฒฝ์ ์์ฉํ๊ธฐ ์ํด ์ฌ๋ฌ ๋ชจ๋์ ๋์์ ๋ณ๊ฒฝํด์ผ ํ๋ค.
DiscountCondition์ด ํ ์ธ ์ฌ๋ถ ํ๋จ์ ํ์ํ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋๋ฉด
ํ๋์ ๋ณ๊ฒฝ์ ์์ฉํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ณณ(๋ด๋ถ์ ์ฌ๋ฌ ๋ฉ์๋, ๋ค๋ฅธ ๋ชจ๋)์ ๋์์ ๋ณ๊ฒฝํด์ผ ํ๋ค.
๋ค์ ๋งํ์ง๋ง ๋ด๋ถ ๊ตฌํ(DiscountCondition์ ํ๋)์ด ๋ ธ์ถ๋์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ๊ฐ ๋ณ๊ฒฝ์ ์ทจ์ฝํ ์ด์ ๋ ๊ฐ์ง
๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ๋ฅผ ์์ํ ๋ ๋์ก๋ ์ฒซ ๋ฒ์งธ ์ง๋ฌธ์ "์ด ๊ฐ์ฒด๊ฐ ํฌํจํด์ผ ํ๋ ๋ฐ์ดํฐ๊ฐ ๋ฌด์์ธ๊ฐ?"๋ค. ๋ฐ์ดํฐ๋ ๊ตฌํ์ ์ผ๋ถ์ด๋ค.
๋ฐ์ดํฐ ์ฃผ๋ ์ค๊ณ๋ ์์ํ๋ ์ฒ์๋ถํฐ ๋ฐ์ดํฐ์ ๊ดํด ๊ฒฐ์ ํ๋๋ก ๊ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ฌด ์ด๋ฅธ ์๊ธฐ์ ๋ด๋ถ ๊ตฌํ์ ์ด์ ์ ๋ง์ถ๋ค.
๋ฐ์ดํฐ ์ค์ฌ์ ๊ด์ ์์ ๊ฐ์ฒด๋ ๊ทธ์ ๋จ์ํ ๋ฐ์ดํฐ์ ์งํฉ์ฒด์ผ ๋ฟ์ด๋ค. ์ด๋ก ์ธํด ์ ๊ทผ์์ ์์ ์๋ฅผ ๊ณผ๋ํ๊ฒ ์ถ๊ฐํ๊ฒ ๋๊ณ ์ด ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์ ์ฐจ๋ฅผ ๋ถ๋ฆฌ๋ ๋ณ๋์ ๊ฐ์ฒด ์์ ๊ตฌํํ๊ฒ ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ๋ ๋๋ฌด ์ด๋ฅธ ์๊ธฐ์ ๋ฐ์ดํฐ์ ๋ํด ๊ณ ๋ฏผํ๊ธฐ ๋๋ฌธ์ ์บก์ํ์ ์คํจํ๊ฒ ๋๋ค. ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌํ์ด ๊ฐ์ฒด์ ์ธํฐํ์ด์ค๋ฅผ ์ด์ง๋ฝํ๊ณ ๊ฐ์ฒด์ ์์ง๋์ ๊ฒฐํฉ๋์ ๋์ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ์ ์ทจ์ฝํ ์ฝ๋๋ฅผ ๋ณ๊ฒ ๋๋ค.
๊ฐ์ฒด์งํฅ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌํํ๋ค๋ ๊ฒ์ ํ๋ ฅํ๋ ๊ฐ์ฒด๋ค์ ๊ณต๋์ฒด๋ฅผ ๊ตฌ์ถํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๋ฐ๋ผ์ ํ๋ ฅ์ด๋ผ๋ ๋ฌธ๋งฅ ์์์ ํ์ํ ์ฑ
์์ ๊ฒฐ์ ํ๊ณ ์ด๋ฅผ ์ํํ ์ ์ ํ ๊ฐ์ฒด๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํ๋ค.
์ฌ๋ฐ๋ฅธ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ๋ฌด๊ฒ ์ค์ฌ์ ํญ์ ๊ฐ์ฒด์ ๋ด๋ถ๊ฐ ์๋๋ผ ์ธ๋ถ์ ๋ง์ถฐ์ ธ ์์ด์ผ ํ๋ค.
์ถ์ฒ
์ค๋ธ์ ํธ - ์ฝ๋๋ก ์ดํดํ๋ ๊ฐ์ฒด์งํฅ ์ค๊ณ
https://github.com/eternity-oop/object