๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ์์ ์ฑ ์ ์ค์ฌ์ ์ค๊ณ๋ก ์ ํํ๊ธฐ ์ํด์๋ ๋ค์์ ๋ ๊ฐ์ง ์์น์ ๋ฐ๋ผ์ผ ํ๋ค.
๊ฐ์ฒด์๊ฒ ์ค์ํ ๊ฒ์ ๋ฐ์ดํฐ๊ฐ ์๋๋ผ ์ธ๋ถ์ ์ ๊ณตํ๋ ํ๋์ด๋ค. ํด๋ผ์ด์ธํธ์ ๊ด์ ์์ ๊ฐ์ฒด๊ฐ ์ํํ๋ ํ๋์ด๋ ๊ณง ๊ฐ์ฒด์ ์ฑ ์์ ์๋ฏธํ๋ค. ๊ฐ์ฒด๋ ํ๋ ฅ์ ์ฐธ์ฌํ๊ธฐ ์ํด ์กด์ฌํ๋ฉฐ ํ๋ ฅ ์์์ ์ํํ๋ ์ฑ ์์ด ๊ฐ์ฒด์ ์กด์ฌ๊ฐ์น๋ฅผ ์ฆ๋ช ํ๋ค.
๊ฐ์ฒด์งํฅ ์ค๊ณ์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ ์ ํ ๊ฐ์ฒด์๊ฒ ์ ์ ํ ์ฑ
์์ ํ ๋นํ๋ ๋ฅ๋ ฅ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ๊ฐ์ฒด์๊ฒ ์ด๋ค ์ฑ
์์ ํ ๋นํด์ผ ํ๋๊ฐ?
ํด๊ฒฐ์ ์ค๋ง๋ฆฌ๋ฅผ ํ๋ ฅ์์ ์ฐพ์ ์ ์๋ค.
๊ฐ์ฒด์๊ฒ ํ ๋น๋ ์ฑ
์์ ํ์ง์ ํ๋ ฅ์ ์ ํฉํ ์ ๋๋ก ๊ฒฐ์ ๋๋ค.
๋ฉ์์ง๋ฅผ ์ ์กํ๋ ํด๋ผ์ด์ธํธ์ ์๋์ ์ ํฉํ ์ฑ
์์ ํ ๋นํด์ผ ํ๋ค. ํ๋ ฅ์ ์ ํฉํ ์ฑ
์์ ์ํํ๊ธฐ ์ํด์๋ ๊ฐ์ฒด๋ฅผ ๊ฒฐ์ ํ ํ์ ๋ฉ์์ง๋ฅผ ์ ํํ๋ ๊ฒ์ด ์๋๋ผ ๋ฉ์์ง๋ฅผ ๊ฒฐ์ ํ ํ์ ๊ฐ์ฒด๋ฅผ ์ ํํด์ผ ํ๋ค. ๋ฉ์์ง๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๊ทธ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ ๊ฐ์ฒด๊ฐ ํ์ํ ๊ฒ์ด๋ค.
๊ฐ์ฒด๊ฐ ๋ฉ์์ง๋ฅผ ์ ํํ๋ ๊ฒ์ด ์๋๋ผ ๋ฉ์์ง๊ฐ ๊ฐ์ฒด๋ฅผ ์ ํํ๊ฒ ํด์ผ ํ๋ค.

๋ฉ์์ง๋ ํด๋ผ์ด์ธํธ์ ์๋๋ฅผ ํํํ๋ค.
๋ฉ์์ง๋ฅผ ๋จผ์ ํํํ๋ฉด, ์์ ์์ ๋ํ ์ด๋ ํ ๊ฐ์ ์์๋ ์์ ๋ก์์ง๋ค. (๊น๋ํ ์บก์ํ)
GRASP(General Responsibility Assign Software Pattern) ํจํด์ ๊ฐ์ฒด์๊ฒ ์ฑ ์์ ํ ๋นํ ๋ ์ง์นจ์ผ๋ก ์ผ์ ์ ์๋ ์์น๋ค์ ์งํฉ์ ํจํด ํ์์ผ๋ก ์ ๋ฆฌํ ๊ฒ์ด๋ค.
์ฑ ์ ํ ๋น ์ ๊ฐ์ฅ ๋จผ์ ๊ณ ๋ฏผํด์ผ ํ๋ ๊ฒ์ ๋๋ฉ์ธ ๊ฐ๋ ์ด๋ค.

์ ๊ทธ๋ฆผ์ ํ๋์ ์ํ๋ ์ฌ๋ฌ๋ฒ ์์๋ ์ ์์ผ๋ฉฐ, ํ๋์ ์์์ ์ฌ๋ฌ๋ฒ ์์ฝ๋ ์ ์๋ค๋ ๊ฒ์ ๋ํ๋ธ๋ค. ํ ์ธ ์ ์ฑ
๊ณผ ํ ์ธ ์กฐ๊ฑด์ ๊ฐ๊ฐ 2๊ฐ์ด๋ฉฐ, ํ ์ธ ์กฐ๊ฑด์ ์ฌ๋ฌ๊ฐ์ผ ์ ์์ง๋ง ํ ์ธ ์ ์ฑ
์ ํ๋๋ง ๊ฐ๋ฅํ๋ค.
์ค๊ณ ์์ ๋จ๊ณ์์๋ ๊ฐ๋ ๋ค์ ์๋ฏธ๋ ๊ด๊ณ๊ฐ ์๋ฒฝํ ํ์๊ฐ ์๋ค. ์ฐ๋ฆฌ์๊ฒ๋ ์ถ๋ฐ์ ์ด ํ์ํ ๋ฟ์ด๋ค.
๋๋ฉ์ธ ๊ฐ๋ ๊ณผ ๊ด๊ณ๋ ๊ตฌํ์ ๊ธฐ๋ฐ์ด ๋๋ค.
์ฑ ์ ์ฃผ๋ ์ค๊ณ ๋ฐฉ์์ ์ฒซ ๋จ๊ณ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ๊ณตํด์ผ ํ๋ ๊ธฐ๋ฅ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ ์์ผ๋ก ์๊ฐํ๋ ๊ฒ์ด๋ค.
์ด ์ฑ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํด ์ ์ก๋ ๋ฉ์์ง๋ก ๊ฐ์ฃผํ๊ณ ์ด ๋ฉ์์ง๋ฅผ ์ฑ ์์ง ์ฒซ๋ฒ์งธ ๊ฐ์ฒด๋ฅผ ์ ํํ๋ ๊ฒ์ผ๋ก ์ค๊ณ๋ฅผ ์์ํ๋ค.
์ฒซ ๋ฒ์งธ ์ง๋ฌธ
ํ๋ ฅ์ ์์ํ๋ ๊ฐ์ฒด๋ ๋ฏธ์ ์ด์ง๋ง ์ด ๊ฐ์ฒด๊ฐ ์ํ๋ ๊ฒ์ ๋ถ๋ช
ํด ๋ณด์ธ๋ค. ๋ฐ๋ก ์ํ๋ฅผ ์๋งคํ๋ ๊ฒ์ด๋ค.

ํ๋ ฅ์ ์์ํ๋ ๊ฐ์ฒด๋ ๋ฏธ์ ์ด์ง๋ง ์ด ๊ฐ์ฒด๊ฐ ์ํ๋ ๊ฒ์ ๋ถ๋ช
ํ๋ค.
๋ ๋ฒ์งธ ์ง๋ฌธ
์ด ์ง๋ฌธ์ ๋ตํ๊ธฐ ์ํด์๋ ๊ฐ์ฒด๊ฐ ์ํ์ ํ๋์ ํตํฉํ ์บก์ํ์ ๋จ์๋ผ๋ ์ฌ์ค์ ์ง์คํด์ผ ํ๋ค.
๊ฐ์ฒด์๊ฒ ์ฑ
์์ ํ ๋ค์๋ ์ฒซ ๋ฒ์งธ ์์น์ ์ฑ
์์ ์ํํ ์ ๋ณด๋ฅผ ์ ๊ณ ์๋ ๊ฐ์ฒด์๊ฒ ์ฑ
์์ ํ ๋นํ๋ ๊ฒ์ด๋ค. GRASP์์๋ INFORMATION EXPERT(์ ๋ณด ์ ๋ฌธ๊ฐ) ํจํด์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
INFORMATION EXPERT ํจํด์ ๊ฐ์ฒด๊ฐ ์์จ์ ์ธ ์กด์ฌ์ฌ์ผ ํ๋ค๋ ๊ฒ์ ์๊ธฐ์ํจ๋ค.
์ ๋ณด๋ฅผ ์๊ณ ์๋ ๊ฐ์ฒด๋ง์ด ์ฑ ์์ ์ด๋ป๊ฒ ์ํํ ์ง ์ค์ค๋ก ๊ฒฐ์ ํ ์ ์๋ค.์ ๋ณด์ ํ๋์ด ๊ฐ๊น์ด๋ฐ ๋ญ์ณ ์บก์ํ๊ฐ ์ ์ง๋๋ฉฐ, ์ ๋ณด๋ณ๋ก ์ฑ ์์ด ๋ถ์ฐ๋์ด ์์ง๋๊ฐ ๋์์ง๊ณ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๋ค.๋ํ ๊ฐ๋ ์ฑ์ด ๋์์ง๋ค.
์๊ณ ์๋ค๋ ๊ฒ์ ๊ผญ ํ๋(์ ์๋ ๋ฐ์ดํฐ)์ผ ํ์๋ ์๋ค. ์ ๋ณด๋ ์ ๊ณตํ ์ ์๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์๊ฑฐ๋ ๊ณ์ฐํด์ ์ ๊ณตํ ์ ์๋ค.

์์์ ์์ ์๋ฒ, ์์ ์๊ฐ, ์ํ ์ ๋ณด ๋ฑ์ ๊ฐ์ฅ ๋ง์ ์ ๋ณด๋ฅผ ์๊ณ ์๋ค.

์์์ ์ํ ๊ฐ๊ฒฉ์ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์(์บก์ํ) ๊ณ์ฐ์ ์์ฒญํ๋ค.

์ํ๋ ํ ์ธ ์ฌ๋ถ ํ๋จ์ ๋ชปํ๋ฏ๋ก ํ ์ธ ์ฌ๋ถ ํ๋จ์ ์์ฒญํ๋ค.

์ํ๋ ํ ์ธ ์ ์ฑ
์ ์๊ณ ์์ผ๋ฏ๋ก ํ ์ธ ์ ์ฑ
์ ๋ฐ๋ผ ์๊ธ์ ๊ณ์ฐํด์ ๋ฐํํ๋ค.
์ค๊ณ๋ ํธ๋ ์ด๋์คํ ํ๋์ด๋ค.
๋ช ๊ฐ์ง ์ค๊ณ ์ค ํ๋๋ฅผ ์ ํํด์ผ ํ๋ ๊ฒฝ์ฐ INFORMATION EXPERT ํจํด ์ด์ธ์ ๋ค๋ฅธ ์ฑ
์ ํ ๋น ํจํด๋ค์ ํจ๊ป ๊ณ ๋ คํ ํ์๊ฐ ์๋ค.

๋ฐ๋๋ก ์์์ด ์ง์ ํ ์ธ์กฐ๊ฑด์ด๋ ํ๋ ฅํ๋ค๋ฉด?
LOW COPLING ํจํด
์ค๊ณ์ ์ ์ฒด์ ์ธ ๊ฒฐํฉ๋๊ฐ ๋ฎ๊ฒ ์ ์ง๋๋๋ก ์ฑ ์์ ํ ๋นํ๋ผ.
์์์ด 2๊ฐ์ ํ๋ ฅํ๋ ๋๋ฒ์งธ ๊ตฌ์กฐ๋ ๊ฒฐํฉ๋๊ฐ ๋์์ ธ ์ข์ง ์์ ์ค๊ณ์ด๋ค.
HIGH COHESION ํจํด
๋์ ์์ง๋๋ฅผ ์ ์งํ ์ ์๊ฒ ์ฑ ์์ ํ ๋นํ๋ผ.
๋๋ฒ์งธ ๊ตฌ์กฐ๋ Screen์๊ฒ ์ํ ์๊ธ ๊ณ์ฐ ์ฑ ์์ด ๋ถ์ฐ๋๋ค. ์ฆ Screen์ ์ฑ ์์ด ๋์ด๋๋ค.
์ด๋ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ฌ์ง๋ ์ฆ๊ฐํ๋ค.
์ฒซ๋ฒ์งธ ๊ตฌ์กฐ์์ Movie์ ์ฑ ์์ ๊ฐ๊ฒฉ ๊ณ์ฐ์ด๊ธฐ ๋๋ฌธ์, ํ ์ธ์กฐ๊ฑด๊ณผ์ ํ๋ ฅ์ ์์ง๋ ๋์ ์ค๊ณ์ด๋ค.
GRASP์ CREATOR(์ฐฝ์กฐ์) ํจํด์ ์ด ๊ฐ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์๋ ์ฑ ์ ํ ๋น ํจํด์ผ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ฑ ์์ ์ด๋ค ๊ฐ์ฒด์๊ฒ ํ ๋นํ ์ง์ ๋ํ ์ง์นจ์ ์ ๊ณตํ๋ค.
CREATOR ํจํด
์๋ ์กฐ๊ฑด์ ์ต๋ํ ๋ง์ด ๋ง์กฑํ๋ B์๊ฒ ๊ฐ์ฒด ์์ฑ ์ฑ ์์ ํ ๋นํ๋ผ.
- B๊ฐ A ๊ฐ์ฒด๋ฅผ ํฌํจํ๊ฑฐ๋ ์ฐธ์กฐํ๋ค
- B๊ฐ A ๊ฐ์ฒด๋ฅผ ๊ธฐ๋กํ๋ค
- B๊ฐ A ๊ฐ์ฒด๋ฅผ ๊ธด๋ฐํ๊ฒ ์ฌ์ฉํ๋ค
- B๊ฐ A ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๋๋ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.(์ด ๊ฒฝ์ฐ B๋ A์ ๋ํ ์ ๋ณด ์ ๋ฌธ๊ฐ๋ค)
์ฐ๊ด์ ํ์๋ก ํ๋ ๊ฐ์ฒด์ ์์ฑ ์ฑ
์์ ๋งก๊ธด๋ค. ํ์๋ก ํ๋ค๋ฉด ์ด๋ป๊ฒ๋ ๊ฒฐํฉํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฏธ ๊ฒฐํฉ๋์ด์๋ ๊ฐ์ฒด๊ฐ ์์ฑํ๋ ๊ฒ์ ๊ฒฐํฉ๋๊ฐ ๋ณํ์ง ์๋๋ค.

Screening์ Reservation์ ์์ฑํ๋๋ฐ ํ์ํ ๊ฐ์ฅ ๋ง์ ์ ๋ณด๋ฅผ ์๊ณ ์๋ค. (์ ๋ณด ์ ๋ฌธ๊ฐ)
๊ฐ์ฅ ํฐ ๋ฌธ์ ์ ์ ๋ณ๊ฒฝ์ ์ทจ์ฝํ ํด๋์ค๋ฅผ ํฌํจํ๊ณ ์๋ค๋ ๊ฒ์ด๋ค. ๋ณ๊ฒฝ์ ์ทจ์ฝํ ํด๋์ค๋ ์ฝ๋๋ฅผ ์์ ํด์ผ ํ๋ ์ด์ ๋ฅผ ํ๋ ์ด์ ๊ฐ์ง๋ ํด๋์ค์ด๋ค.
public class DiscountCondition {
private DiscountConditionType type;
private int sequence;
private DayOfWeek dayOfWeek;
private LocalTime startTime;
private LocalTime endTime;
public boolean isSatisfiedBy(Screening screening) {
if (type == DiscountConditionType.PERIOD) {
return isSatisfiedByPeriod(screening);
}
return isSatisfiedBySequence(screening);
}
private boolean isSatisfiedByPeriod(Screening screening) {
return dayOfWeek.equals(screening.getWhenScreened().getDayOfWeek()) &&
startTime.compareTo(screening.getWhenScreened().toLocalTime()) <= 0 &&
endTime.compareTo(screening.getWhenScreened().toLocalTime()) <= 0;
}
private boolean isSatisfiedBySequence(Screening screening) {
return sequence == screening.getSequence();
}
}
DiscountCondition์ ๋ค์๊ณผ ๊ฐ์ด ์๋ก ๋ค๋ฅธ ์ธ ๊ฐ์ง ์ด์ ๋ก ๋ณ๊ฒฝ๋ ์ ์๋ค.
์๋ฒ ์กฐ๊ฑด ํ๋จ ๋ก์ง ๋ณ๊ฒฝ
isSatisfiedBySequence ๋ด๋ถ ๊ตฌํ ์์
DiscountCondition์ sequence ์์ฑ ๋ณ๊ฒฝ
๊ธฐ๊ฐ ์กฐ๊ฑด ํ๋จ ๋ก์ง ๋ณ๊ฒฝ
์ฆ, DiscountCondition ํด๋์ค๋ ํ๋ ์ด์์ ๋ณ๊ฒฝ ์ด์ ๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ์์ง๋๊ฐ ๋ฎ๋ค.
๋ณ๊ฒฝ์ ์ด์ ์ ๋ฐ๋ผ ํด๋์ค๋ฅผ ๋ถ๋ฆฌํด์ผ ํ๋ค.ย
์๋ก ๋ค๋ฅธ ์์ , ์๋ก ๋ค๋ฅธ ์ด์ ๋ก ๋ณ๊ฒฝ๋๋ ์ฝ๋๋ค์ ๋ถ๋ฆฌํ๋ค.
์ธ์คํด์ค ๋ณ์๊ฐ ์ด๊ธฐํ๋๋ ์์ .
์์ ์ฌ๋ก์์๋ sequence, dayOfWeek, startTime, endTime
-> ํจ๊ป ์ด๊ธฐํ๋๋ ์์ฑ์ ๊ธฐ์ค์ผ๋ก ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ๋ค.
๋ฉ์๋๋ค์ด ์ธ์คํด์ค ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์

DiscountCondition์ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ ์๋ฒ ์กฐ๊ฑด๊ณผ ๊ธฐ๊ฐ ์กฐ๊ฑด์ด๋ผ๋ ๋๊ฐ์ ๋
๋ฆฝ์ ์ธ ํ์
์ด ํ๋์ ํด๋์ค ์์ ๊ณต์กดํ๊ณ ์๋ค๋ ์ ์ด๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ ํ์
์ SequenceCondition, PeriodCondition ๋ ๊ฐ์ ํด๋์ค๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค.
๋ชจ๋ ๋ฉ์๋๊ฐ ๋์ผํ ์ธ์คํด์ค ๋ณ์ ๊ทธ๋ฃน์ ์ฌ์ฉํ๋๋ก ํ์ฌ ์์ง๋๋ฅผ ๋์ธ๋ค.

์ด์ Movie๋ ๋ ํด๋์ค์ ํ๋ ฅํ๋ค.
๊ทธ๋ฌ๋ ์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์
์ ๋ฌธ์ ์ ์ ๊ฐ์ง๊ณ ์๋ค.
Movie ์
์ฅ์์ ๋์ ํ ์ธ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ๋์ผํ ์ฑ
์์ ์ํํ ๋ฟ์ด๋ค.
์ฆ, ๋์ผ ์ฑ
์์ ์ํํ๋ ๋์ผํ ์ญํ ์ ํ๋ค.

๊ฐ์ฒด์ ํ์
์ ๋ฐ๋ผ ๋ณํ๋ ํ๋์ด ์๋ค๋ฉด (if) ํ์
์ ๋ถ๋ฆฌํ๊ณ ๋ณํํ๋ ํ๋์ ๊ฐ ํ์
์ ์ฑ
์์ผ๋ก ํ ๋นํ๋ฉด ๋๋ค.

๊ฐ์ฒด์ ์์์ ์ธ ํ์
์ ๋ฐ๋ผ ํ๋์ ๋ถ๊ธฐํด์ผ ํ๋ค๋ฉด ์์์ ์ธ ํ์
์ ๋ช
์์ ํด๋์ค๋ก ์ ์ํ๊ณ ํ๋์ ๋๋์ผ๋ก์จ ์์ง๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๋ค์ ๋งํด ๊ฐ์ฒด์ ํ์
์ ๋ฐ๋ผ ๋ณํ๋ ํ๋์ด ์๋ค๋ฉด ํ์
์ ๋ถ๋ฆฌํ๊ณ ๋ณํํ๋ ํ๋์ ๊ฐ ํ์
์ ์ฑ
์์ผ๋ก ํ ๋นํ๋ผ๋ ๊ฒ์ด๋ค. GSASP์์๋ ์ด๋ฅผ POLYMORPHISM(๋คํ์ฑ) ํจํด์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
POLYMORPHISM ํจํด : ํ์ ๋ณ ๋ถ๋ฆฌ
๊ฐ์ฒด์ ํ์ ์ ๋ฐ๋ผ ๋ณํ๋ ๋ก์ง์ด ์์ ๋, ๋ณํ๋ ๋ก์ง์ ๋ด๋นํ ์ฑ ์์ ์ด๋ป๊ฒ ํ ๋นํด์ผ ํ๋๊ฐ?
ํ์ ์ ๋ช ์์ ์ผ๋ก ์ ์ํ๊ณ ๊ฐ ํ์ ์ ๋คํ์ ์ผ๋ก ํ๋ํ๋ ์ฑ ์์ ํ ๋นํ๋ผ.
if~else ๋๋ switch-case๋ฑ์ ์กฐ๊ฑด ๋ ผ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ์ค๊ณํ๋ค๋ฉด ์๋ก์ด ๋ณํ๊ฐ ์ผ์ด๋ ๊ฒฝ์ฐ ์กฐ๊ฑด ๋ ผ๋ฆฌ๋ฅผ ์์ ํด์ผ ํ๋ค.
์ด๊ฒ์ ํ๋ก๊ทธ๋จ์ ์์ ํ๊ธฐ ์ด๋ ต๊ณ ๋ณ๊ฒฝ์ ์ทจ์ฝํ๊ฒ ๋ง๋ ๋ค.
๊ฐ์ฒด์ ํ์ ์ ๊ฒ์ฌํด์ ํ์ ์ ๋ฐ๋ผ ์ฌ๋ฌ ๋์๋ค์ ์ํํ๋ ์กฐ๊ฑด์ ์ธ ๋ ผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง๋ง๋ผ.
Movie ๋ํ DiscountDondition๊ณผ ๋์ผํ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๊ธ์ก ํ ์ธ ์ ์ฑ ๊ณผ ๋น์จ ํ ์ธ ์ ์ฑ ์ด๋ผ๋ ๋ ๊ฐ์ง ํ์ ์ ํ๋์ ํด๋์ค ์์ ๊ตฌํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ํ๋ ์ด์์ ์ด์ ๋ก ๋ณ๊ฒฝ๋ ์ ์๋ค. ํ๋ง๋๋ก ๋งํด์ ์์ง๋๊ฐ ๋ฎ์ ๊ฒ์ด๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ ์ญ์ DiscountCondition๊ณผ ๋์ผํ๋ค. ์ญํ ์ ๊ฐ๋
์ ๋์
ํด์ ํ๋ ฅ์ ๋คํ์ ์ผ๋ก ๋ง๋ค๋ฉด ๋๋ค.
POLYMORPHISM ํจํด์ ์ฌ์ฉํด ์๋ก ๋ค๋ฅธ ํ๋์ ํ์
๋ณ๋ก ๋ถ๋ฆฌํ๋ฉด ๋คํ์ฑ์ ํํ์ ๋๋ฆด ์ ์๋ค.
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 calculateMovieFee(Screening screening) {
if (isDiscountable(screening)) {
return fee.minus(calculateDiscountAmount());
}
return fee;
}
private boolean isDiscountable(Screening screening) {
return discountConditions.stream()
.anyMatch(condition -> condition.isSatisfiedBy(screening));
}
private Money calculateDiscountAmount() {
switch(movieType) {
case AMOUNT_DISCOUNT:
return calculateAmountDiscountAmount();
case PERCENT_DISCOUNT:
return calculatePercentDiscountAmount();
case NONE_DISCOUNT:
return calculateNoneDiscountAmount();
}
throw new IllegalStateException();
}
private Money calculateAmountDiscountAmount() {
return discountAmount;
}
private Money calculatePercentDiscountAmount() {
return fee.times(discountPercent);
}
private Money calculateNoneDiscountAmount() {
return Money.ZERO;
}
}
calculateDiscountAmoutํจ์๋ฅผ ๋ณด๋ switch๊ฐ ๋ณด์ธ๋ค.
์ด๋ ๋๊ฐ์ง ํ ์ธ ์ ์ฑ
์ ํ๋์ ํด๋์ค ์์์ ๊ตฌํํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
POLYMOPHISM ํจํด์ผ๋ก ํ์
์ ๋ถ๋ฆฌํ๋ค.
PROTECTED VARIATIONS ํจํด์ ์ด์ฉํด Movie๋ด์ ์์ฑ๋ค์ ๋ถ๋ฆฌํ๋ค.

๋ชจ๋ ํด๋์ค์ ๋ด๋ถ ๊ตฌํ์ ์บก์ํ๋ผ ์๊ณ ๋ชจ๋ ํด๋์ค๋ ๋ณ๊ฒฝ์ ์ด์ ๋ฅผ ์ค์ง ํ๋์ฉ๋ง ๊ฐ์ง๋ค. ๊ฐ ํด๋์ค๋ ์์ง๋๊ฐ ๋๊ณ ๋ค๋ฅธ ํด๋์ค์ ์ต๋ํ ๋์จํ๊ฒ ๊ฒฐํฉ๋ผ ์๋ค. ํด๋์ค๋ ์๊ณ ์ค์ง ํ ๊ฐ์ง ์ผ๋ง ์ํํ๋ค. ์ฑ
์์ ์ ์ ํ๊ฒ ๋ถ๋ฆฌ๋ผ ์๋ค. ์ด๊ฒ์ด ์ฑ
์์ ์ค์ฌ์ผ๋ก ํ๋ ฅ์ ์ค๊ณํ ๋ ์ป์ ์ ์๋ ํํ์ด๋ค.
๊ฒฐ๋ก ์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ฑ ์์ ์ค์ฌ์ผ๋ก ์ค๊ณํ๋ผ๋ ๊ฒ์ด๋ค. ๊ฐ์ฒด์๊ฒ ์ค์ํ ๊ฒ์ ์ํ๊ฐ ์๋๋ผ ํ๋์ด๋ค. ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ๊ธฐ๋ณธ์ ์ฑ ์๊ณผ ํ๋ ฅ์ ์ด์ ์ ๋ง์ถ๋ ๊ฒ์ด๋ค.
๊ฐ๋ฐ์๊ฐ ๋ณ๊ฒฝ์ ๋๋นํ๋ ๋ฐฉ๋ฒ
๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ์ ์๊ฐ ๋ ์ข์ ๋ฐฉ๋ฒ์ด์ง๋ง ์ ์ฌํ ๋ณ๊ฒฝ์ด ๋ฐ๋ณต์ ์ผ๋ก ๋ฐ์ํ๊ณ ์๋ค๋ฉด ๋ณต์ก์ฑ์ด ์์นํ๋๋ผ๋ ์ ์ฐ์ฑ์ ์ถ๊ฐํ๋ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ด ๋ ์ข๋ค.

์ ์ฐ์ฑ์ ์์กด์ฑ ๊ด๋ฆฌ์ ๋ฌธ์ ๋ค.
์์๋ค ์ฌ์ด์ ์์กด์ฑ์ ์ ๋๊ฐ ์ ์ฐ์ฑ์ ์ ๋๋ฅผ ๊ฒฐ์ ํ๋ค.
์ ์ฐ์ฑ์ ์ ๋์ ๋ฐ๋ผ ๊ฒฐํฉ๋๋ฅผ ์กฐ์ ํ ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ฒด์งํฅ ๊ฐ๋ฐ์๊ฐ ๊ฐ์ถฐ์ผ ํ๋ ์ค์ํ ๊ธฐ์ ์ค ํ๋๋ค.

์์ง๋
๊ฒฐํฉ๋ : ์ต๋ํ ์ ์ ๊ฐ์ฒด๋ค๊ณผ ํ๋ ฅํ๋ฉด ์ข๋ค.
์บก์ํ : ๋ด๊ฐ ๊ฐ๊ณ ์๋ ํ๋๋ฅผ ์๊ณผ ๋ฐ์์ ์จ๊ฒจ๋ผ. (ํ๋ผ๋ฏธํฐ, getter, setter)
์ถ์ฒ
์ค๋ธ์ ํธ - ์ฝ๋๋ก ์ดํดํ๋ ๊ฐ์ฒด์งํฅ ์ค๊ณ
https://github.com/eternity-oop/object