Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

45 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๊ฐœ์š”

์ด ํ”„๋กœ์ ํŠธ๋Š” Robert C. Martin์˜ Clean Coders Screen Cast ์ค‘ Episode 10. OCP(Open but Closed Principle)์—์„œ ์‚ฌ์šฉ๋œ ์˜ˆ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€, ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์งง์€ ๋ณ€๊ฒฝ ๋‹จ์œ„๋กœ ์ปค๋ฐ‹ํ•˜์—ฌ ๋ณด์—ฌ์ค€๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š”

  • Function Should Do One Thing
  • SRP(Single Responsibility Principle)
  • Feature Envy
  • OCP(Open but Closed Principle)

๋“ฑ์„ ์ค€์ˆ˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ๋ณด์—ฌ์ค€๋‹ค.

  • Extract Variable / Field / Method / Class / Interface
  • Inline Variable
  • Rename
  • Change Signature
  • Create a Field for Parameter
  • Move Method
  • Safely Delete
  • Replace Type Code with Subclasses
  • push members down

์˜ˆ์ œ์—์„œ๋Š” IDE๋กœ intelliJ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

1. ๋ฌธ์ œ

1.1 Function Should Do One Thing ์œ„๋ฐ˜

image

  • ํ•จ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ํฌ๊ณ ,
  • ์ค‘๋ณต๋„ ์กด์žฌ(xx / 100)
  • ์ž‘์€ ๋ฉ”์†Œ๋“œ๋“ค๋กœ ์ถ”์ถœ(extract)ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
  • Composed Method Pattern, Extract till drop ๊ทœ์น™์— ๋”ฐ๋ผ extract method๋ฅผ ์ˆ˜ํ–‰

1.2 SRP ์œ„๋ฐ˜

image

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(๋น„์šฉ ๊ณ„์‚ฐ ๋กœ์ง)๊ณผ ๋ฉ”์‹œ์ง€/ํฌ๋งทํŒ… ๋กœ์ง์ด ์„ž์—ฌ ์žˆ๋‹ค.
  • ํ•œ๊ฐ€์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ด์œ ๋กœ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

1.3 OCP ์œ„๋ฐ˜

image

  • ๋น„์ง€๋‹ˆ์Šค ๊ทœ์น™์„ ํ™•์žฅํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์ด ๋ชจ๋“ˆ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.
  • ๋ฉ”์‹œ์ง€์™€ ํฌ๋งทํŒ…์„ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์ด ๋ชจ๋“ˆ์„ ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค(์œ„ ๊ทธ๋ฆผ์—์„œ ๋ถ‰์€ ๋ฐ•์Šค์ฒ˜๋Ÿผ ํƒ€์ž…์— ์˜์กดํ•œ ์ฝ”๋“œ๋กœ ์ธํ•ด)

๋งŒ์ผ ์ƒˆ๋กœ์šด ์‹์‚ฌ ํƒ€์ž…์œผ๋กœ LUNCH๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ ํƒ€์ž…์— ์˜์กดํ•˜๋Š” ์ฝ”๋“œ๋กœ ์ธํ•ด ์–ด๋ ค์›€์„ ๊ฒช๊ฒŒ๋œ๋‹ค. ์‹œ์Šคํ…œ ๋‚ด์˜ ๋ชจ๋“  ์†Œ์Šค์—์„œ expense type์— ์˜์กดํ•˜๋Š” ๋ชจ๋“  switch-case๋‚˜ if-else ๋ฌธ์žฅ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

1.4 Feature Envy

image

  • Expense์˜ type, amount ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ณ  ์žˆ๋‹ค.
  • ์ด๋Ÿฐ ๋กœ์ง์€ Expense์— ์žˆ์–ด์•ผ ํ•จ.

2. Refactoring

๋‹คํ–‰ํžˆ ํ…Œ์ŠคํŠธ(๋ช…ํ™•ํ•œ ๋ฌธ์„œ๋กœ์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์š”๊ตฌ์‚ฌํ•ญ ์—ญํ• )๋Š” ์กด์žฌํ•˜์—ฌ ๊ณต๊ฒฉ์ ์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

2.1 Function Should Do One Thing

Function Should Do One Thing์„ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด extract method๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

2.1.1 penniesToDollars

์ ˆ์ฐจ

  • Extract Variable
    • ์ค‘๋ณต๋œ ๋กœ์ง์— ๋Œ€ํ•ด extract method๋ฅผ ์ ์šฉํ•˜๊ธฐ ์ „์— ์ œ์ผ ์ฒ˜์Œ ๋ณด์ด๋Š” ์ค‘๋ณต ์ฝ”๋“œ(expense.amount / 100.0)์—์„œ method๋กœ ์ถ”์ถœ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ extract variableํ•œ๋‹ค. image
  • Extract Method
    • ์ฒ˜์Œ ์ค‘๋ณต์ฝ”๋“œ(amount/100.0)์„ ์„ ํƒํ•˜๊ณ  "Extract Method"๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • IDE๊ฐ€ ๋‹ค๋ฅธ 2๊ณณ์˜ ์ฝ”๋“œ์—๋„ extract method๋ฅผ ์ ์šฉํ• ์ง€ ๋ฌผ์œผ๋ฉด "Yes"๋ฅผ ์„ ํƒํ•œ๋‹ค.
    • Process Duplicate ๋Œ€ํ™”์ƒ์ž์—์„œ All์„ ์„ ํƒํ•˜์—ฌ ๋ชจ๋“  ์ค‘๋ณต ์ฝ”๋“œ์— extract method๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. image
    • ํŒŒ๋ผ๋ฏธํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด extractํ–ˆ๋˜ ๋ณ€์ˆ˜๋ฅผ inlineํ•œ๋‹ค. image
2.1.2 printXXX
  • ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  Composed Method Pattern์„ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด printHeader ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”์ถœํ•œ๋‹ค. image
  • ๊ฐ™์€ ์ด์œ ๋กœ printTotals ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”์ถœํ•œ๋‹ค. image
  • printExpenses ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”์ถœํ•˜๊ณ  ์‹ถ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋กœ์ง์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์„ž์—ฌ์žˆ๋‹ค.
    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ํฌ๋งทํŒ… ๋กœ์ง์„ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํ•œ ๊ณณ์œผ๋กœ ๋ชจ์ธ๋‹ค. image
    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ํฌ๋งทํŒ… ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด for-loop๋ฅผ 2๊ฐœ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค. image
    • printExpenses ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”์ถœํ•œ๋‹ค. image
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ totalUpExpenses๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”์ถœํ•˜๊ณ  ์‹ถ์œผ๋‚˜ 2๊ฐœ์˜ ๋ณ€์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด extractํ•  ์ˆ˜ ์—†๋‹ค. image
    • 2๊ฐœ์˜ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด extract fieldํ•œ๋‹ค. ์ด๋•Œ constructor์—์„œ initializeํ•˜๋„๋ก ์„ ํƒํ•œ๋‹ค. image
    • extract method - totalUpExpenses image
2.1.3 Change Signature
  • total, mealExpenses๋Š” field๋กœ ์ถ”์ถœํ–ˆ์œผ๋ฏ€๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. image

*** ๋ณดํ†ต ์ฝ”๋“œ์˜ ์—ฌ๋Ÿฌ๊ณณ์— ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๋“ค์€ ๋ฆฌํŒฉํ† ๋ง ์ „์— field๋กœ ์ถ”์ถœํ•˜๋Š” ์ž‘์—…์„ ์„ ํ–‰ํ•œ๋‹ค. ๊ทธ๋Ÿผ ๋” ํŽธํ•˜๊ฒŒ ๋ฆฌํŒฉํ† ๋ง์ด ๊ฐ€๋Šฅํ•˜๋‹ค.***

2.1.4 getName

image

2.1.5 Create a Field for Parameter

printReport์— ์ „๋‹ฌ๋œ printer๊ฐ€ ์—ฌ๋Ÿฌ ํ•จ์ˆ˜์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋˜๊ณ  ์žˆ๋‹ค. ์ด๋ฅผ field๋กœ ์ƒ์„ฑํ•˜์—ฌ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐœ์ˆ˜๋ฅผ ์ค„์ธ๋‹ค.

  • Create a Field for Parameter image
  • field๋กœ ๋ณ€ํ™˜ํ•œ printer๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ–๋Š” ๋ฉ”์†Œ๋“œ๋“ค์— ๋Œ€ํ•ด change signature๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. image
2.1.6 printExpensesAndTotals
  • ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์ „ ์ž‘์—…์œผ๋กœ move line up์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. image
  • printExpensesAndTotals ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”์ถœํ•œ๋‹ค. image
2.1.7 printExpense
  • {}๋ฅผ ์—†์• ๊ธฐ ์œ„ํ•ด ๋ฉ”์†Œ๋“œ ์ถ”์ถœ
  • {}๋Š” function should do one thing์„ ์œ„๋ฐ˜ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ฆํ›„์ด๋‹ค. image
  • ๋ถˆํ•„์š”ํ•œ ๋ณ€์ˆ˜ ์„ ์–ธ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด name์„ inlineํ•œ๋‹ค. image
2.1.8 isMeal
  • ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด isMeal ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”์ถœํ•œ๋‹ค. image
2.1.9 addTotals

{}๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด addTotals ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”์ถœํ•œ๋‹ค. image

2.1.10 isOverage

๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด isOverage๋ฅผ ์ถ”์ถœํ•œ๋‹ค. image

2.2 SRP ์œ„๋ฐ˜

2.2.1 Rename

ExpenseReport์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ถ”์ถœํ•˜์—ฌ ์ด๋ฅผ ExpeseReport๋ผ๊ณ  ํ•˜๊ธฐ์œ„ํ•ด ์ง€๊ธˆ์˜ ExpeseReport๋Š” ExpeseReporter๋กœ renameํ•œ๋‹ค.

2.2.2 Extract Class

image

  • extract classํ•  ๋•Œ๋Š” ๊ด€๋ จ๋œ ๋ฉ”์†Œ๋“œ/ํ•„๋“œ๋ฅผ ํ•จ๊ป˜ ์ถ”์ถœํ•ด์•ผ ํ•œ๋‹ค.
  • ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์†Œ๋“œ/ํ•„๋“œ๋ฅผ "Members to Extract"์—์„œ ์ž˜ ์„ ํƒํ•œ๋‹ค.

image

image

2.2.3 Safely Delete Unused Methods
  • extract class ํ›„์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”์†Œ๋“œ๋“ค์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
  • (intellJ์—์„œ๋Š” ์ปค๋ฐ‹๋•Œ ์ด๋Ÿฐ warning์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ๋‹ˆโ€ฆ ์ปค๋ฐ‹ ์ „์— ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.) image

2.3 Feature Envy

Feature Envy์ธ ๋ฉ”์†Œ๋“œ isOverage, isMeal๋ฅผ Expense ํด๋ž˜์Šค๋กœ Move Methodํ•œ๋‹ค. image image image

2.4 OCP ์œ„๋ฐ˜

Type์— ์ข…์†์ ์ด์—ฌ์„œ OCP๋ฅผ ์œ„๋ฐ˜ํ•˜๊ณ  ์žˆ๋‹ค. Replace Type Code with Subclasses๋ฅผ ์ ์šฉํ•˜์ž.

2.4.1 Test ์ˆ˜์ •
  • Test๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ Expense๊ฐ€ ์•„๋‹ˆ๋ผ ํ•„์š”ํ•œ ํƒ€์ž…์˜ ์„œ๋ธŒ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•œ๋‹ค. image
  • IDE์˜ quick fix ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ 3๊ฐœ์˜ ์„œ๋ธŒ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์„ฑ๊ณต์„ ํ™•์ธ
  • ๊ฐ์ฒด ์ƒ์„ฑ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜๋Š” type(์˜ˆ. DINNER)๊ณผ ํด๋ž˜์Šค๋ช…(์˜ˆ. DinnerExpense)๋Š” ์ค‘๋ณต์ด๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
    • ํ…Œ์ŠคํŠธ image
    • ํ”„๋กœ๋•์…˜ image
2.4.2 push members down
  • Expense ํด๋ž˜์Šค์—์„œ isMeal, isOverage 2๊ฐœ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ํƒํ•˜์—ฌ

  • keep abstract๋ฅผ ์„ ํƒํ•˜์—ฌ base ํด๋ž˜์Šค์—๋Š” abstract๋กœ ์œ ์ง€๋˜๋„๋ก

    image image image

2.4.3 ํƒ€์ž…๋ณ„ ์ˆ˜์ •
  • isMeal, isOverage ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•ด์„œ ํƒ€์ž…๋ณ„๋กœ ์ˆ˜์ •
  • ์ด๋•Œ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์ฐธ์กฐํ•˜๋ฉด์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. image image image
2.4.4 Remove Type
  • ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” Expense.Type enum์„ ์ œ๊ฑฐํ•œ๋‹ค.
  • getName ๋ฉ”์†Œ๋“œ์—์„œ Type์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •ํ•œ๋‹ค. image image image
2.4.5 Extract Class - ExpenseNamer

์ด์ œ ์ƒˆ๋กœ์šด ํƒ€์ž…์ด ์ถ”๊ฐ€๋˜๋ฉด ์ˆ˜์ •์€ ์—†๋‹ค. ๊ทธ์ € Expense๋ฅผ ์ƒ์†๋ฐ›๋Š” ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ExpenseRepoter#getName๋Š” ์ƒˆ๋กœ์šด ํƒ€์ž…์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ์ˆ˜์ •๋˜์–ด์•ผ ํ•œ๋‹ค. OCP ์œ„๋ฐ˜์ด๋‹ค.

์ด๋ฅผ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋กœ ์ถ”์ถœํ•˜๊ณ , ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”์ถœํ•˜๊ณ , ExpenseRepoter๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กด์„ฑ์„ ๊ฐ–๊ฒŒ ํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(app part)์˜ ๋ณ€๊ฒฝ ์—†์ด ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

  • Extract Class - ExpenseNamer image image
  • ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ExpenseReport#getName ๋ฉ”์†Œ๋“œ๋ฅผ safely deleteํ•œ๋‹ค.
  • change scope of getName to public
    • extract interface๋ฅผ ์œ„ํ•ด ๋ณ€๊ฒฝํ•œ๋‹ค.
  • extract interface image image image image

๊ฒฐ๋ก 

image

์ด์ƒ์˜ ๊ณผ์ •์—์„œ ์ด์™€ ๊ฐ™์€ ์•„ํ‚คํ…์ณ๋ฅผ ์–ป์—ˆ๋‹ค.

  • ๋ถ‰์€์ƒ‰์œผ๋กœ ๋‚˜๋ˆ ์ง„ ์œ— ๋ถ€๋ถ„์€ ๋ณ€๊ฒฝ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด๊ณ 
  • ์•„๋ž˜ ๋ถ€๋ถ„์€ ๋ณ€๊ฒฝ์ด ์š”๊ตฌ๋  ๋•Œ ์ถ”๊ฐ€๋˜์–ด์•ผํ•˜๋Š” ์„œ๋ธŒ ํด๋ž˜์Šค๋“ค๊ณผ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•  ๊ตฌํ˜„์ฒด์ด๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ๋Š” getName์„ Expese ํด๋ž˜์Šค๋กœ ์˜ฎ๊ธฐ๋ฉด ๋” ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.

before

image

after

image

  • ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์„ ๋ณด๋ฉด ๋ณต์žกํ•ด ์ง„ ๊ฒƒ ๊ฐ™์œผ๋‚˜, ๊ธฐ์กด ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ Expense๊ฐ€ data holder๋กœ์„œ ๊ฐ์ฒด์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์— ๋ฐ˜ํ•ด
  • ๋ฆฌํŒฉํ† ๋ง ํ›„์—๋Š” ์ฑ…์ž„(์ถœ๋ ฅ, ๊ณ„์‚ฐ)์ด ๋ถ„๋ฆฌ๋˜์—ˆ๊ณ , Expense์— ๊ด€๋ จ๋œ ํ–‰์œ„๊ฐ€ ์˜ฎ๊ฒจ์กŒ๋‹ค. ๋˜ ๋‹ค์ด์–ด๊ทธ๋žจ๋งŒ์œผ๋กœ ์–ด๋–ค Expense๋“ค์ด ์กด์žฌํ•˜๋Š”์ง€ ์–ด๋–ค ๊ธฐ๋Šฅ๋“ค์ด ์žˆ๋Š”์ง€๊ฐ€ ๋ˆˆ์— ์ž˜ ๋“ค์–ด์˜จ๋‹ค.
  • ๋˜ ๋ฐ์ดํ„ฐ์™€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์ด ํ•œ ๊ฐ์ฒด์— ๋ชจ์ด๋ฉด์„œ ๋‚ด๋ถ€์˜ ๋ณ€๊ฒฝ์ด ์™ธ๋ถ€์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ฒŒ ๋˜์—ˆ๋‹ค.

๋ฉ”์ผ: msbaek71@gmail.com ์ด๋‚˜ facebook design by object ๊ทธ๋ฃน์œผ๋กœ ์˜๊ฒฌ์ด๋‚˜ ์งˆ๋ฌธ ๋ฐ›๊ฒ ์Šต๋‹ˆ๋‹ค.

About

Clean Coders Episode 10 OCP Expense Example

Resources

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages