5 minute read

๋ฆฌํŒฉํ„ฐ๋ง

์ถœ์ฒ˜: ๋ฆฌํŒฉํ„ฐ๋ง 2ํŒ, ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ

07 ์บก์Šํ™”

7.1 ๋ ˆ์ฝ”๋“œ ์บก์Šํ™”ํ•˜๊ธฐ

  • 1ํŒ์—์„œ์˜ ์ด๋ฆ„: ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋กœ ์ „ํ™˜
organization = { name: "์• ํฌ๋ฏธ ๊ตฌ์Šค๋ฒ ๋ฆฌ", country: "GB" };
class Organization {
  constructor(data) {
    this._name = data.name;
    this._country = data.country;
  }
  get name() {
    return this._name;
  }
  set name(arg) {
    this._name = arg;
  }
  get country() {
    return this._country;
  }
  set country(arg) {
    this._country = arg;
  }
}

๋ฐฐ๊ฒฝ

๋ ˆ์ฝ”๋“œ๋Š” ์—ฐ๊ด€๋œ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ง๊ด€์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ์–ด์„œ ๊ฐ๊ฐ์„ ๋”ฐ๋กœ ์ทจ๊ธ‰ํ•  ๋•Œ๋ณด๋‹ค ํ›จ์”ฌ ์˜๋ฏธ ์žˆ๋Š” ๋‹จ์œ„๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ๋ ˆ์ฝ”๋“œ๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๊ณ„์‚ฐํ•ด์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ’๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฐ’์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•ด ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ์ ์ด ๋ฒˆ๊ฑฐ๋กญ๋‹ค. ์ด ๋•Œ๋ฌธ์— ๊ฐ€๋ณ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์šฉ๋„๋กœ๋Š” ๋ ˆ์ฝ”๋“œ๋ณด๋‹ค ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ ˆ์ฐจ

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

7.2 ์ปฌ๋ ‰์…˜ ์บก์Šํ™”ํ•˜๊ธฐ

class Person {
  get courses() {
    return this._courses;
  }
  set courses(aList) {
    this._courses = aList;
  }
}
class Person {
  get courses() {return this._courses.slice();}
  addCourse(aCourse) {...}
  removeCourse(aCourse) {...}
}

๋ฐฐ๊ฒฝ

์ปฌ๋ ‰์…˜์„ ๋‹ค๋ฃฐ ๋•Œ ์ปฌ๋ ‰์…˜์„ ๊ฐ์‹ผ ํด๋ž˜์Šค์— add()์™€ remove()๋ผ๋Š” ์ด๋ฆ„์˜ ์ปฌ๋ ‰์…˜ ๋ณ€๊ฒฝ์ž ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ญ์ƒ ์ปฌ๋ ‰์…˜์„ ์†Œ์œ ํ•œ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์›์†Œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋„๋ก ํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ์„ ํ•˜๋ฉด์„œ ์ปฌ๋ ‰์…˜ ๋ณ€๊ฒฝ ๋ฐฉ์‹๋„ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ ˆ์ฐจ

  1. ์•„์ง ์ปฌ๋ ‰์…˜์„ ์บก์Šํ™”ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ณ€์ˆ˜ ์บก์Šํ™”ํ•˜๊ธฐ๋ถ€ํ„ฐ ํ•œ๋‹ค.
  2. ์ปฌ๋ ‰์…˜์— ์›์†Œ๋ฅผ ์ถ”๊ฐ€/์ œ๊ฑฐํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  3. ์ •์  ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  4. ์ปฌ๋ ‰์…˜์„ ์ฐธ์กฐํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ชจ๋‘ ์ฐพ๋Š”๋‹ค. ์ปฌ๋ ‰์…˜์˜ ๋ณ€๊ฒฝ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋ชจ๋‘ ์•ž์—์„œ ์ถ”๊ฐ€ํ•œ ์ถ”๊ฐ€/์ œ๊ฑฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์ˆ˜์ •ํ•œ๋‹ค. ํ•˜๋‚˜์”ฉ ์ˆ˜์ •ํ•  ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธํ•œ๋‹ค.
  5. ์ปฌ๋ ‰์…˜ ๊ฒŒํ„ฐ๋ฅผ ์ˆ˜์ •ํ•ด์„œ ์›๋ณธ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋Š” ์ฝ๊ธฐ์ „์šฉ ํ”„๋ฝ์‹œ๋‚˜ ๋ณต์ œ๋ณธ์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•œ๋‹ค.
  6. ํ…Œ์ŠคํŠธํ•œ๋‹ค.

7.3 ๊ธฐ๋ณธํ˜•์„ ๊ฐ์ฒด๋กœ ๋ฐ”๊พธ๊ธฐ

Replace Primitive with Object

  • 1ํŒ์—์„œ์˜ ์ด๋ฆ„
    • ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๊ฐ์ฒด๋กœ ์ „ํ™˜
    • ๋ถ„๋ฅ˜ ๋ถ€ํ˜ธ๋ฅผ ํด๋ž˜์Šค๋กœ ์ „ํ™˜
// before
orders.filter((o) => "high" === o.priority || "rush" === o.priority);
// after
orders.filter((o) => o.priority.higherThan(new Priority("normal")));

๋ฐฐ๊ฒฝ

๊ฐ„๋‹จํ–ˆ๋˜ ์ •๋ณด๋“ค์ด ๋ณต์žกํ•˜๊ฒŒ ๋ณ€ํ•  ๋•Œ, ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์ „์šฉ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค.

์ ˆ์ฐจ

  1. ์•„์ง ๋ณ€์ˆ˜๋ฅผ ์บก์Šˆ๋กœํ•˜ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์บก์Šํ™”ํ•œ๋‹ค.
  2. ๋‹จ์ˆœํ•œ ๊ฐ’ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค. ์ƒ์„ฑ์ž๋Š” ๊ธฐ์กด ๊ฐ’์„ ์ธ์ˆ˜๋กœ ๋ฐ›์•„์„œ ์ €์žฅํ•˜๊ณ , ์ด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒŒํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  3. ์ •์  ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  4. ๊ฐ’ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ํ•„๋“œ์— ์ €์žฅํ•˜๋„๋ก ์„ธํ„ฐ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค. ์ด๋ฏธ ์žˆ๋‹ค๋ฉด ํ•„๋“œ์˜ ํƒ€์ž…์„ ์ ์ ˆํžˆ ๋ณ€๊ฒฝํ•œ๋‹ค.
  5. ์ƒˆ๋กœ ๋งŒ๋“  ํด๋ž˜์Šค์˜ ๊ฒŒํ„ฐ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ฒŒํ„ฐ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.
  6. ํ…Œ์ŠคํŠธํ•œ๋‹ค.
  7. ํ•จ์ˆ˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋ฉด ์›๋ณธ ์ ‘๊ทผ์ž์˜ ๋™์ž‘์„ ๋” ์ž˜ ๋“œ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒ€ํ† ํ•œ๋‹ค.

7.4 ์ž„์‹œ ๋ณ€์ˆ˜๋ฅผ ์งˆ์˜ ํ•จ์ˆ˜๋กœ ๋ฐ”๊พธ๊ธฐ

Replace Temp with Query

// before
const basePrice = this._quantity * this._itemPrice;
if (basePrice > 1000) {
  return basePrice * 0.95;
} else {
  return basePrice * 0.98;
}
// after
get basePrice() {this._quantity * this._itemPrice;}
//...
if (this.basePrice > 1000) {
  return this.basePrice * 0.95;
} else {
  return this.basePrice * 0.98;
}

๋ฐฐ๊ฒฝ

์ž„์‹œ ๋ณ€์ˆ˜๊ฐ€ ์œ ์šฉํ•˜์ง€๋งŒ ์•„์˜ˆ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ๋‚˜์„ ๋•Œ๊ฐ€ ๋งŽ๋‹ค. ๋น„์Šทํ•œ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค ์ฝ”๋“œ ์ค‘๋ณต์ด ์ค„์–ด๋“ ๋‹ค.

์ ˆ์ฐจ

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

7.5 ํด๋ž˜์Šค ์ถ”์ถœํ•˜๊ธฐ

Extract Class

  • ๋ฐ˜๋Œ€ ๋ฆฌํŒฉํ„ฐ๋ง: ํด๋ž˜์Šค ์ธ๋ผ์ธํ•˜๊ธฐ
// before
class Person {
  get officeAreaCode() {
    return this._officeAreaCode;
  }
  get offceNumber() {
    return this._officeNumber;
  }
}
// after
class Person {
  get officeAreaCode() {
    return this._telephoneNumber.areaCode;
  }
  get officeNumber() {
    return this._telephoneNumber.number;
  }
}
class TelephoneNumber {
  get areaCode() {
    return this._areaCode;
  }
  get number() {
    return this._number;
  }
}

๋ฐฐ๊ฒฝ

ํด๋ž˜์Šค๋Š” ๋ฐ˜๋“œ์‹œ ๋ช…ํ™•ํ•˜๊ฒŒ ์ถ”์ƒํ™”ํ•˜๊ณ  ์†Œ์ˆ˜์˜ ์ฃผ์–ด์ง„ ์—ญํ• ๋งŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. ๋ฉ”์„œ๋“œ์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ํด๋ž˜์Šค๋Š” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š์œผ๋‹ˆ ์ž˜ ์‚ดํŽด๋ณด๊ณ  ์ ์ ˆํžˆ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ ˆ์ฐจ

  1. ํด๋ž˜์Šค์˜ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•  ๋ฐฉ๋ฒ•์„ ์ •ํ•œ๋‹ค.
  2. ๋ถ„๋ฆฌ๋  ์—ญํ• ์„ ๋‹ด๋‹นํ•  ํด๋ž˜์Šค๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ ๋‹ค.
  3. ์›๋ž˜ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์—์„œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ•„๋“œ์— ์ €์žฅํ•ด๋‘”๋‹ค.
  4. ๋ถ„๋ฆฌ๋  ์—ญํ• ์— ํ•„์š”ํ•œ ํ•„๋“œ๋“ค์„ ์ƒˆ ํด๋ž˜์Šค๋กœ ์˜ฎ๊ธด๋‹ค. ํ•˜๋‚˜์”ฉ ์˜ฎ๊ธธ ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธํ•œ๋‹ค.
  5. ๋ฉ”์„œ๋“œ๋“ค๋„ ์ƒˆ ํด๋ž˜์Šค๋กœ ์˜ฎ๊ธด๋‹ค. ์ด๋•Œ ์ €์ˆ˜์ค€ ๋ฉ”์„œ๋“œ, ์ฆ‰ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋ณด๋‹ค๋Š” ํ˜ธ์ถœ์„ ๋‹นํ•˜๋Š” ์ผ์ด ๋งŽ์€ ๋ฉ”์„œ๋“œ๋ถ€ํ„ฐ ์˜ฎ๊ธด๋‹ค. ํ•˜๋‚˜์”ฉ ์˜ฎ๊ธธ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธํ•œ๋‹ค.
  6. ์–‘์ชฝ ํด๋ž˜์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ดํŽด๋ณด๋ฉด์„œ ๋ถˆํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ์ด๋ฆ„๋„ ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ๋ฐ”๊พผ๋‹ค.
  7. ์ƒˆ ํด๋ž˜์Šค๋ฅผ ์™ธ๋ถ€๋กœ ๋…ธ์ถœํ• ์ง€ ์ •ํ•œ๋‹ค. ๋…ธ์ถœํ•˜๋ ค๊ฑฐ๋“  ์ƒˆ ํด๋ž˜์Šค์— ์ฐธ์กฐ๋ฅผ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ๊ธฐ๋ฅผ ์ ์šฉํ• ์ง€ ๊ณ ๋ฏผํ•ด๋ณธ๋‹ค.

7.6 ํด๋ž˜์Šค ์ธ๋ผ์ธํ•˜๊ธฐ

Inline Class

  • ๋ฐ˜๋Œ€ ๋ฆฌํŒฉํ„ฐ๋ง: ํด๋ž˜์Šค ์ถ”์ถœํ•˜๊ธฐ
// before
class Person {
  get officeAreaCode() {
    return this._telephoneNumber.areaCode;
  }
  get officeNumber() {
    return this._telephoneNumber.number;
  }
}

class TelephoneNumber {
  get areaCode() {
    return this._areaCode;
  }
  get number() {
    return this._number;
  }
}
// after
class Person {
  get officeAreaCode() {
    return this._officeAreaCode;
  }
  get officeNumber() {
    return this._officeNumber;
  }
}

๋ฐฐ๊ฒฝ

ํด๋ž˜์Šค ์ธ๋ผ์ธํ•˜๊ธฐ๋Š” ํด๋ž˜์Šค ์ถ”์ถœํ•˜๊ธฐ๋ฅผ ๊ฑฐ๊พธ๋กœ ๋Œ๋ฆฌ๋Š” ๋ฆฌํŒฉํ„ฐ๋ง์ด๋‹ค. ๋” ์ด์ƒ ์ œ์—ญํ• ์„ ๋ชป ํ•ด์„œ ๊ทธ๋Œ€๋กœ ๋‘๋ฉด ์•ˆ ๋˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ธ๋ผ์ธ ํ•œ๋‹ค. ๋‘ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ์ง€๊ธˆ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ฐฐ๋ถ„ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋กœ ํด๋ž˜์Šค๋ฅผ ์ธ๋ผ์ธํ•œ๋‹ค. ํ•˜๋‚˜๋กœ ํ•ฉ์นœ ๋‹ค์Œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ถ”์ถœํ•˜๋Š” ๊ฒŒ ์‰ฌ์šธ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ ˆ์ฐจ

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

7.7 ์œ„์ž„ ์ˆจ๊ธฐ๊ธฐ

Hide Delegate

  • ๋ฐ˜๋Œ€ ๋ฆฌํŒฉํ„ฐ๋ง: ์ค‘๊ฐœ์ž ์ œ๊ฑฐํ•˜๊ธฐ
//before
manager = aPerson.department.manager;
// after
manager = aPerson.manager;

class Person {
  get manager() {
    return this.department.manager;
  }
}

๋ฐฐ๊ฒฝ

๋ชจ๋“ˆํ™” ์„ค๊ณ„๋ฅผ ์ œ๋Œ€๋กœ ํ•˜๋Š” ํ•ต์‹ฌ์€ ์บก์Šํ™”๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ์„ ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ๋Š” ์บก์Šํ™”ํ•œ ํ•„๋“œ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ฐฐ์šด๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ๊ฒฝํ—˜์ด ์Œ“์ด๋ฉด์„œ ์บก์Šํ™”์˜ ์—ญํ• ์ด ๊ทธ๋ณด๋‹ค ๋งŽ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊นจ๋‹ซ๋Š”๋‹ค.

์ ˆ์ฐจ

  1. ์œ„์ž„ ๊ฐ์ฒด์˜ ๊ฐ ๋ฉ”์„œ๋“œ์— ํ•ด๋‹นํ•˜๋Š” ์œ„์ž„ ๋ฉ”์„œ๋“œ๋ฅผ ์„œ๋ฒ„์— ์ƒ์„ฑํ•œ๋‹ค.
  2. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์œ„์ž„ ๊ฐ์ฒด ๋Œ€์‹  ์„œ๋ฒ„๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์ˆ˜์ •ํ•œ๋‹ค. ํ•˜๋‚˜์”ฉ ๋ฐ”๊ฟ€ ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธํ•œ๋‹ค.
  3. ๋ชจ๋‘ ์ˆ˜์ •ํ–ˆ๋‹ค๋ฉด, ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์œ„์ž„ ๊ฐ์ฒด๋ฅผ ์–ป๋Š” ์ ‘๊ทผ์ž๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
  4. ํ…Œ์ŠคํŠธํ•œ๋‹ค.

7.8 ์ค‘๊ฐœ์ž ์ œ๊ฑฐํ•˜๊ธฐ

Remove Middle Man

  • ๋ฐ˜๋Œ€ ๋ฆฌํŒฉํ„ฐ๋ง: ์œ„์ž„ ์ˆจ๊ธฐ๊ธฐ
// before
manager = aPerson.manager;
class Person {
  get manager() {
    return this.department.manager;
  }
}
// after
manager = aPerson.department.manager;

๋ฐฐ๊ฒฝ

์œ„์ž„ ์ˆจ๊ธฐ๊ธฐ๋ฅผ ํ•˜๋‹ค ๋ณด๋ฉด ๋‹จ์ˆœํžˆ ์ „๋‹ฌ๋งŒ ํ•˜๋Š” ์œ„์ž„ ๋ฉ”์„œ๋“œ๋“ค์ด ์ ์  ์„ฑ๊ฐ€์…”์ง„๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์„œ๋ฒ„ ํด๋ž˜์Šค๋Š” ๊ทธ์ € ์ค‘ใ„ฑ๊ฐœ์ž ์—ญํ•˜๋กœ์ „๋ฝํ•˜์—ฌ, ์ฐจ๋ผ๋ฆฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์œ„์ž„ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๊ฒŒ ๋‚˜์„ ์ˆ˜ ์žˆ๋‹ค.

์ ˆ์ฐจ

  1. ์œ„์ž„ ๊ฐ์ฒด๋ฅผ ์–ป๋Š” ๊ฒŒํ„ฐ๋ฅผ ๋งŒ๋“ ๋‹ค.
  2. ์œ„์ž„ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ชจ๋‘ ์ด ๊ฒŒํ„ฐ๋ฅผ ๊ฑฐ์น˜๋„๋ก ์ˆ˜์ •ํ•œ๋‹ค. ํ•˜๋‚˜์”ฉ ๋ฐ”๊ฟ€ ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธํ•œ๋‹ค.
  3. ๋ชจ๋‘ ์ˆ˜์ •ํ–ˆ๋‹ค๋ฉด ์œ„์ž„ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

7.9 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ต์ฒดํ•˜๊ธฐ

Substitute Algorithm

//before
function foundPerson(people) {
  for (let i = 0; i < people.length; i++) {
    if (people[i] === "Don") {
      return "Don";
    }
    if (people[i] === "John") {
      return "John";
    }
    if (people[i] === "Kent") {
      return "Kent";
    }
  }
  return "";
}
//after
function foundPerson(people) {
  const candidates = ["Don", "John", "Kent"];
  return people.find((p) => candidates.includes(p)) || "";
}

๋ฐฐ๊ฒฝ

๋” ๊ฐ„๋ช…ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ณ ์นœ๋‹ค.

์ ˆ์ฐจ

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