๐ Chapter 6: ๋ฉ์์ง์ ์ธํฐํ์ด์ค
- ํ๋ฅญํ ๊ฐ์ฒด์งํฅ ์ฝ๋๋ฅผ ์ป๊ธฐ ์ํด์๋ ํด๋์ค๊ฐ ์๋๋ผ ๊ฐ์ฒด๋ฅผ ์งํฅํด์ผ ํ๋ค. ์ข ๋ ์ ํํ๊ฒ ๋งํด์ ํ๋ ฅ ์์์ ๊ฐ์ฒด๊ฐ ์ํํ๋ ์ฑ ์์ ์ด์ ์ ๋ง์ถฐ์ผ ํ๋ค. ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ ์ฑ ์์ด ๊ฐ์ฒด๊ฐ ์์ ํ ์ ์๋ ๋ฉ์์ง์ ๊ธฐ๋ฐ์ด ๋๋ค๋ ๊ฒ์ด๋ค.
๐ ํ๋ ฅ๊ณผ ๋ฉ์์งโ
๐ ํด๋ผ์ด์ธํธ-์๋ฒ ๋ชจ๋ธโ
- ํ๋ ฅ์ ์ด๋ค ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ๋ฌด์ธ๊ฐ๋ฅผ ์์ฒญํ ๋ ์์๋๋๋ฐ ๋ฉ์์ง๋ ๊ฐ์ฒด ์ฌ์ด์ ํ๋ ฅ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋งค๊ฐ์ฒด๋ค.
- ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ์ ๊ทผํ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋ฉ์์ง๋ฅผ ์ ์กํ๋ ๊ฒ๋ฟ์ด๋ค.
- ๋ ๊ฐ์ฒด ์ฌ์ด์ ํ๋ ฅ ๊ด๊ณ๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ ํต์ ์ธ ๋ฉํํฌ๋ ํด๋ผ์ด์ธํธ-์๋ฒ ๋ชจ๋ธ์ด๋ค. (๋ฉ์์ง๋ฅผ ์ ์กํ๋ ๊ฐ์ฒด๋ ํด๋ผ์ด์ธํธ, ๋ฉ์์ง๋ฅผ ์์ ํ๋ ๊ฐ์ฒด๋ ์๋ฒ / ๋จ๋ฐฉํฅ ์ํธ์์ฉ)
- ํ๋ ฅ์ ๊ด์ ์์ ๊ฐ์ฒด๋ ๋ ๊ฐ์ง ์ข ๋ฅ์ ๋ฉ์์ง ์งํฉ์ผ๋ก ๊ตฌ์ฑ๋๋๋ฐ ํ๋๋ ๊ฐ์ฒด๊ฐ ์์ ํ๋ ๋ฉ์์ง์ ์งํฉ์ด๊ณ ๋ค๋ฅธ ํ๋๋ ์ธ๋ถ์ ๊ฐ์ฒด์๊ฒ ์ ์กํ๋ ๋ฉ์์ง์ ์งํฉ์ด๋ค.
- ๊ฐ์ฒด๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์ํํ ์ ์๋ ๊ฒ๋ณด๋ค ๋ ํฐ ์ฑ ์์ ์ํํ๊ธฐ ์ํด์๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ํ๋ ฅํด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๊ฐ์ฒด ์ฌ์ด์ ํ๋ ฅ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ๋งค๊ฒ์ฒด๊ฐ ๋ฐ๋ก ๋ฉ์์ง์ด๋ค.
๐ ๋ฉ์์ง์ ๋ฉ์์ง ์ ์กโ
- ๋ฉ์์ง๋ ๊ฐ์ฒด๋ค์ด ํ๋ ฅํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ ์ ์ผํ ์์ฌ์ํต ์๋จ์ด๋ค.
- ๋ฉ์์ง ์ ์ก(๋ฉ์์ง ํจ์ฑ)์ ํ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ๋์์ ์์ฒญํ๋ ๊ฒ์ด๋ค.
- ๋ฉ์์ง ์ ์ก์๋ ๋ฉ์์ง๋ฅผ ์ ์กํ๋ ๊ฐ์ฒด์ด๋ค. (ํด๋ผ์ด์ธํธ)
- ๋ฉ์์ง ์์ ์๋ ๋ฉ์์ง๋ฅผ ์์ ํ๋ ๊ฐ์ฒด์ด๋ค. (์๋ฒ)
- ๋ฉ์์ง๋ ์คํผ๋ ์ด์ ๋ช ๊ณผ ์ธ์๋ก ๊ตฌ์ฑ๋๋ฉฐ ๋ฉ์์ง ์ ์ก์ ์ฌ๊ธฐ์ ๋ฉ์์ง ์์ ์๋ฅผ ์ถ๊ฐํ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๋ฉ์์ง ์ ์ก์ ๋ฉ์์ง ์์ ์, ์คํผ๋ ์ด์ ๋ช , ์ธ์์ ์กฐํฉ์ด๋ค.
- ์๋๋ ์๋ฐ์ ์์์ด๋ค.
//์์ ์.์คํผ๋ ์ด์
๋ช
(์ธ์)
condition.isSatisfiedBy(screening);
๐ ๋ฉ์์ง์ ๋ฉ์๋โ
- ๋ฉ์์ง๋ฅผ ์์ ํ์ ๋ ์ค์ ๋ก ์คํ๋๋ ํจ์ ๋๋ ํ๋ก์์ ๋ฅผ ๋ฉ์๋๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์ฝ๋ ์์์ ๋์ผํ ์ด๋ฆ์ ๋ณ์์๊ฒ ๋์ผํ ๋ฉ์์ง๋ฅผ ์ ์กํ๋๋ผ๋ ๊ฐ์ฒด์ ํ์ ์ ๋ฐ๋ผ ์ค์ ์คํ๋๋ ๋ฉ์๋๊ฐ ๋ฌ๋ผ์ง ์ ์๋ค.
- ๊ฐ์ฒด๋ ๋ฉ์์ง์ ๋ฉ์๋๋ผ๋ ๋ ๊ฐ์ง ์๋ก ๋ค๋ฅธ ๊ฐ๋ ์ ์คํ ์์ ์ ์ฐ๊ฒฐํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ์์ ๊ณผ ์คํ ์์ ์ ์๋ฏธ๊ฐ ๋ฌ๋ผ์ง ์ ์๋ค. ๋ฉ์์ง์ ๋ฉ์๋์ ๊ตฌ๋ถ์ ๋ฉ์์ง ์ ์ก์์ ์์ ์๊ฐ ๋์จํ๊ฒ ๊ฒฐํฉ๋ ์ ์๊ฒ ํ๋ค.
- ๋ฉ์์ง ์ ์ก์๋ ์์ ์ด ์ด๋ค ๋ฉ์์ง๋ฅผ ์ ์กํด์ผ ํ๋์ง๋ง ์๋ฉด ๋๋ค. ์์ ์๋ ์ด๋ค ํด๋์ค์ ์ธ์คํด์ค์ธ์ง, ์ด๋ค ๋ฐฉ์์ผ๋ก ์์ฒญ์ ์ฒ๋ฆฌํ๋์ง ๋ชจ๋ฅด๋๋ผ๋ ์ํํ ํ๋ ฅ์ด ๊ฐ๋ฅํ๋ค. ๋ฉ์์ง ์์ ์ ์ญ์ ๋๊ฐ ๋ฉ์์ง๋ฅผ ์ ์กํ๋์ง ์ ํ์๊ฐ ์๋ค. ๋จ์ง ๋ฉ์์ง๊ฐ ๋์ฐฉํ๋ค๋ ์ฌ์ค๋ง ์๋ฉด ๋๋ค.
๐ ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค์ ์คํผ๋ ์ด์ โ
- ์ธ๋ถ์ ๊ฐ์ฒด๋ ์ค์ง ๊ฐ์ฒด๊ฐ ๊ณต๊ฐํ๋ ๋ฉ์์ง๋ฅผ ํตํด์๋ง ๊ฐ์ฒด์ ์ํธ์์ฉํ ์ ์๋ค. ์ด์ฒ๋ผ ๊ฐ์ฒด๊ฐ ์์ฌ์ํต์ ์ํด ์ธ๋ถ์ ๊ณต๊ฐํ๋ ๋ฉ์์ง์ ์งํฉ์ ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๊ด์ ์์ ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค์ ํฌํจ๋ ๋ฉ์์ง๋ฅผ ์คํผ๋ ์ด์
์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์คํผ๋ ์ด์
์ ์ํ ๊ฐ๋ฅํ ์ด๋ค ํ๋์ ๋ํ ์ถ์ํ๋ค. (
DiscountCondition
์ธํฐํ์ด์ค์ ์ ์๋isSatisfiedBy
๊ฐ ์คํผ๋ ์ด์ ์ ํด๋นํ๋ค.) - ๊ทธ์ ๋นํด ๋ฉ์์ง๋ฅผ ์์ ํ์ ๋ ์ค์ ๋ก ์คํ๋๋ ์ฝ๋๋ ๋ฉ์๋๋ผ๊ณ ๋ถ๋ฅธ๋ค. (
SequenceCondition
,PeriodCondition
์ ์ ์๋ ๊ฐ๊ฐ์isSatisfiedBy
๋ ์ค์ ๊ตฌํ์ ํฌํจํ๊ธฐ ๋๋ฌธ์ ๋ฉ์๋๋ผ๊ณ ๋ถ๋ฅธ๋ค.)
๐ ์๊ทธ๋์ฒโ
- ์คํผ๋ ์ด์ (๋๋ ๋ฉ์๋)์ ์ด๋ฆ๊ณผ ํ๋ผ๋ฏธํฐ์ ๋ชฉ๋ก์ ํฉ์ณ ์๊ทธ๋์ฒ(signature)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์คํผ๋ ์ด์ ์ ์คํ ์ฝ๋ ์์ด ์๊ทธ๋์ฒ๋ง ์ ์ํ ๊ฒ์ด๋ค. ๋ฉ์๋๋ ์ด ์๊ทธ๋์ฒ์ ๊ตฌํ์ ๋ํ ๊ฒ์ด๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์์ง๋ฅผ ์์ ํ๋ฉด ์คํผ๋ ์ด์ ์ ์๊ทธ๋์ฒ์ ๋์ผํ ๋ฉ์๋๊ฐ ์คํ๋๋ค.
- ์คํผ๋ ์ด์ ์ ๊ด์ ์์ ๋คํ์ฑ์ด๋ ๋์ผํ ์คํผ๋ ์ด์ ํธ์ถ์ ๋ํด ์๋ก ๋ค๋ฅธ ๋ฉ์๋๋ค์ด ์คํ๋๋ ๊ฒ์ด๋ผ๊ณ ์ ์ํ ์ ์ ๋ค.
๐ ์ธํฐํ์ด์คํผ ์ค๊ณ ํ์งโ
- ์ข์ ์ธํฐํ์ด์ค๋ ์ต์ํ์ ์ธํฐํ์ด์ค์ ์ถ์์ ์ธ ์ธํฐํ์ด์ค๋ผ๋ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
- ์ต์ํ์ ์ธํฐํ์ด์ค๋ ๊ผญ ํ์ํ ์คํผ๋ ์ด์ ๋ง์ ์ธํฐํ์ด์ค์ ํฌํจํ๋ ๊ฒ์ด๊ณ ์ถ์์ ์ธ ์ธํฐํ์ด์ค๋ ์ด๋ป๊ฒ ์ํํ๋์ง๊ฐ ์๋๋ผ ๋ฌด์์ ํ๋์ง๋ฅผ ํํํ๋ค.
- ์ด๋ ๊ฒ ์ค๊ณํ ์ ์๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ฑ ์ ์ฃผ๋ ์ค๊ณ ๋ฐฉ๋ฒ์ ๋ฐ๋ฅด๋ ๊ฒ์ด๋ค. (๋ฉ์์ง๋ฅผ ๋จผ์ ์ ํํจ์ผ๋ก์จ ๋ฌด๊ดํ ์คํผ๋ ์ด์ ์ด ์ธํฐํ์ด์ค์ ์ค๋ฉฐ๋๋ ๊ฒ์ ๋ฐฉ์ง)
- ๋ฉ์์ง๊ฐ ๊ฐ์ฒด๋ฅผ ์ ํํ๊ฒ ํจ์ผ๋ก์จ ํด๋ผ์ด์ธํธ์ ์๋๋ฅผ ๋ฉ์์ง์ ํํํ ์ ์๊ฒ ํ๋ค.
๐ ๋๋ฏธํฐ ๋ฒ์นโ
- 4์ฅ์ ์ ์ฐจ์ ์ธ ๋ฐฉ์์ ์ํ ์๋งค ์์คํ ์ฝ๋ ์ค ํ ์ธ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๋ ์ฝ๋์ด๋ค.
public class ReservationAgency {
public Reservation reserve(Screening screening, Customer customer, int audienceCount) {
Movie movie = screening.getMovie();
boolean discountable = false;
// DiscountCondition์ ๋ํด ๋ฃจํ๋ฅผ ๋๋ฉด์ ํ ์ธ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธ
for (DiscountCondition condition : movie.getDiscountConditions()) {
if (condition.getType() == DiscountConditionType.PERIOD) {
// ๊ธฐ๊ฐ ์กฐ๊ฑด
} else {
discountable = condition.getSequence() == screening.getSequence();
}
if (discountable) {
break;
}
}
// ...
}
}
- ์ด ์ฝ๋์์ ๊ฐ์ฅ ํฐ ๋จ์ ์
ReservationAgency
์ ์ธ์๋ก ์ ๋ฌ๋Screening
์ฌ์ด์ ๊ฒฐํฉ๋๊ฐ ๋๋ฌด ๋๊ธฐ ๋๋ฌธ์Screening
๋ด๋ถ ๊ตฌํ์ ๋ณ๊ฒฝํ ๋ ๋ง๋คReservationAgency
๋ ํจ๊ป ๋ณ๊ฒฝ๋๋ค๋ ๊ฒ์ด๋ค. - ์ด์ฒ๋ผ ํ๋ ฅํ๋ ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌ์กฐ์ ๋ํ ๊ฒฐํฉ์ผ๋ก ์ธํด ๋ฐ์ํ๋ ์ค๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ์๋ ์์น์ด ๋๋ฏธํฐ ๋ฒ์น(Law of Demeter)์ด๋ค.
- ๋๋ฏธํฐ ๋ฒ์น์ ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌ์กฐ์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋์ง ์๋๋ก ํ๋ ฅ ๊ฒฝ๋ก๋ฅผ ์ ์ํ๋ผ๋ ๊ฒ์ด๋ค. (๋ฏ์ ์์๊ฒ ๋งํ์ง ๋ง๋ผ, ์ค์ง ์ธ์ ํ ์ด์ํ๊ณ ๋ง ๋งํ๋ผ)
- ๋๋ฏธํฐ ๋ฒ์น์ ๋ฐ๋ฅด๊ธฐ ์ํด์๋ ํด๋์ค๊ฐ ํน์ ํ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋์์๊ฒ๋ง ๋ฉ์์ง๋ฅผ ์ ์กํ๋๋ก ํ๋ก๊ทธ๋๋ฐํด์ผ ํ๋ค.
- ๋ชจ๋ ํด๋์ค C์ C์ ๊ตฌํ๋ ๋ชจ๋ ๋ฉ์๋ M์ ๋ํด์, M์ด ๋ฉ์์ง๋ฅผ ์ ์กํ ์ ์๋ ๋ชจ๋ ๊ฐ์ฒด๋ ๋ค์์ ์์ ๋ ํด๋์ค์ ์ธ์คํด์ค์ฌ์ผ ํ๋ค. ์ด๋ M์ ์ํด ์์ฑ๋ ๊ฐ์ฒด๋ M์ด ํธ์ถํ๋ ๋ฉ์๋์ ์ํด ์์ฑ๋ ๊ฐ์ฒด, ์ ์ญ ๋ณ์๋ก ์ ์ธ๋ ๊ฐ์ฒด๋ ๋ชจ๋ M์ ์ธ์๋ก ๊ฐ์ฃผํ๋ค.
- ๋ค์์ 4์ฅ์์ ๊ฒฐํฉ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒจ๋ผ๊ธฐ ์ํด ์์ ํ
ReservationAgency
์ ์ต์ข ์ฝ๋์ด๋ค.
public class ReservationAgency {
public Reservation reserve(Screening screening, Customer customer, int audienceCount) {
Money fee = screening.calculateFee(audienceCount);
return new Reservation(customer, screening, fee, audienceCount);
}
}