Skip to content

Files

Latest commit

1ccb0bb ยท Oct 31, 2020

History

History

chapter-10

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Oct 21, 2020
Oct 18, 2020
Oct 19, 2020
Oct 22, 2020
Oct 23, 2020
Oct 24, 2020
Oct 31, 2020
Oct 28, 2020

Chapter 10 - Simplifying Conditional Logic

์กฐ๊ฑด๋ถ€ ๋กœ์ง ๊ฐ„์†Œํ™”

์กฐ๊ฑด๋ถ€ ๋กœ์ง์€ ํ”„๋กœ๊ทธ๋žจ์˜ ํž˜์„ ๊ฐ•ํ™”ํ•˜๋Š”๋ฐ ๊ธฐ์—ฌํ•˜์ง€๋งŒ, ์•ˆํƒ€๊น๊ฒŒ๋„ ํ”„๋กœ๊ทธ๋žจ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์›ํ‰์ด๊ธฐ๋„ ํ•˜๋‹ค.

table of contents

  1. DECOMPOSE CONDITIONAL
  2. CONSOLIDATE CONDITIONAL EXPRESSION
  3. REPLACE NESTED CONDITIONAL WITH GUARD CLAUSES
  4. REPLACE CONDITIONAL WITH POLYMORPHISM
  5. INTRODUCE SPECIAL CASE
  6. INTRODUCE ASSERTION
  7. Replace Control Flag with Break

DECOMPOSE CONDITIONAL

10.1 ์กฐ๊ฑด๋ฌธ ๋ถ„ํ•ดํ•˜๊ธฐ

if (!aDate.isBefore(plan.summerStart) && !aDate.isAfter(plan.summerEnd)) {
  charge = quantity * plan.summerRate;
} else {
  charge = quantity * plan.reqularRate + plan.reqularServiceCharge;
}
if (summer()) {
  charge = summerCharge();
} else {
  charge = regularCharge();
}

๋ฐฐ๊ฒฝ(Motivation)

๋ณต์žกํ•œ ์กฐ๊ฑด๋ถ€ ๋กœ์ง์€ ํ”„๋กœ๊ทธ๋žจ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋‹ค๋Š” ๊ฐ€์žฅ ํ”ํ•œ ์›ํ‰์— ์†ํ•œ๋‹ค. ๋‹ค์–‘ํ•œ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋™์ž‘๋„ ๋‹ค์–‘ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ˆœ์‹๊ฐ„์— ๊ฝค ๊ธด ์กฐ๊ฑด๋ฌธ์ด ํƒ„์ƒํ•œ๋‹ค. ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ์— ๋”ฐ๋ฅธ ๋™์ž‘์„ ํ‘œํ˜„ํ•œ ์ฝ”๋“œ๋Š” ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์ด์•ผ๊ธฐํ•ด์ฃผ์ง€๋งŒ '์™œ' ์ผ์–ด๋‚˜๋Š”์ง€๋Š” ๋งํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค.

์™œํ•˜๋Š”๊ฐ€?

๊ฑฐ๋Œ€ํ•œ ์ฝ”๋“œ ๋ธ”๋Ÿญ์ด ์ฃผ์–ด์ง€๋ฉด ์ฝ”๋“œ๋ฅผ ๋ถ„์œ„๋ณ„๋กœ ๋ถ„ํ•ดํ•œ ๋‹ค์Œ ํ•ด์ฒด๋œ ์ฝ”๋“œ ๋ฉ์–ด๋ฆฌ๋“ค์„ ๊ฐ ๋ฉ์–ด๋ฆฌ์˜ ์˜๋„๋ฅผ ์‚ด๋ฆฐ ์ด๋ฆ„์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋ฐ”๊พธ์ž. ๊ทธ๋Ÿฌ๋ฉด ์ „์ฒด์ ์ธ ์˜๋„๊ฐ€ ๋” ํ™•์‹คํžˆ ๋“œ๋Ÿฌ๋‚œ๋‹ค.

์ ˆ์ฐจ

  1. ์กฐ๊ฑด์‹๊ณผ ๊ทธ ์กฐ๊ฑด์‹์— ๋”ธ๋ฆฐ ์กฐ๊ฑด์ ˆ ๊ฐ๊ฐ์„ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•œ๋‹ค.

์ฝ”๋“œ

โฌ† back to top

CONSOLIDATE CONDITIONAL EXPRESSION

10.2 ์กฐ๊ฑด์‹ ํ†ตํ•ฉํ•˜๊ธฐ

if (anEmployee.seniority < 2) return 0;
if (anEmployee.monthsDisabled > 12) return 0;
if (anEmployee.isPartTime) return 0;
if (isNotEligibleForDisability()) return 0;

function isNotEligibleForDisability() {
  return (
    anEmployee.seniority < 2 
    || anEmployee.monthsDisabled > 12 
    || anEmployee.isPartTime
  );
}

๋ฐฐ๊ฒฝ(Motivation)

๋น„๊ตํ•˜๋Š” ์กฐ๊ฑด์€ ๋‹ค๋ฅด์ง€๋งŒ ๊ทธ ๊ฒฐ๊ณผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์ž‘์€ ๋˜‘๊ฐ™์€ ์ฝ”๋“œ๋“ค์ด ๋”๋Ÿฌ ์žˆ๋Š”๋ฐ, ์–ด์ฐจํ”ผ ๊ฐ™์€ ์ผ์„ ํ•  ๊ฑฐ๋ผ๋ฉด ์กฐ๊ฑด ๊ฒ€์‚ฌ๋„ ํ•˜๋‚˜๋กœ ํ†ตํ•˜ํ•˜๋Š” ๊ฒŒ ๋‚ซ๋‹ค. ์ด๋Ÿด ๋•Œ 'and'์—ฐ์‚ฐ์ž์™€ 'or'์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋น„๊ต ๋กœ์ง์„ ํ•˜๋‚˜๋กœ ํ•ฉ์น  ์ˆ˜ ์žˆ๋‹ค.

์กฐ๊ฑด๋ถ€ ์ฝ”๋“œ ํ†ตํ•ฉ์„ ํ†ตํ•ด ์ฒซ์งธ, ์—ฌ๋Ÿฌ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋‰œ ์กฐ๊ฑด๋“ค์„ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•จ์œผ๋กœ์จ ๋‚ด๊ฐ€ ํ•˜๋ ค๋Š” ์ผ์ด ๋” ๋ช…ํ™•ํ•ด์ง„๋‹ค. ๋‚˜๋ˆ ์„œ ์ˆœ์„œ๋Œ€๋กœ ๋น„๊ตํ•ด๋„ ๊ฒฐ๊ณผ๋Š” ๊ฐ™์ง€๋งŒ, ์ฝ๋Š” ์‚ฌ๋žŒ์€ ๋…๋ฆฝ๋œ ๊ฒ€์‚ฌ๋“ค์ด ์šฐ์—ฐํžˆ ํ•จ๊ป˜ ๋‚˜์—ด๋œ ๊ฒƒ์œผ๋กœ ์˜คํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ด์œ ๋Š” ์ด ์ž‘์—…์ด ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ ๊นŒ์ง€ ์ด์–ด์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ณต์žกํ•œ ์กฐ๊ฑด์‹์„ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•˜๋ฉด ์ฝ”๋“œ์˜ ์˜๋„๊ฐ€ ํ›จ์”ฌ ๋ถ„๋ช…ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ๋Š” '๋ฌด์—‡'์„ ํ•˜๋Š”์ง€๋ฅผ ๊ธฐ์ˆ ํ•˜๋˜ ์ฝ”๋“œ๋ฅผ '์™œ'ํ•˜๋Š”์ง€๋ฅผ ๋งํ•ด์ฃผ๋Š” ์ฝ”๋“œ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ํšจ๊ณผ์ ์ธ ๋„๊ตฌ์ž„์„ ๊ธฐ์–ตํ•˜์ž

์™œํ•˜๋Š”๊ฐ€?

  1. ์—ฌ๋Ÿฌ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋‰œ ์กฐ๊ฑด๋“ค์„ ํ†ตํ•ฉํ•จ์œผ๋กœ์จ ํ•˜๋ ค๋Š” ์ผ์ด ๋” ๋ช…ํ™•ํ•ด์ง
  2. ์ด ์ž‘์—…์ด ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ๋กœ ์ด์–ด์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ๋ฅผ ํ†ตํ•ด '๋ฌด์—‡'์„ ํ•˜๋Š”์ง€๋ฅผ ๊ธฐ์ˆ ํ•˜๋˜ ์ฝ”๋“œ๋ฅผ '์™œ'ํ•˜๋Š”์ง€๋ฅผ ๋งํ•ด์ฃผ๋Š” ์ฝ”๋“œ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

์ ˆ์ฐจ

  1. ํ•ด๋‹น ์กฐ๊ฑด์‹๋“ค ๋ชจ๋‘์— ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  2. ์กฐ๊ฑด๋ฌธ ๋‘ ๊ฐœ๋ฅผ ์„ ํƒํ•˜์—ฌ ๋‘ ์กฐ๊ฑด๋ฌธ์˜ ์กฐ๊ฑด์‹๋“ค์„ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๋กœ ๊ฒฐํ•ฉํ•œ๋‹ค.
  3. ํ…Œ์ŠคํŠธํ•œ๋‹ค.
  4. ์กฐ๊ฑด์ด ํ•˜๋‚˜๋งŒ ๋‚จ์„ ๋•Œ๊นŒ์ง€ 2, 3 ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
  5. ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง„ ์กฐ๊ฑด์‹์„ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ• ์ง€ ๊ณ ๋ คํ•ด๋ณธ๋‹ค.

์˜ˆ์‹œ

  1. ์กฐ๊ฑด ๊ฒ€์‚ฌ๊ฐ€ ์ˆœ์ฐจ์ ์ด๋ผ๋ฉด or ์‚ฌ์šฉ
  2. ์กฐ๊ฑด ๊ฒ€์‚ฌ๊ฐ€ if๋ฌธ์ด ์ค‘์ฒฉ๋œ๋‹ค๋ฉด and ์‚ฌ์šฉ
  • if๋ฌธ์ด ์ค‘์ฒฉ๋˜๋Š” ๊ฒฝ์šฐ
if (anEmployee.onVacation)
  if (anEmployee.seniority > 10)
    return 1;
return 0.5;
  • ์œ„์˜ ์กฐ๊ฑด๋“ค์„ and ์—ฐ์‚ฐ์ž๋กœ ๊ฒฐํ•ฉํ•œ ์˜ˆ
if ((anEmployee.onVacation)
    && (anEmployee.seniority > 10)) return 1;
return 0.5;

์ฝ”๋“œ

โฌ† back to top

REPLACE NESTED CONDITIONAL WITH GUARD CLAUSES

10.3 ์ค‘์ฒฉ ์กฐ๊ฑด๋ฌธ์„ ๋ณดํ˜ธ ๊ตฌ๋ฌธ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ

function getPayAmount() {
  let result;
  if (isDead) {
    result = deadAmount();
  } else {
    if (isSeparated) 
      result = separatedAmount();
    else {
      if (isRetired) 
        result = retiredAmount();
      else 
        result = normalPayAmount();
    }
  }
  return result;
}
function getPayAmount() {
  let result;
  if (isDead) return deadAmount();
  if (isSeparated) return separatedAmount();
  if (isRetired) return retiredAmount();
  return normalPayAmount();
}

๋ฐฐ๊ฒฝ(Motivation)

์กฐ๊ฑด๋ฌธ์€ ๋‘ ๊ฐ€์ง€ ํ˜•ํƒœ๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

  1. '์ฐธ์ธ ๊ฒฝ๋กœ'์™€ '๊ฑฐ์ง“์ธ ๊ฒฝ๋กœ' ๋ชจ๋‘ ์ •์ƒ ๋™์ž‘์œผ๋กœ ์ด์–ด์ง€๋Š” ํ˜•ํƒœ
  2. ๊ฒฝ๋กœ ์ค‘ ํ•œ์ชฝ๋งŒ ์ •์ƒ์ธ ํ˜•ํƒœ
  • ์œ„์˜ ๋‘ ํ˜•ํƒœ๋Š” ์˜๋„๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ, ์˜๋„๊ฐ€ ์ฝ”๋“œ์— ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•จ
  • ๋‘ ๊ฒฝ๋กœ ๋ชจ๋‘ ์ •์ƒ ๋™์ž‘ํ•œ๋‹ค๋ฉด if else ์ ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ํ˜•ํƒœ
  • ํ•œ์ชฝ๋งŒ ์ •์ƒ์ด๋ผ๋ฉด ๋น„์ •์ƒ ์กฐ๊ฑด์„ if์—์„œ ๊ฒ€์‚ฌํ•œ ๋‹ค์Œ, ์ฐธ์ด๋ฉด ํ•จ์ˆ˜์—์„œ ๋น ์ ธ๋‚˜์˜ค๋Š” ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉ, ์ด ๊ฒ€์‚ฌ๋ฅผ ๋ณดํ˜ธ ๊ตฌ๋ฌธ์ด๋ผ๊ณ  ํ•จ

์™œํ•˜๋Š”๊ฐ€?

์ค‘์ฒฉ ์กฐ๊ฑด๋ฌธ์„ ๋ณดํ˜ธ ๊ตฌ๋ฌธ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ ๋ฆฌํŒฉํ„ฐ๋ง์˜ ํ•ต์‹ฌ์€ ์˜๋„๋ฅผ ๋ถ€๊ฐํ•˜๋Š”๋ฐ ์žˆ๋‹ค. ๋ณดํ˜ธ ๊ตฌ๋ฌธ์€ '์ด๊ฑด ์ด ํ•จ์ˆ˜์˜ ํ•ต์‹ฌ์ด ์•„๋‹ˆ๋‹ค. ์ด ์ผ์ด ์ผ์–ด๋‚˜๋ฉด ๋ฌด์–ธ๊ฐ€ ์กฐ์น˜๋ฅผ ์ทจํ•œ ํ›„ ํ•จ์ˆ˜์—์„œ ๋น ์ ธ๋‚˜์˜จ๋‹ค'๋ผ๊ณ  ์ด์•ผ๊ธฐํ•œ๋‹ค.

์ ˆ์ฐจ

  1. ๊ต์ฒดํ•ด์•ผ ํ•  ์กฐ๊ฑด ์ค‘ ๊ฐ€์žฅ ๋ฐ”๊นฅ ๊ฒƒ์„ ์„ ํƒํ•˜์—ฌ ๋ณดํ˜ธ ๊ตฌ๋ฌธ์œผ๋กœ ๋ฐ”๊พผ๋‹ค.
  2. ํ…Œ์ŠคํŠธํ•œ๋‹ค.
  3. 1, 2 ๊ณผ์ •์„ ํ•„์š”ํ•œ ๋งŒํผ ๋ฐ˜๋ณตํ•œ๋‹ค.
  4. ๋ชจ๋“  ๋ณดํ˜ธ ๊ตฌ๋ฌธ์ด ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด ๋ณดํ˜ธ ๊ตฌ๋ฌธ๋“ค์˜ ์กฐ๊ฑด์‹์„ ํ†ตํ•ฉํ•œ๋‹ค.

์ฝ”๋“œ

part.03-Replace_Nested_Conditional_With_Guard_Clauses

โฌ† back to top

REPLACE CONDITIONAL WITH POLYMORPHISM

10.4 ์กฐ๊ฑด๋ถ€ ๋กœ์ง์„ ๋‹คํ˜•์„ฑ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ

switch (bird.type) {
  case '์œ ๋Ÿฝ ์ œ๋น„':
    return '๋ณดํ†ต์ด๋‹ค';
  case '์•„ํ”„๋ฆฌ์นด ์ œ๋น„':
    return (bird.numberOfCoconuts > 2) ? '์ง€์ณค๋‹ค' : '๋ณดํ†ต์ด๋‹ค';
  case '๋…ธ๋ฅด์›จ์ด ํŒŒ๋ž‘ ์•ต๋ฌด':
    return (bird.voltage > 100) ? '๊ทธ์„๋ ธ๋‹ค' : '์˜ˆ์˜๋‹ค';
  default:
      return '์•Œ ์ˆ˜ ์—†๋‹ค';
}
class EuropeanSwallow {
  get plumage() {
    return '๋ณดํ†ต์ด๋‹ค'
  }
}
class AfricanSwallow {
  get plumage() {
    return (this.numberOfCoconuts > 2) ? '์ง€์ณค๋‹ค' : '๋ณดํ†ต์ด๋‹ค';
  }
}
class NorwegianBlueParrot {
  get plumage() {
    return (this.voltage > 100) ? '๊ทธ์„๋ ธ๋‹ค' : '์˜ˆ์˜๋‹ค';
  }
}

๋ฐฐ๊ฒฝ(Motivation)

๋ณต์žกํ•œ ์กฐ๊ฑด๋ถ€ ๋กœ์ง์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํ•ด์„ํ•˜๊ธฐ๊ฐ€ ๋‚œํ•ดํ•œ ๋Œ€์ƒ์— ์†ํ•˜๋ฏ€๋กœ ์กฐ๊ฑด๋ฌธ ๊ตฌ์กฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘” ์ฑ„ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํด๋ž˜์Šค์™€ ๋‹คํ˜•์„ฑ์„ ์ด์šฉํ•˜๋ฉด ๋” ํ™•์‹คํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์™œํ•˜๋Š”๊ฐ€?

๋ณต์žกํ•œ ์กฐ๊ฑด๋ถ€ ๋กœ์ง์„ ์ง๊ด€์ ์œผ๋กœ ๊ตฌ์กฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด

์ ˆ์ฐจ

  1. ๋‹คํ˜•์  ๋™์ž‘์„ ํ‘œํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋“ค์ด ์•„์ง ์—†๋‹ค๋ฉด ๋งŒ๋“ค์–ด์ค€๋‹ค. ์ด์™•์ด๋ฉด ์ ํ•ฉํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์•Œ์•„์„œ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•˜๋Š” ํŒฉํ„ฐ๋ฆฌ ํ•จ์ˆ˜๋„ ํ•จ๊ป˜ ๋งŒ๋“ ๋‹ค.
  2. ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ์—์„œ ํŒฉํ„ฐ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•œ๋‹ค.
  3. ์กฐ๊ฑด๋ถ€ ๋กœ์ง ํ•จ์ˆ˜๋ฅผ ์Šˆํผํด๋ž˜์Šค๋กœ ์˜ฎ๊ธด๋‹ค.
  4. ์„œ๋ธŒํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•œ๋‹ค. ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ์Šˆํผํด๋ž˜์Šค์˜ ์กฐ๊ฑด๋ถ€ ๋กœ์ง ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•œ๋‹ค. ์กฐ๊ฑด๋ถ€ ๋ฌธ์žฅ ์ค‘ ์„ ํƒ๋œ ์„œ๋ธŒํด๋ž˜์Šค์— ํ•ด๋‹นํ•˜๋Š” ์กฐ๊ฑด์ ˆ์„ ์„œ๋ธŒํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋กœ ๋ณต์‚ฌํ•œ ๋‹ค์Œ ์ ์ ˆํžˆ ์ˆ˜์ •ํ•œ๋‹ค.
  5. ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ฐ ์กฐ๊ฑด์ ˆ์„ ํ•ด๋‹น ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ๋ฉ”์„œ๋“œ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.
  6. ์Šˆํผํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์—๋Š” ๊ธฐ๋ณธ ๋™์ž‘ ๋ถ€๋ถ„๋งŒ ๋‚จ๊ธด๋‹ค. ํ˜น์€ ์Šˆํผํด๋ž˜์Šค๊ฐ€ ์ถ”์ƒ ํด๋ž˜์Šค์—ฌ์•ผ ํ•œ๋‹ค๋ฉด, ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”์ƒ์œผ๋กœ ์„ ์–ธํ•˜๊ฑฐ๋‚˜ ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ์„ ์•Œ๋ฆฌ๋Š” ์—๋Ÿฌ๋ฅผ ๋˜์ง„๋‹ค.

์ฝ”๋“œ

part.04-Replace_Conditional_With_Polymorphism

๋ฌธ๋ฒ•

some

some() ๋ฉ”์„œ๋“œ๋Š” ๋ฐฐ์—ด ์•ˆ์˜ ์–ด๋–ค ์š”์†Œ๋ผ๋„ ์ฃผ์–ด์ง„ ํŒ๋ณ„ ํ•จ์ˆ˜๋ฅผ ํ†ต๊ณผํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜์—ฌ true, false ๋ฐ˜ํ™˜

const array = [1, 3];
// checks whether an element is even
const even = (element) => element % 2 === 0;

console.log(array.some(even));
// expected output: true

Math.max

์ž…๋ ฅ๊ฐ’์œผ๋กœ ๋ฐ›์€ 0๊ฐœ ์ด์ƒ์˜ ์ˆซ์ž ์ค‘ ๊ฐ€์žฅ ํฐ ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜

Math.max(10, 20);   //  20
Math.max(-10, -20); // -10
Math.max(-10, 20);  //  20

โฌ† back to top

INTRODUCE SPECIAL CASE

10.5 ํŠน์ด ์ผ€์ด์Šค ์ถ”๊ฐ€ํ•˜๊ธฐ

if (aCustomer === '๋ฏธํ™•์ธ ๊ณ ๊ฐ') customerName = '๊ฑฐ์ฃผ์ž'
class UnknownCustomer {
  get name() { return '๊ฑฐ์ฃผ์ž' }
}

๋ฐฐ๊ฒฝ(Motivation)

์™œํ•˜๋Š”๊ฐ€?

  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ํŠน์ • ๊ฐ’์„ ํ™•์ธํ•œ ํ›„ ๋˜‘๊ฐ™์€ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์—ฌ์„œ ํšจ์œจ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด
  • ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์˜ ๊ณตํ†ต ๋™์ž‘์„ ์š”์†Œ ํ•˜๋‚˜์— ๋ชจ์•„์„œ ์‚ฌ์šฉํ•˜๋Š” ํŠน์ด ์ผ€์ด์Šค ํŒจํ„ด์ด ์žˆ๋Š”๋ฐ, ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ํŠน์ • ๊ฐ’์„ ํ™•์ธํ•œ ํ›„ ๋˜‘๊ฐ™์€ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์ ์šฉํ•˜๋ฉด ์ข‹์€ ๋งค์ปค๋‹ˆ์ฆ˜์ด๋‹ค.์ด ํŒจํ„ด์„ ํ™œ์šฉํ•˜๋ฉด ํŠน์ด ์ผ€์ด์Šค๋ฅผ ๋‹จ์ˆœํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

์ ˆ์ฐจ

  1. ์ปจํ…Œ์ด๋„ˆ์— ํŠน์ด ์ผ€์ด์Šค์ธ์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ , false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•จ
  2. ํŠน์ด ์ผ€์ด์Šค ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค. ์ด ๊ฐ์ฒด๋Š” ํŠน์ด ์ผ€์ด์Šค์ธ์ง€๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ์†์„ฑ๋งŒ ํฌํ•จํ•˜์—ฌ, ์ด ์†์„ฑ์€ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•œ๋‹ค.
  3. ํด๋ผ์ด์–ธํŠธ์—์„œ ํŠน์ด ์ผ€์ด์Šค์ธ์ง€๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•œ๋‹ค. ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ’์„ ์ง์ ‘ ๋น„๊ตํ•˜๋Š” ๋Œ€์‹  ๋ฐฉ๊ธˆ ์ถ”์ถœํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ณ ์นœ๋‹ค.
  4. ์ฝ”๋“œ์— ์ƒˆ๋กœ์šด ํŠน์ด ์ผ€์ด์Šค ๋Œ€์ƒ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ๋ฐ›๊ฑฐ๋‚˜ ๋ณ€ํ™˜ ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๋ฉด ๋œ๋‹ค.
  5. ํŠน์ด ์ผ€์ด์Šค๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ ์ˆ˜์ •ํ•˜์—ฌ ํŠน์ด ์ผ€์ด์Šค ๊ฐ์ฒด์˜ ์†์„ฑ์œผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค.
  6. ํ…Œ์ŠคํŠธํ•œ๋‹ค.
  7. '์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ํด๋ž˜์Šค๋กœ ๋ฌถ๊ธฐ(6.9)'๋‚˜ '์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ๋ณ€ํ™˜ ํ•จ์ˆ˜๋กœ ๋ฌถ๊ธฐ(6.10)'๋ฅผ ์ ์šฉํ•˜์—ฌ, ํŠน์ด ์ผ€์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณตํ†ต ๋™์ž‘์„ ์ƒˆ๋กœ์šด ์š”์†Œ๋กœ ์˜ฎ๊ธด๋‹ค.
  8. ์•„์ง๋„ ํŠน์ด ์ผ€์ด์Šค ๊ฒ€์‚ฌ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๊ณณ์ด ๋‚จ์•„ ์žˆ๋‹ค๋ฉด ๊ฒ€์‚ฌ 'ํ•จ์ˆ˜๋ฅผ ์ธ๋ผ์ธ(6.2)'ํ•œ๋‹ค.

์ฝ”๋“œ

part.05-Introduce_Special_Case

โฌ† back to top

INTRODUCE ASSERTION

10.6 ์–ด์„œ์…˜ ์ถ”๊ฐ€ํ•˜๊ธฐ

if (this.discountRate)
  base = base - (this.discountRate * base)
assert(this.discountRate >= 0);
if (this.discountRate)
  base = base - (this.discountRate * base)

๋ฐฐ๊ฒฝ(Motivation)

ํŠน์ • ์กฐ๊ฑด์ด ์ฐธ์ผ ๋•Œ๋งŒ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ ์˜์—ญ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ์ฝ”๋“œ์— ํ•ญ์ƒ ๋ช…์‹œ์ ์œผ๋กœ ๊ธฐ์ˆ ๋˜์–ด ์žˆ์ง€ ์•Š์•„์„œ

์™œํ•˜๋Š”๊ฐ€?

์†Œํ†ต ์ธก๋ฉด์—์„œ ์–ด์„œ์…˜์€ ๋งค๋ ฅ์ ์ด๋‹ค.

์–ด์„œ์…˜(Assertion)
  • ์–ด์„œ์…˜์€ ํ•ญ์ƒ ์ฐธ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋Š” ์กฐ๊ฑด๋ถ€ ๋ฌธ์žฅ
  • ์–ด์„œ์…˜ ์‹คํŒจ๋Š” ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ๋Š” ์ ˆ๋Œ€ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์•„์•ผ ํ•จ
  • ์–ด์„œ์…˜ ์œ ๋ฌด๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ธฐ๋Šฅ ์ •์ƒ ๋™์ž‘์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ์ž‘์„ฑ๋˜์–ด์•ผ ํ•จ
  • ์–ด์„œ์…˜์˜ ์‹คํŒจ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ž˜๋ชป

์–ด์„œ์…˜์€ ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ค ์ƒํƒœ์ž„์„ ๊ฐ€์ •ํ•œ ์ฑ„ ์‹คํ–‰๋˜๋Š”์ง€๋ฅผ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ํ›Œ๋ฅญํ•œ ์†Œํ†ต ๋„๊ตฌ์ธ ๊ฒƒ์ด๋‹ค. ๋””๋ฒ„๊น…ํ•˜๊ธฐ๋„ ํŽธํ•˜๊ณ  ์ด๋Ÿฐ ์†Œํ†ต ์ˆ˜๋‹จ์œผ๋กœ์„œ์˜ ๊ฐ€์น˜๋„ ์žˆ์–ด์„œ, ๋‚˜๋Š” ์ถ”์ ํ•˜๋˜ ๋ฒ„๊ทธ๋ฅผ ์žก์€ ๋’ค์—๋„ ์–ด์„œ์…˜์„ ์ฝ”๋“œ์— ๋‚จ๊ฒจ๋‘๊ณค ํ•œ๋‹ค.

์ ˆ์ฐจ

  1. ์ฐธ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋Š” ์กฐ๊ฑด์ด ๋ณด์ด๋ฉด ๊ทธ ์กฐ๊ฑด์„ ๋ช…์‹œํ•˜๋Š” ์–ด์„œ์…˜์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

์ฝ”๋“œ

part.06-Introduce_Assertion

โฌ† back to top

Replace Control Flag with Break

10.7 ์ œ์–ด ํ”Œ๋ž˜๊ทธ๋ฅผ ํƒˆ์ถœ๋ฌธ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ

for (const p of people) {
  if (!found) {
    if (p === '์กฐ์ปค') {
      sendAlert();
      found = true;
    }
  }
}
for (const p of people) {
  if (p === '์กฐ์ปค') {
    sendAlert();
    break;
  }
}

๋ฐฐ๊ฒฝ(Motivation)

์ œ์–ด ํ”Œ๋ž˜๊ทธ๋ž€ ์ฝ”๋“œ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งํ•˜๋ฉฐ, ์–ด๋”˜๊ฐ€์—์„œ ๊ฐ’์„ ๊ณ„์‚ฐํ•ด ์ œ์–ด ํ”Œ๋ž˜๊ทธ์— ์„ค์ •ํ•œ ํ›„ ๋‹ค๋ฅธ ์–ด๋”˜๊ฐ€์˜ ์กฐ๊ฑด๋ฌธ์—์„œ ๊ฒ€์‚ฌํ•˜๋Š” ํ˜•ํƒœ๋กœ ์“ฐ์ธ๋‹ค. ๋ฆฌํŒฉํ„ฐ๋ง์œผ๋กœ ์ถฉ๋ถ„ํžˆ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Œ์—๋„ ๋ณต์žกํ•˜๊ฒŒ ์ž‘์„ฑ๋œ ์ฝ”๋“œ์—์„œ ํ”ํžˆ ๋‚˜ํƒ€๋‚œ๋‹ค.

๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ๋Š” ์ œ์–ด ๋ณ€์ˆ˜๋ฅผ ํ•ญ์ƒ ์•…์ทจ๋กœ ๋ณธ๋‹ค.

์™œํ•˜๋Š”๊ฐ€?

์ œ์–ด ๋ณ€์ˆ˜ ๋Œ€์‹  break, return์„ ์‚ฌ์šฉํ•ด ๊ตฌ๋ฌธ์„ ๊ฐ„์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด

์ ˆ์ฐจ

  1. ์ œ์–ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ• ์ง€๋ฅผ ๊ณ ๋ คํ•œ๋‹ค.
  2. ์ œ์–ดํ”Œ๋ž˜๊ทธ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ์ฝ”๋“œ ๊ฐ๊ฐ์„ ์ ์ ˆํ•œ ์ œ์–ด๋ฌธ์œผ๋กœ ๋ฐ”๊พผ๋‹ค. ํ•˜๋‚˜ ๋ฐ”๊ฟ€ ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธํ•œ๋‹ค.
  3. ๋ชจ๋‘ ์ˆ˜์ •ํ–ˆ๋‹ค๋ฉด ์ œ์–ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

๋ฌธ๋ฒ•

some๊ณผ includes๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ค„์ž„

for (const p of people) {
  if (p === 'joker') {
    return sendAlert();
  }
  if (p === 'ham') {
    return sendAlert();
  }
}
if (people.some(p => ['joker', 'ham'].includes(p))) return sendAlert();

part.07-Replace_Control_Flag_with_Break

โฌ† back to top