Skip to content

The Law of Demeter(Don't Talk to Strangers)

Jinsu Park edited this page Dec 31, 2020 · 1 revision

Demeter์˜ ๋ฒ•์น™

๋ณธ ๋‚ด์šฉ์€ ์ดํ•ด๋ฅผ ์œ„ํ•ด ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•œ ๋‚ด์šฉ์œผ๋กœ

์›๋ž˜ ๋‚ด์šฉ๊ณผ ํ‹€๋ฆฐ์ ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‹€๋ฆฐ์ ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ๋‹ด๋‹น์ž์—๊ฒŒ ๋ฌธ์˜๋‚จ๊ฒจ์ฃผ์„ธ์š”.

Demeter์˜ ๋ฒ•์น™?

๋””๋ฏธํ„ฐ ํ˜น์€ ๋””๋ฉ”ํ…Œ๋ฅด๋ผ ๋ถˆ๋ฆฌ๋Š” ์ด ๋ฒ•์น™์ด๋ž€.

๊ฐ์ฒด ์ง€ํ–ฅ ๋””์ž์ธ ์›์น™์ค‘ ํ•˜๋‚˜๋กœ "์ตœ์†Œ ์ง€์‹ ์›์น™"

๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์€ ์„ค๊ณ„๋ฅผ ์œ„ํ•œ ์›์น™์ด๋‹ค.

๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์œผ๋ฉด ํ•˜๋‚˜๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ํ•ด๋‹น ์‚ฌํ•ญ๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“ ๊ณณ์—์„œ ์ˆ˜์ •์ด ์ผ์–ด๋‚˜์•ผํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์œผ๋ฉด ์ด๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ค‘ ๋””๋ฏธํ„ฐ์˜ ๋ฒ•์น™์€ ๋ฉ”์†Œ๋“œ ๋‚ด์˜ ๋‹ค๋ฅธ ๊ฐ์ฒด/API ๋“ฑ์˜ ํ˜ธ์ถœ์— ๊ด€๋ จ๋œ ์›์น™์„ ๋งํ•œ๋‹ค.

์ •์˜

๋””๋ฏธํ„ฐ ๋ฒ•์น™์€ "ํด๋ž˜์Šค C์˜ ๋ฉ”์„œ๋“œ f๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋งŒ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค"๊ณ  ์ฃผ์žฅํ•œ๋‹ค.

  • ํด๋ž˜์Šค C
  • f๊ฐ€ ์ƒ์„ฑํ•œ ๊ฐ์ฒด
  • f ์ธ์ˆ˜๋กœ ๋„˜์–ด์˜จ ๊ฐ์ฒด
  • C ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ์ฒด

์‰ฝ๊ฒŒ ๋งํ•ด์„œ A๊ฐ€ B๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  B๊ฐ€ C๋ฅผ ์‚ฌ์šฉํ• ๋•Œ A๊ฐ€ C๋ฅผ ์•Œํ•„์š”๊ฐ€ ์—†๋‹ค.


๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

ํ•œ ๋ชจ๋“ˆ์ด ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์•Œ์•„์•ผํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋“ค์„ ์ตœ๋Œ€ํ•œ ์ ๊ฒŒ ์œ ์ง€ํ•œ๋‹ค.

  1. ํด๋ž˜์Šค ์ž๊ธฐ ์ž์‹ ์˜ ๋ฉ”์†Œ๋“œ ๋˜๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์˜ ๋ฉ”์†Œ๋“œ ๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค.
  2. ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ณด๋‚ด์ง„ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค.
  3. ๋ฉ”์†Œ๋“œ ๋˜๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ€ ์ง์ ‘ ์ดˆ๊ธฐํ™”ํ•œ ๊ฐ์ฒด์ผ๋•Œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค.
  4. ํ˜ธ์ถœ์„ ์œ„ํ•ด์„œ ๋ฉ”์†Œ๋“œ ๋˜๋Š” ์†์„ฑ์œผ๋กœ ๊ฐ™์€ ํด๋ž˜์Šค ์•ˆ์—์„œ ์„ ์–ธ๋œ ๊ฐ์ฒด๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค.
  5. ์‹ฑ๊ธ€ํ„ด ๊ฐ™์€ ์ „์—ญ ๊ฐ์ฒด์ผ๋•Œ๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ๋ชป ์ง€ํ‚จ ํ˜•ํƒœโŒ

human.Stomach.IsEmpty()

๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์ž˜ ์ง€ํ‚จ ํ˜•ํƒœโœ…

human.IsHungry()

์œ„ human.Stomach.IsEmpty() ๊ฒฝ์šฐ

human๊ฐ์ฒด ์•ˆ์— Stomach๊ฐ์ฒด๋ฅผ ๋ฐ›์•„์„œ IsEmpty()๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ํŒ๋ณ„ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” IsHungry()๋กœ ์จ์•ผ ์ถ”ํ›„ Stomach์˜ IsEmpty()๋ฅผ ์ˆ˜์ •ํ•˜๋”๋ผ๋„ human๊นŒ์ง€ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.

๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹Œ๊ฒฝ์šฐ๋Š” ํ•ด๋‹น ์›์น™์„ ๋”ฐ๋ฅผ ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ ํ•œ๋‹ค. ์ž๋ฃŒ ๊ตฌ์กฐ์—์„œ๋Š” ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋…ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

val myFile:File = mfile.getFile()
val myFilePaht:String = mfile.getFile().getFileAbsolutePath()

๋””๋ฏธํ„ฐ ๋ฒ•์น™์€ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ ํŒ๋ณ„ํ•ด์•ผํ•œ๋‹ค. ๋˜ํ•œ ๊ทธ ํŒ๋ณ„์ด ์ƒํ™ฉ๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ถ„๋ฒ• ์ ์œผ๋กœ ์ƒ๊ฐํ•˜์ง€ ์•Š์•„์•ผํ•œ๋‹ค.

๊ธฐ์ฐจ ์ถฉ๋Œ ํ”ผํ•˜๊ธฐ(๋””๋ฏธํ„ฐ ๋ฒ•์น™ ์œ„๋ฐ˜)

object.getChild().getContent().getItem().getTitle()

ํ”„๋กœ๊ทธ๋žจ ์ˆœํšŒ ๊ฒฝ๋กœ๊ฐ€ ๊ธธ์ˆ˜๋ก ๋ถˆ์•ˆ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์˜ ๋ฐฉ์‹์€ ํ”ผํ•˜๋„๋ก ํ•œ๋‹ค.

โ—์ฃผ์˜

๋””๋ฏธํ„ฐ ๋ฒ•์น™์€ ํ•˜๋‚˜์˜ .์„ ์จ์•ผํ•˜๋Š” ๊ทœ์น™์ด ์•„๋‹˜์„ ์ƒ๊ฐํ•ด์•ผํ•œ๋‹ค.

//myService๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๊ณ  ์‹ฑ๊ธ€ํ„ด์œผ๋กœ instance๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋กœ ์ƒ์„ฑ๋œ๋‹ค.
myService.getInstance()
	.requestToMyAPI(...)
/*
์œ„์˜ ๊ฒฝ์šฐ๋Š” myService๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ด๊ณ  .getInstance๋กœ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋˜์–ด myService๊ฐ€ ๋‹ค๋ฅธ myService๋กœ ๋ณ€ํ™˜๋˜๊ณ . ์ด๋ฅผ ๋‘˜๋Ÿฌ์‹ผ ์บก์Š์€ ์œ ์ง€๋œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ requestToMyAPI()์ด๋‹ค.
*/
//๋˜๋‹ค๋ฅธ ์ž๋ฐ”8์˜ IntStream ์˜ˆ์ œ
IntStream.of(1,20,3,40)
	.filter(x -> x>10)
	.distinct()
	.count()
/*
์œ„์˜ ๊ฒฝ์šฐ๋„ of,filter,distinct ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ชจ๋‘ IntStream์ด๋ผ๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๊ฐ์‹ผ ์บก์Š์ด ์œ ์ง€ ๋œ๋‹ค.
*/