๐ค Chapter 5: ๊ตฌ๋ถ๋ฌ์ง๊ฑฐ๋ ๋ถ๋ฌ์ง๊ฑฐ๋
ํ๋์ ๋ฏธ์น ๋ฏ์ด ๋น ๋ฅธ ๋ณํ ์๋๋ฅผ ๋ฐ๋ผ๊ฐ๋ ค๋ฉด ๋ชจ๋ ์๋จ์ ๋์ํ์ฌ ๊ฐ๋ฅํ ํ ๋์จํ๊ณ ์ ์ฐํ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค.
๐ญ Topic 28. ๊ฒฐํฉ๋ ์ค์ด๊ธฐโ
๊ฒฐํฉ๋๊ฐ ๋์ผ๋ฉด ์ด๋ฆฌ์ ๋ฆฌ ์ฐ๊ฒฐ๋์ด ์์ด์ ์ฌ๋ฌ ๊ฐ์ง๋ฅผ ๋์์ ๋ฐ๊ฟ์ผ ํ๋ค. ๊ทธ๋์ ๋ฐ๊พธ๊ธฐ ๋ ์ด๋ ค์์ง๋ค. ์ฌ๋ฌ๋ถ์ ์ด๋ช ์ ๋ ์ค ํ๋๋ค. ๋ฐ๊ฟ์ผ ํ๋ ๊ณณ์ ๋ชจ๋ ์ฐพ์๋ด๋๋ผ ์๊ฐ์ ๋ค์ด๊ฑฐ๋, ์๋๋ฉด "๋ฑ ํ๋๋ง" ๋ฐ๊พธ๊ณ ๊ฒฐํฉ๋ ๋ค๋ฅธ ๊ฒ๋ค์ ์์ ์ฑ ์ ํ๋ก๊ทธ๋จ์ด ์ฃฝ๋์ง ๊ณ ๋ฏผํ๋๋ผ ์๊ฐ์ ๋ค์ด๊ฑฐ๋.
์ํํธ์จ์ด ๊ตฌ์กฐ๋ ์ ์ฐํด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์ฐํ๋ ค๋ฉด ๊ฐ๊ฐ์ ๋ถํ์ด ๋ค๋ฅธ ๋ถํ์ ๊ฐ๋ฅํ ํ ์กฐ๊ธ๋ง ์ฐ๊ฒฐ๋์ด์ผ ํ๋ค.
Tip 44. ๊ฒฐํฉ๋๊ฐ ๋ฎ์ ์ฝ๋๊ฐ ๋ฐ๊พธ๊ธฐ ์ฝ๋ค.
๐ฅ ์ด์ฐจ ์ฌ๊ณ โ
public void applyDiscount(customer, order_id, discount) {
totals = customer
.orders
.find(order_id)
getTotals();
totals.grandTotal = totals.grandTotal - discount;
totals.discount = discount;
}
์ด ์ฝ๋๋ ํฉ๊ณ๊น์ง ๋ค์ฏ ๋จ๊ณ์ ์ถ์ํ๋ฅผ ์ค๊ฐ๋ค. ๊ฒฐ๊ตญ ์ต์์ ์ฝ๋๊ฐ ๋ชจ๋ ๊ฒ์ ์์์ผ ํ๋ค. ์ฝ๋๋ฅผ ์ฐ๊ฑฐ๋ ์ดํดํ๊ธฐ ์ํด ์์์ผ ํ๋ ๊ฒ์ด ๋๋ฌด ๋ง๋ค. ์ค์๊ฐ์์ผ๋ก ์ด ์ฝ๋๋ฅผ ๊ณ์ ์ง์ํ๊ธฐ ์ํด์ ์์ผ๋ก ๋ฐ๊พธ๋ฉด ์ ๋๋ ๊ฒ๋ ๋๋ฌด ๋ง๋ค.
Tip 45. ๋ฌป์ง ๋ง๊ณ ๋งํ๋ผ(Tell, Don't Ask)
์ด ์์น์ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ด๋ถ ์ํ์ ๋ฐ๋ผ ํ๋จ์ ๋ด๋ฆฌ๊ณ ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ฐฑ์ ํด์๋ ์ ๋๋ค๋ ๊ฒ์ด๋ค. ๊ฐ์ฒด์ ๋ด๋ถ ์ํ๋ฅผ ๋ฌป๋ ๊ฒ์ผ๋ก ์ธํ์ฌ ์บก์ํ์ ์ฅ์ ์ ์์ ํ ์ฌ๋ผ์ง๊ณ , ๋ ๊ทธ ๊ณผ์ ์์ ๊ตฌํ์ ๋ํ ์ง์์ด ์ฝ๋ ์ฌ๊ธฐ์ ๊ธฐ๋ก ํผ์ ธ ๋ฒ๋ฆฐ๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ ์ด์ฐจ ์ฌ๊ณ ๋ฅผ ๊ณ ์น๋ ์ฒซ ๋ฐ์ง์ ํ ์ธ ์ฒ๋ฆฌ๋ฅผ totals
๊ฐ์ฒด์ ์์ํ๋ ๊ฒ์ด๋ค.
public void applyDiscount(customer, order_id, discount) {
customer
.orders
.find(order_id)
.getTotals()
.applyDiscount(discount);
}
์ฃผ๋ฌธ ์ปฌ๋ ์ ์ ๊ฐ์ ธ์์ ์ฃผ๋ฌธ์ ์ฐพ์์๋ ์ ๋๋ค. ๊ณ ๊ฐ ๊ฐ์ฒด์์ ๋ฐ๋ก ์ฃผ๋ฌธ ๊ฐ์ฒด๋ฅผ ์ป์ด ์์ผ ํ๋ค.
public void applyDiscount(customer, order_id, discount) {
customer
.findOrder(order_id)
.getTotals()
.applyDiscount(discount);
}
๋ง์ฐฌ๊ฐ์ง ๋ ผ๋ฆฌ๋ฅผ ์ฃผ๋ฌธ ๊ฐ์ฒด์ ํฉ๊ณ์๋ ์ ์ฉํ ์ ์๋ค. ์ฃผ๋ฌธ ๊ฐ์ฒด๋ฅผ ๊ตฌํํ ๋ ํฉ๊ณ๋ฅผ ๋ณ๋์ ๊ฐ์ฒด์ ์ ์ฅํ๋ค๋ ์ฌ์ค์ ์ ์จ ์ธ์ ์ฌ๋๋ค์ด ์์์ผ ํ๊ฒ ๋๊ฐ?
public void applyDiscount(customer, order_id, discount) {
customer
.findOrder(order_id)
.applyDiscount(discount);
}
๋ฐ๋ฉํ ๋ฅด ๋ฒ์น(๋๋ฏธํฐ ๋ฒ์น, Law of Demeter)โ
Tip 46. ๋ฉ์์ค ํธ์ถ์ ์ญ์ง ๋ง๋ผ.
๋ฌด์ธ๊ฐ์ ์ ๊ทผํ ๋ "."์ ๋ฑ ํ๋๋ง ์ฐ๋ ค๊ณ ๋ ธ๋ ฅํด ๋ณด๋ผ. "๋ฌด์ธ๊ฐ์ ์ ๊ทผ"ํ๋ค๋ ๊ฑด ์ค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊น์ง ํฌํจํด์ผ ํ๋ค.
# ์ข์ง ์์ ๋ฐฉ์์ด๋ค.
amount = customer.orders.last().totals().amount;
# ๋ง์ฐฌ๊ฐ์ง๋ก ์ข์ง ์๋ค.
orders = customer.orders;
last = orders.last();
totals = last.totals();
amount = totals.amount;
์ ํ๋ ๊ท์น์๋ ํฐ ์์ธ๊ฐ ํ๋ ์๋ค. ์ฎ๋ ๊ฒ๋ค์ด ์ ๋๋ก ๋ฐ๋์ง ์์ ๊ฒ ๊ฐ๋ค๋ฉด ์ด ๊ท์น์ ์งํค์ง ์์๋ ๋๋ค. ์ธ์ด์ ๊ธฐ๋ณธ์ผ๋ก ํฌํจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ง ๊ฝค ์์ ์ ์ผ ๊ฒ์ด๊ณ , ๋ค์๊ณผ ๊ฐ์ด ์จ๋ ๋ ๊ฒ์ด๋ค.
people
.sort_by { |person| person.age }
.first(10)
.map {| person | person.name }
์ฐ์์ ํ์ดํ๋ผ์ธโ
ํ์ดํ๋ผ์ธ์ ํจ์์์ ํจ์๋ก ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ ๊ฐ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ค. ์ด๋ฐ ํ์ดํ๋ผ์ธ์ ๋ฉ์๋ ํธ์ถ๋ก ์ด๋ฃจ์ด์ง ์ด์ฐจ ์ฌ๊ณ ์๋ ๋ค๋ฅด๋ค. ์จ๊ฒจ์ง ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ์์กดํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ ๋ค๊ณ ํ์ดํ๋ผ์ธ์ด ๊ฒฐํฉ์ ํ๋๋ ๋ง๋ค์ง ์๋ ๊ฒ์ ์๋๋ค. ํ์ดํ๋ผ์ธ์ ํจ์์์ ๋ฐํํ๋ ๋ฐ์ดํฐ๋ ๋ฐ๋์ ๋ค์ ํจ์๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ํ์์ด์ด์ผ ํ๋ค.
๐ฅ ๊ธ๋ก๋ฒํ์ ํด์ โ
์ด๋์๋ ์ ๊ทผํ ์ ์๋ ๋ฐ์ดํฐ๋ ๊ต๋ฌํ๊ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ปดํฌ๋ํธ ๊ฐ์ ๊ฒฐํฉ์ ๋ง๋ค์ด ๋ธ๋ค. ์ ์ญ ๋ฐ์ดํฐ ํ๋ํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ๋ฉ์๋์ ๊ฐ์๊ธฐ ๋งค๊ฐ ๋ณ์๊ฐ ์ถ๊ฐ๋ ๊ฒ๊ณผ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ธ๋ค. ์ ์ญ ๋ฐ์ดํฐ๋ ๋ชจ๋ ๋ฉ์๋ ์์์ ์ฌ์ฉํ ์ ์์ผ๋ ๋ง์ด๋ค.
์ ์ญ ๋ฐ์ดํฐ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๋์ ๊ฒฐํฉ๋๋ฅผ ๋์ธ๋ค. ์ ์ญ ๋ฐ์ดํฐ์ ๊ตฌํ์ ๋ณ๊ฒฝํ ๋ ์์คํ ์ฝ๋ ์ ์ฒด์ ์ํฅ์ ์ค ์ ์์์ ๋ถ๋ช ํ๋ค.
์ ์ญ ๋ฐ์ด ํฐ๋ ์ฝ๋๋ฅผ ๋ผ์ด ๋ด๋ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๋ฅผ ๋ง๋ ๋ค. ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ํด์ผ ํ๋ค๋ ์๊ฐ์ด ์ฝ๋ฉ ์ต๊ด์ด ์ผ๋ถ๊ฐ ๋์ด์ผ ํ๋ค. ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ค๋ฉด ๊นจ๋ํ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ณ ๋๋จธ์ง ์ฝ๋์์ ๊ฒฐํฉ์ ์์ ์ผ ํ๋ค. ๊ทธ๋์ผ ๋๋จธ์ง ๊ฒ๋ค์ด ์ฐ๋ฅด๋ฅด ๋ธ๋ ค ๋ค์ด์ค๋ ์ผ ์์ด ๋ฉ์๋๋ ๋ชจ๋์ ๋ฝ์๋ผ ์ ์๋ค.
์ ์ญ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ์ฝ๋์ ๋จ์ ํ ์คํธ๋ฅผ ๋ง๋ค๋ค ๋ณด๋ฉด ์ด๋ฐ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๊ฒ ๋๋ค. ๊ทธ์ ํ ์คํธ๋ฅผ ์คํํ๋ ค๋ ๊ฒ๋ฟ์ธ๋ฐ ์ ์ญ ํ๊ฒฝ์ ์์ฑํ๋ ์ฝ๋๋ฅผ ํ์ฐธ์ด๋ ์จ์ผ ํ๋ค.
์ฑ๊ธํด(singleton)๋ ์ ์ญ ๋ฐ์ดํฐ๋คโ
์์์ ์ฐ๋ฆฌ๋ ์ผ๋ถ๋ฌ ์ ์ญ ๋ณ์๊ฐ ์๋๋ผ ์ ์ญ ๋ฐ์ดํฐ๋ผ๊ณ ๊ณ์ ๋งํ๋ค. ๊ฐ๋์ฉ "์ด๊ฒ ๋ณด์ธ์. ์ ์ญ ๋ณ์๋ ์์ด์. ๋ชจ๋ ์ธ์คํด์ค ๋ฐ์ดํฐ๋ก ์ฑ๊ธํด์ด๋ ์ ์ญ ๋ชจ๋ ์์ ๋ฃ์์ด์."๋ผ๊ณ ๋งํ๋ ์ฌ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฌ๋ฌ๋ถ์ ์ฝ๋์ ์๋ ๊ฒ์ด ์ฑ๊ธํด๋ฟ์ด๋๋ผ๋, ์ธ๋ถ๋ก ๋ ธ์ถ๋ ์ธ์คํด์ค ๋ณ์๊ฐ ์๋ฉ ์๋ ์ฑ๊ธํด์ ์ฌ์ ํ ์ ์ญ ๋ฐ์ดํฐ๋ค. ๊ทธ์ ์ด๋ฆ์ด ์ข ๊ธธ์ด์ก์ ๋ฟ์ด๋ค.
์ธ๋ถ ๋ฆฌ์์ค๋ ์ ์ญ ๋ฐ์ดํฐ๋คโ
์์ ๊ฐ๋ฅํ ์ธ๋ถ ๋ฆฌ์์ค๋ ๋ชจ๋ ์ ์ญ ๋ฐ์ดํฐ๋ค. ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ ์ฅ์, ํ์ผ ์์คํ , ์๋น์ค API ๋ฑ์ ์ฌ์ฉํ๋ค๋ฉด ์ ์ญ ๋ฐ์ดํฐ์ ํจ์ ์ ๋น ์ง ์ํ์ด ์๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์๋ ํด๋ฒ์ ๋ฐ๋์ ์ด ๋ฆฌ์์ค๋ค์ ์ฌ๋ฌ๋ถ์ด ์์ฑํ๋ ์ฝ๋๋ก ๋ชจ๋ ๊ฐ์ธ๋ ๊ฒ์ด๋ค.
Tip 48. ์ ์ญ์ ์ด์ด์ผ ํ ๋งํผ ์ค์ํ๋ค๋ฉด API๋ก ๊ฐ์ธ๋ผ.
๐ฅ ์์์ ๊ฒฐํฉ์ ๋๋ฆฐ๋คโ
์์์ผ๋ก ๋ค๋ฅธ ํด๋์ค์ ์ํ์ ํ๋์ ๊ทธ๋๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค. ์์์ ์๋ชป ์ฌ์ฉํ๋ ๋ฌธ์ ๋ ๋๋ฌด ์ค์ํด์ ๋ณ๋๋ก ํญ๋ชฉ์ ๋ง๋ค์๋ค. (ํญ๋ชฉ 31. ์์์ธ ์ฐธ๊ณ )
๐ฅ ๊ฒฐ๊ตญ์ ๋ชจ๋ ETCโ
๊ฒฐํฉ๋ ์ฝ๋๋ ๋ฐ๊พธ๊ธฐ ํ๋ค๋ค. ์ฝ๋์ ํ ๊ณณ์ ๋ฐ๊พธ๋ฉด ๋ค๋ฅธ ๊ณณ์ ์ฌํ๊ฐ ๋ฏธ์น ์ ์๋ค. ๊ฐ๋์ ์ฐพ๊ธฐ ํ๋ ๊ณณ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ ๋ฐ๋์ ํ ๋ฌ ํ์๋ ์๋น์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด์ ๋ฌธ์ ์ ์ค์์ด ๋๋ฌ๋๊ธฐ๋ ํ๋ค.
์ง์ ์ ์ผ๋ก ์๋ ๊ฒ๋ง ๋ค๋ฃจ๋ ๋ถ๋๋ผ์์ด ์ฝ๋๋ฅผ ๊ณ์ ์ ์งํ๋ผ. ๊ทธ๋ฌ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ๊ฒ ์ ์งํ ์ ์์ ๊ฒ์ด๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฝ๋๋ฅผ ๋ฐ๊พธ๊ธฐ ์ฌ์์ง ๊ฒ์ด๋ค.