SlideShare a Scribd company logo
1 of 101
๋ฆฌํŒฉํ† ๋ง Tutorial

          SEEG
๋ชฉ์ฐจ
๏ฝ   ๋ฆฌํŒฉํ† ๋ง ๊ฐœ์š”
๏ฝ   ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ๋ƒ„์ƒˆ
    ๏ฝ   ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ƒ„์ƒˆ
    ๏ฝ   ์ด๋ฆ„
    ๏ฝ   ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ
    ๏ฝ   ์ค‘๋ณต
    ๏ฝ   ์กฐ๊ฑด ๋กœ์ง


๏ฝ   ํด๋ž˜์Šค ์‚ฌ์ด์˜ ๋ƒ„์ƒˆ
    ๏ฝ   ๋ฐ์ดํ„ฐ
    ๏ฝ   ์ƒ์†
    ๏ฝ   ์ฑ…์ž„
    ๏ฝ   ๋ณ€๊ฒฝ์ˆ˜์šฉํ•˜๊ธฐ
    ๏ฝ   ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋ž˜์Šค


๏ฝ   ํ”„๋กœ๊ทธ๋žจ ๋ฆฌํŒฉํ† ๋ง
๋ฆฌํŒฉํ† ๋ง ๊ฐœ์š”




3   Confidential   12/13/2011
๋ฆฌํŒฉํ† ๋ง ๋ฐฐ๊ฒฝ
: ๋ฆฌํŒฉํ† ๋ง ์ด๋ž€?

 Bad Code           Good Code




             ๋ฆฌํŒฉํ† ๋ง
๋ฆฌํŒฉํ† ๋ง ๋ฐฐ๊ฒฝ:
: Bad Code๊ฐ€ ์•ผ๊ธฐ์‹œํ‚ค๋Š” ๋ฌธ์ œ์ 




                            Broken Window Theory




  ๋‚˜์œ์ฝ”๋“œ์— ์˜ํ•œ ์ƒ์‚ฐ์„ฑ ์ €ํ•˜๋Š” ๊ณ„์† ์•…ํ™”๋จ
๋ฆฌํŒฉํ† ๋ง ์ •์˜

     ๏ฝ   ๋ช…์‚ฌํ˜• ์ •์˜
         ๏ฝ   โ€œ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ณ , ์ ์€ ๋น„์šฉ์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฒ‰์œผ๋กœ ๋ณด์ด๋Š” ๋™์ž‘์˜ ๋ณ€ํ™” ์—†์ด ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ณ€
             ๊ฒฝํ•˜๋Š” ๊ฒƒโ€

     ๏ฝ   ๋™์‚ฌํ˜• ์ •์˜
         ๏ฝ   โ€œ์ผ๋ จ์˜ ๋ฆฌํŒฉํ† ๋ง์„ ์ ์šฉํ•˜์—ฌ ๊ฒ‰์œผ๋กœ ๋ณด์ด๋Š” ๋™์ž‘์˜ ๋ณ€ํ™” ์—†์ด ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊พผ๋‹ค.โ€

     ๏ฝ   ๋‹ค์Œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋™์ž‘์˜ ๋ณ€๊ฒฝ ์—ฌ๋ถ€ ๊ฒ€์ฆ
         ๏ฝ   ํ…Œ์ŠคํŒ…
         ๏ฝ   ์ตœ๋Œ€ํ•œ ๊ฐœ๋ฐœ Tool์˜ ์ง€์› ๊ธฐ๋Šฅ ์‚ฌ์šฉ
         ๏ฝ   ์•„์ฃผ ์กฐ์‹ฌํžˆ ์ง„ํ–‰

     ๏ฝ   Refactoring์˜ ์˜ˆ


public int getCharge(int quantity) {                           public int getCharge(int quantity) {
   int charge = 0;                                                 int charge = 0;
   Date now = new Date();                                          Date now = new Date();

     // ํ˜„์žฌ Summerํƒ€์ž„ ๊ธฐ๊ฐ„์ด๋ผ๋ฉด                                          if (isSummerTime(now)) {
     if (now.before(SUMMER_START)|| now.after(SUMMER_END)) {         charge = quantity * WINTER_RATE +
       charge = quantity * WINTER_RATE +                                           WINTER_SERVICEC_CHARGE;
                     WINTER_SERVICEC_CHARGE;                       } else {
     } else {                                                        charge = quantity * SUMMER_RATE;
       charge = quantity * SUMMER_RATE;                            }
     }                                                             return charge;
     return charge                                             }
 }
                                                               private boolean isSummerTime(Date now) {
                                                                  return now.before(SUMMER_START) || now.after(SUMMER_END);
                                                               }
๋ฆฌํŒฉํ† ๋ง ์›๋ฆฌ
: ์™œ ๋ฆฌํŒฉํ† ๋ง์„ ํ•ด์•ผ ํ•˜๋Š”๊ฐ€?
๏ฝ   ํ”„๋กœ๊ทธ๋žจ์„ ๋นจ๋ฆฌ ์ž‘์„ฑํ•˜๋„๋ก ๋„์™€์คŒ

๏ฝ   ์–ด๋–ป๊ฒŒ?
    ๏ฝ   ๋ฆฌํŒฉํ† ๋ง์€ ๋””์ž์ธ์„ ๊ฐœ์„ ์‹œ์ผœ ์คŒ

๏ฝ   ๋””์ž์ธ์ด ๋‚˜์œ ์ฝ”๋“œ๋Š”?
    ๏ฝ   ๊ฐ™์€ ์ž‘์—…์„ ์œ„ํ•ด ๋” ๋งŽ์€ ์ฝ”๋“œ ์‚ฌ์šฉ
    ๏ฝ   ์ค‘๋ณต์ด ๋งŽ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›€
    ๏ฝ   ์ˆ˜์ • ์‹œ ์–ด๋ ค์›€์œผ๋กœ ๋‚˜ํƒ€๋‚จ

๏ฝ   ๋ฆฌํŒฉํ† ๋ง์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ฌ
    ๏ฝ   ๋ฆฌํŒฉํ† ๋ง๋œ ์ฝ”๋“œ๋Š” ์ˆจ๊ฒจ์ง„ ์‚ฌ์šฉ์ž์ธ ์œ ์ง€๋ณด์ˆ˜์ž์˜ ์ดํ•ด๋ฅผ ๋„์›€
    ๏ฝ   ๋‚ฎ์„  ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋ฆฌํŒฉํ† ๋ง ํ•˜๋ฉด์„œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ธฐ๋„ ํ•จ
๋ฆฌํŒฉํ† ๋ง ์›๋ฆฌ
: ์–ธ์ œ ๋ฆฌํŒฉํ† ๋ง์„ ํ•ด์•ผ ํ•˜๋Š”๊ฐ€?
๏ฝ   ํ‹ˆํ‹ˆ์ด ๊ณ„์†
    ๏ฝ   ๋ฆฌํŒฉํ† ๋ง ์ž์ฒด๊ฐ€ ๋ชฉ์ ์ด ์•„๋‹ˆ๋ผ, ๋‹ค๋ฅธ ๊ฒƒ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌํŒฉํ† ๋ง
        ์„ ํ•˜๋Š” ๊ฒƒ์ด๊ณ , ๋ฆฌํŒฉํ† ๋ง์€ ๊ทธ ๋‹ค๋ฅธ ๊ฒƒ์„ ํ•˜๋Š”๋ฐ ๋„์›€์„ ์ค€๋‹ค.

๏ฝ   ์‚ผ์ง„ ๊ทœ์น™
    ๏ฝ   ์„ธ ๋ฒˆ์งธ๋กœ ๋น„์Šทํ•œ ๊ฒƒ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฆฌํŒฉํ† ๋ง์„ ํ•œ๋‹ค

๏ฝ   ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ, ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ
    ๏ฝ   ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด์„œ

๏ฝ   ์ฝ”๋“œ ๊ฒ€ํ†  ์‹œ
    ๏ฝ   ๊ณ ์ˆ˜์ค€์˜ ์˜๊ฒฌ์„ ์–ป์„ ์ˆ˜ ์žˆ์Œ
    ๏ฝ   ์ค€๋น„๊ฐ€ ๋งŽ์ด ํ•„์š”ํ•จ
๋ฆฌํŒฉํ† ๋ง ์›๋ฆฌ
    : ๋‘ ๊ฐœ์˜ ๋ชจ์ž




           ๊ธฐ๋Šฅ ์ถ”๊ฐ€                      ๋ฆฌํŒฉํ† ๋ง

๏‚ง    ๊ธฐ์กด ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€   ๏‚ง   ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์—†์ด ์ฝ”๋“œ ๊ตฌ์กฐ ์ˆ˜์ •

๏‚ง    ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€                  ๏‚ง   ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„์•ผ ํ•จ

๏‚ง    ํ…Œ์ŠคํŠธ ์ •์ƒ ๋™์ž‘ ํ™•์ธ            ๏‚ง   ํ…Œ์ŠคํŠธ ์ •์ƒ ๋™์ž‘ ํ™•์ธ




      ๊ฐœ๋ฐœํ•  ๋•Œ์—๋Š” ๋ชจ์ž๋ฅผ ์ž์ฃผ ๋ฐ”๊ฟ” ์“ฐ๊ณ (10๋ถ„~30๋ถ„),
                     ํ•œ ์‹œ์ ์—๋Š” ํ•˜๋‚˜์˜ ๋ชจ์ž๋งŒ ์จ์•ผ ํ•œ๋‹ค.
๋ฆฌํŒฉํ† ๋ง ์›๋ฆฌ
: ๋ฆฌํŒฉํ† ๋ง์„ ํ•  ๋•Œ์˜ ๋ฌธ์ œ
๏ฝ   ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์™€ ์—ฐ๊ด€๋œ ์ฝ”๋“œ์˜ ๋ฆฌํŒฉํ† ๋ง

๏ฝ   ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ณ€๊ฒฝ
    ๏ฝ   Publish ๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ด๋ฆ„ ๋ฐ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ๋ฆฌํŒฉํ† ๋ง
        ๏ฝ   Ex) Android์˜ Service.onStart() ๋ฉ”์†Œ๋“œ
        ๏ฝ   ์ƒˆ๋กœ์šด I/F๋ฅผ ๋งŒ๋“ค๊ณ  Delegation ์‚ฌ์šฉ
        ๏ฝ   ์˜ˆ๋ฐฉ์ฑ… : ์• ๋งคํ•œ ๋ฉ”์†Œ๋“œ๋Š” API์— ๋„ฃ์ง€ ๋ง์ž
    ๏ฝ   Publish ๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ Throw์ ˆ์˜ ๋ณ€๊ฒฝ
        ๏ฝ   ์ด ๊ฒฝ์šฐ Delegation ์‚ฌ์šฉ ๋ถˆ๊ฐ€
        ๏ฝ   ์˜ˆ๋ฐฉ์ฑ… : Super Exception ์‚ฌ์šฉ

๏ฝ   ๋ฆฌํŒฉํ† ๋ง์ด ์–ด๋ ค์šด ๋””์ž์ธ ๋ณ€๊ฒฝ
    ๏ฝ   ๋””์ž์ธ์— ์‹ค์ˆ˜๊ฐ€ ์žˆ์–ด ๋งˆ์Œ๋Œ€๋กœ ๋ฆฌํŒฉํ† ๋ง ํ•  ์ˆ˜ ์—†์„ ๋•Œ
    ๏ฝ   ์–ด๋–ค ๋””์ž์ธ ๊ฒฐ์ • ์‚ฌํ•ญ์ด ๋„ˆ๋ฌด ์ค‘์š”ํ•ด์„œ ๋ฆฌํŒฉํ† ๋ง์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
        ๏ฝ   ๋ณด์•ˆ ๋ฌธ์ œ, ํผํฌ๋จผ์Šค ๋ฌธ์ œ

๏ฝ   ์–ธ์ œ ๋ฆฌํŒฉํ† ๋ง์„ ํ•˜์ง€ ๋ง์•„์•ผ ํ•˜๋Š”๊ฐ€?
    ๏ฝ   ์ฝ”๋“œ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ž‘์„ฑ ํ•˜๋Š” ๊ฒŒ ๋‚˜์„ ์ •๋„๋กœ ์—‰๋ง์ธ ๊ฒฝ์šฐ
    ๏ฝ   ํ˜„์žฌ์˜ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ
    ๏ฝ   ๋งˆ๊ฐ์ผ์— ๊ฐ€๊นŒ์šธ ๊ฒฝ์šฐ
๋ฆฌํŒฉํ† ๋ง ์›๋ฆฌ
: ์‚ฌ์ „ ๋””์ž์ธ๊ณผ ๋ฆฌํŒฉํ† ๋ง์˜ ํšจ์šฉ์„ฑ ๊ด€๊ณ„
๏ฝ   โ€œ๋””์ž์ธ์œผ๋กœ๋Š” ์ƒ๊ฐ์„ ์•„์ฃผ ๋นจ๋ฆฌ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ ์ƒ๊ฐ์—๋Š” ์—ฌ
    ๊ธฐ์ €๊ธฐ ์ž‘์€ ๊ตฌ๋ฉ์ด ๋šซ๋ ค์žˆ๋‹ค.โ€
    ๏ฝ   โ€œWith design I can think very fast, but my thinking is full of little
        holesโ€ โ€“ Alistair Cockburn

๏ฝ   ๋ฆฌํŒฉํ† ๋ง์— ์˜ํ•ด ์‚ฌ์ „ ๋””์ž์ธ์˜ Role์ด ๋ณ€๊ฒฝ๋จ
    ๏ฝ   ์™„๋ฒฝํ•œ ์‚ฌ์ „ ๋””์ž์ธ์ด ์•„๋‹Œ ์ ์ ˆํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜๋Š” ๋””์ž์ธ์ด๋ฉด
        ์ถฉ๋ถ„
        ๏ฝ   ๋ฆฌํŒฉํ† ๋ง์„ ํ†ตํ•ด ๋ณ€๊ฒฝ์— ๋งŽ์€ ๋น„์šฉ์ด ๋“ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ
    ๏ฝ   ๋”ฐ๋ผ์„œ, ๋””์ž์ธ์ด ๋‹จ์ˆœํ™” ๋จ

๏ฝ   ๋””์ž์ธ ์ค‘์‹ฌ์˜ ๋‹จ์ 
    ๏ฝ   ์„ค๊ณ„ ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค.
    ๏ฝ   ๋ณต์žกํ•ด ์ง„๋‹ค.
    ๏ฝ   ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋งŽ์ด ๋“ ๋‹ค.
        ๏ฝ   ์ค‘๋ณต์— ์˜ํ•œ๊ฒŒ ์•„๋‹Œ Complexity ๋•Œ๋ฌธ
๋ฆฌํŒฉํ† ๋ง ์›๋ฆฌ
: ๋ฆฌํŒฉํ† ๋ง๊ณผ ํผํฌ๋จผ์Šค
๏ฝ   ๋ฆฌํŒฉํ† ๋ง์€ ์žฅ๊ธฐ์ ์œผ๋กœ ์ตœ์ ํ™” ๋‹จ๊ณ„์— ์†Œํ”„ํŠธ์›จ์–ด์˜
    ํŠœ๋‹์„ ๋•๋Š”๋‹ค.
    ๏ฝ   ๋ฆฌํŒฉํ† ๋ง์„ ํ†ตํ•ด ํผํฌ๋จผ์Šค ํŠœ๋‹์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„
        ์–ป์„ ์ˆ˜ ์žˆ์Œ.
    ๏ฝ   ํ”„๋กœ๊ทธ๋žจ์ด ์ž˜ ๋ถ„ํ•ด๋˜์–ด ์žˆ์œผ๋ฉด, ํŠœ๋‹์„ ์œ„ํ•œ ๋ถ„์„ ์‹œ ์ข€
        ๋” ์„ธ๋ฐ€ํ•œ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
๋ƒ„์ƒˆ
๏ฝ   ๋ƒ„์ƒˆ(์ฝ”๋“œ๋ƒ„์ƒˆ)๋Š” ์ฝ”๋“œ์— ์ž ์žฌ๋œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ  ํ‘œ
    ์‹œ
๏ฝ   ๋ฆฌํŒฉํ† ๋ง์„ ํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์  ํ‘œ์‹œ

๏ฝ   ๋Œ€ํ‘œ์  ๋ƒ„์ƒˆ
    ๏ฝ   ์ค‘๋ณต์ฝ”๋“œ
    ๏ฝ   ๋ถ€์ ์ ˆํ•œ ์ด๋ฆ„
    ๏ฝ   ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š•์‹ฌ
    ๏ฝ   ๋ถ€์ ์ ˆํ•œ ์นœ๋ฐ€
    ๏ฝ   ์ฃผ์„
    ๏ฝ   ๊ธด ๋ฉ”์†Œ๋“œ
    ๏ฝ   ๊ธด ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ
    ๏ฝ   Switch๋ฌธ
๋ƒ„์ƒˆ
: ์ค‘๋ณต ์ฝ”๋“œ
๏ฝ   ๊ฐ€์žฅ ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ๋ƒ„์ƒˆ
๏ฝ   ๋‘ ๊ฐ€์ง€ ์ค‘๋ณต์ด ์žˆ์Œ
    ๏ฝ   Obvious ์ค‘๋ณต
        ๏ฝ   ๋ณดํ†ต Copy & Paste์— ์˜ํ•ด ๋ฐœ์ƒ
    ๏ฝ   Unobvious ์ค‘๋ณต
        ๏ฝ   ๊ณ„์ธต๊ตฌ์กฐ์˜ ๋ณ‘๋ ฌ์  ๊ตฌํ˜„
        ๏ฝ   ๋น„์Šทํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜(ex, ๋ฌธ์ž์—ด, ๋„๋ฉ”์ธ ํŠนํ™” ๋กœ์ง)

๏ฝ   ํ•ด๊ฒฐ์ฑ…
    ๏ฝ   ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์—์„œ ์ค‘๋ณต
        ๏ฝ   ExtractMethod
    ๏ฝ   ๋‘ ํ˜•์ œ ํด๋ž˜์Šค์—์„œ ์ค‘๋ณต
        ๏ฝ   ExtractMethod -> Pull Up Field or Pull Up Method -> Form
            Template Method
๋ƒ„์ƒˆ
: ๋ถ€์ ์ ˆํ•œ ์ด๋ฆ„
๏ฝ   ์ž˜๋ชป๋œ ์ด๋ฆ„์€ ์ฝ”๋“œ์˜ ์ดํ•ด๋ฅผ ๋ฐฉํ•ดํ•œ๋‹ค.
๏ฝ   โ€œPeople often make assumptions based on the object
    names aloneโ€ โ€“ Word Cunningham

๏ฝ   ํ•ด๊ฒฐ์ฑ…
    ๏ฝ   Rename Method
    ๏ฝ   Rename Field
    ๏ฝ   Rename Constants

๏ฝ   Tip !
    ๏ฝ   ์ผ๊ด€์„ฑ ์—†๋Š” ์ƒ์„ธ์ด๋ฆ„ ๋ณด๋‹ค๋Š” ์ผ๊ด€์„ฑ ์žˆ๋Š” ๊ด‘์˜์˜ ์ด๋ฆ„์ด ์ ํ•ฉ
        ๏ฝ   add, register, put, create -> add
    ๏ฝ   ์ผ๊ด€์„ฑ ์žˆ๋Š” ์ด๋ฆ„์„ ์œ„ํ•ด์„œ ์šฉ์–ด ์‚ฌ์ „์€ ํ•„์ˆ˜์ 
๋ƒ„์ƒˆ
: ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š•์‹ฌ
๏ฝ   ํŠน์ • ํด๋ž˜์Šค ๋‚ด์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋™   PriceCalculator       Product

    ์ž‘์„ ์œ„ํ•ด ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์žˆ๋Š”   ..
                       calculate()
                                         ..
                                         getQuantity()
    ์ •๋ณด๋ฅผ ๋งŽ์ด ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ   bmethod()         getDiscountRate()




๏ฝ   ํ•ด๊ฒฐ์ฑ…
    ๏ฝ   Move Method
๋ƒ„์ƒˆ
: ๋ถ€์ ์ ˆํ•œ ์นœ๋ฐ€
๏ฝ   ํŠน์ • ํด๋ž˜์Šค ๋‚ด์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋‹ค๋ฅธ                                Class A      Class B

    ํด๋ž˜์Šค์— ์žˆ๋Š” ๋ฉ”์†Œ๋“œ(private ์ด                       ..             ..

    ์–ด์•ผ ํ• )๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
                                                amethod()      xmethod()
                                                bmethod()      ymethod()




๏ฝ   ํ•ด๊ฒฐ์ฑ…
    ๏ฝ   ๋‘ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ํด๋ž˜์Šค๊ฐ€ ์—‰์ผœ ์žˆ๋‹ค
        ๋ฉด
        ๏ฝ   Move Method
    ๏ฝ   ์„œ๋กœ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค๋ฉด
        ๏ฝ   Change Bidirectional Reference to
            Unidirectional
    ๏ฝ   ์ค‘์žฌํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—‰์ผœ
        ์žˆ๋‹ค๋ฉด
        ๏ฝ   Extract Hierarchy-> Hide Delegate
๋ƒ„์ƒˆ
: ์ฃผ์„
๏ฝ   ์ฃผ์„์€ ๋Œ€๋ถ€๋ถ„ ์ฝ”๋“œ๊ฐ€ ๋ช…ํ™• ์น˜ ์•Š๋‹ค๊ณ  ํŒ๋‹จ๋  ๋•Œ ์“ฐ์ž„
๏ฝ   ์ฃผ์„์€ ๋‚˜์œ ์ฝ”๋“œ๋ฅผ ์œ ๋„ํ•จ

๏ฝ   ํ•ด๊ฒฐ์ฑ…
    ๏ฝ   ์ฝ”๋“œ์˜ ์ผ์ • ๋ธ”๋ก ์„ค๋ช…
        ๏ฝ   Extract Method
    ๏ฝ   ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•˜๋Š” ์ผ ์„ค๋ช…
        ๏ฝ   Rename Method
    ๏ฝ   ์„  ์กฐ๊ฑด ์„ค๋ช…
        ๏ฝ   Introduce Assertion
๋ƒ„์ƒˆ
: ๊ธด ๋ฉ”์†Œ๋“œ
๏ฝ   ๊ธด ๋ฉ”์†Œ๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ํž˜๋“ค๊ฒŒ ๋งŒ๋“ ๋‹ค.
๏ฝ   ์ฃผ์„์„ ๋‹ฌ์•„์•ผ ํ•  ํ•„์š”๋ฅผ ๋Š๋‚„ ๋•Œ ๋งˆ๋‹ค ๋ฉ”์†Œ๋“œ๋กœ ๋ถ„๋ฆฌ

๏ฝ   ํ•ด๊ฒฐ์ฑ…
    ๏ฝ   Extract Method


๏ฝ   ์ฃผ์˜์ 
    ๏ฝ   ์ฝ”๋“œ์˜ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ์ž˜ ๋‚˜ํƒ€๋‚ด๋Š”
        ์ด๋ฆ„ ์ง€์–ด์•ผ
        ๏ฝ   ๋ถ€์ ์ ˆํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์งง์€ ๋ฉ”์†Œ๋“œ ์ง‘ํ•ฉ์€ ๊ธด ๋ฉ”์†Œ๋“œ๋ณด๋‹ค ์ดํ•ดํ•˜
            ๊ธฐ ํž˜๋“ค๋‹ค.
๋ƒ„์ƒˆ
: ๊ธด ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ
๏ฝ   ๊ฐ์ฒด์ง€ํ–ฅ ์ฝ”๋“œ์—์„œ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋งŽ์„ ํ•„์š” ์—†๋‹ค.

๏ฝ   ๋ฌธ์ œ์ 
    ๏ฝ   ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›€
    ๏ฝ   ์ผ๊ด€์„ฑ ์—†์Œ
    ๏ฝ   ๋ณ€๊ฒฝ์ด ๋งŽ์ด ๋จ

๏ฝ   ํ•ด๊ฒฐ์ฑ…
    ๏ฝ   ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ๊ฐ’ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ์Œ
        ๏ฝ   Replace Parameter with Method
    ๏ฝ   ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜์˜ Object๋กœ ๋ถ€ํ„ฐ ๋‚˜์˜ค๋ฉด
        ๏ฝ   Preserve Whole Object
    ๏ฝ   ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ ๊ฐ์ฒด๋กœ ๋ถ€ํ„ฐ ์–ป์–ด์ง€๋Š”๊ฒŒ ์•„๋‹ ๊ฒฝ์šฐ
        ๏ฝ   Introduce Parameter Object

๏ฝ   ์ฃผ์˜์ 
    ๏ฝ   Caller์™€ Callee๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ข…์†์„ฑ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋ฆฌํŒฉํ† ๋ง์„ ํ”ผํ•ด์•ผํ•จ
๋ƒ„์ƒˆ
: Switch ๋ฌธ
๏ฝ    Switch๋ฌธ์€ ๋ณธ์งˆ์ ์œผ๋กœ ์ค‘๋ณต์˜ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ
     ๏ฝ   ํƒ€์ž… ์ถ”๊ฐ€ ์‹œ, ๊ด€๋ จ๋œ ๋ชจ๋“  Switch๋ฌธ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•จ
๏ฝ    ์ข‹์€ OOP์ฝ”๋“œ์˜ ํŠน์ง•์€ Switch๋ฌธ์ด ๋น„๊ต์  ์ ์Œ

๏ฝ    ํ•ด๊ฒฐ์ฑ…
     ๏ฝ   ๋™์ผํ•œ ์กฐ๊ฑด์— ๋Œ€ํ•œ Switch๋ฌธ์ด ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉ๋จ
         ๏ฝ   Step 1: Extract Method๋ฅผ ํ†ตํ•ด ๊ฐ ์กฐ๊ฑด ์ ˆ์—์„œ ์ฝ”๋“œ ์ถ”์ถœ
         ๏ฝ   Step 2: Move Method๋ฅผ ํ†ตํ•ด ์—ฐ๊ด€๋œ ์ฝ”๋“œ๋ฅผ ์˜ณ๋ฐ”๋ฅธ ํด๋ž˜์Šค๋กœ ์˜ฎ๊น€
         ๏ฝ   Step 3: Replace Type Code with Subclass or
                      Replace Type Code with State/Strategy ๋ฅผ ํ†ตํ•ด ์ƒ์†๊ตฌ์กฐ ๋งŒ๋“ฌ


๏ฝ    ์ฃผ์˜
     ๏ฝ   Switch๋ฌธ์˜ ์ค‘๋ณต์ด ๋งŽ์ง€ ์•Š๋‹ค๋ฉด ๋ฐ”๊ฟ€ ํ•„์š” ์—†์Œ
    21                                       Confidential   12/13/2011
๊ฒฐ๋ก 
๏ฝ    ๋ฆฌํŒฉํ† ๋ง์€ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ ๋‹ค.

๏ฝ    ๋ฆฌํŒฉํ† ๋ง์€ ๋ชฉํ‘œ๊ฐ€ ์•„๋‹ˆ๋ผ, ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•˜๊ธฐ ์œ„ํ•œ ๊ณผ
     ์ •์ด๋‹ค.

๏ฝ    ๋ฆฌํŒฉํ† ๋ง์€ ํ‹ˆํ‹ˆํžˆ ๊ณ„์† ํ•ด์•ผ ํ•œ๋‹ค.




    22                Confidential   12/13/2011
ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ๋ƒ„์ƒˆ




23     Confidential   12/13/2011
์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ƒ„์ƒˆ




24     Confidential   12/13/2011
์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ƒ„์ƒˆ
: ๊ฐœ์š”
๏ฝ   ํŠน์ง•
    ๏ฝ   ์ฐพ๊ธฐ ์‰ฝ๋‹ค.


๏ฝ   ๊ด€๋ จ ๋ƒ„์ƒˆ
    ๏ฝ   ์ฃผ์„
    ๏ฝ   ๊ธด ๋ฉ”์†Œ๋“œ
    ๏ฝ   ๊ฑฐ๋Œ€ํ•œ ํด๋ž˜์Šค
    ๏ฝ   ๊ธด ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฆฌ์ŠคํŠธ
์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ƒ„์ƒˆ
: ์ฃผ์„
   ํ•ญ๋ชฉ                                ์„ค๋ช…
   ์ง•ํ›„      โ€ข   ์ฃผ์„๊ธฐํ˜ธ๊ฐ€ ์ฝ”๋“œ์— ๋‚˜ํƒ€๋‚จ
               -> ์ฃผ์„์€ ํ–ฅํ›„ ์—…๋ฐ์ดํŠธ์—์„œ ๋ˆ„๋ฝ๋  ์—ฌ์ง€๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋ชป ๋œ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ผ ๊ฐ€๋Šฅ์„ฑ
               ์ดํผ
   ์›์ธ      โ€ข   ์ฝ”๋“œ๊ฐ€ ๋ช…ํ™• ์น˜ ์•Š๋‹ค๊ณ  ํŒ๋‹จ๋  ๋•Œ ์“ฐ์ž„
               - ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋˜๋Š” ๊ฐœ๋ฐœ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์œ„ํ•ด ์“ฐ์ž„


  ํ•ด์•ผ ํ•  ์ผ   โ€ข ์ผ์ • ๋ธ”๋ก ์„ค๋ช…
             -> Extract Method
           โ€ข ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•˜๋Š” ์ผ ์„ค๋ช…
            -> Rename Method
           โ€ข ์„ ์กฐ๊ฑด ์„ค๋ช…
            -> Introduce Assertion
   ํšจ๊ณผ      โ€ข   ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„
           โ€ข   ์ค‘๋ณต ๋…ธ์ถœ


   ๊ธˆ๊ธฐ      ์ž๊ธฐ ์—ญํ• ์„ ๋‹คํ•˜๋Š” ์ฃผ์„ ์‚ญ์ œํ•˜์ง€ ๋ง์•„์•ผ ํ•จ
์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ƒ„์ƒˆ
: ์ฃผ์„ - ์˜ˆ์ œ์ฝ”๋“œ
package ch3;

public class Matcher {
  public Matcher() {
  }                                                          ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•˜๋Š” ์ผ ์„ค๋ช… [Rename Method]

    // ๋ฐฐ์—ด๊ฐ’์˜ ๊ฐ ์š”์†Œ๋“ค์ด ์ด์— ๋Œ€์‘๋˜๋Š” ์˜ˆ์ธก ๊ฐ’๊ณผ ํ—ˆ์šฉ๋ฒ”์œ„ ๋‚ด์˜ ์ฐจ์ด๋ฅผ ๊ฐ–๋Š”์ง€ ์ฒดํฌํ•œ๋‹ค.
    public boolean compare(int[] expected, int[] actual, int clipLimit, int delta) {

        // clipLimit๋ณด๋‹ค    ํฐ ๊ฐ’์„ ์ž˜๋ผ๋‚ธ๋‹ค.                         ๋ธ”๋ก์ด ํ•˜๋Š” ์ผ ์„ค๋ช… [Extract Method]
        for (int i = 0;   i < actual.length; i++)
          if (actual[i]   > clipLimit)
            actual[i] =   clipLimit;

        // ๋น„๊ตํ•˜๋ ค๋Š” ๋‘ ๋ฐฐ์—ด๊ฐ’์˜ ๊ธธ์ด๊ฐ€ ๊ฐ™์€์ง€ ์ฒดํฌํ•œ๋‹ค.
                                                             ๋ธ”๋ก์ด ํ•˜๋Š” ์ผ ์„ค๋ช… [Extract Method]
        if (actual.length != expected.length)
          return false;

        // ๋ฐฐ์—ด์˜ ๊ฐ ๊ฐ’์˜ ์ฐจ์ด๊ฐ€ delta๋ฅผ ๋ฒ—์–ด๋‚˜๋Š”์ง€ ์ฒดํฌํ•œ๋‹ค.
        for (int i = 0; i < actual.length; i++)
          if (Math.abs(expected[i] - actual[i]) > delta)
            return false;

        return true;
    }
}




    27                                                     Confidential   12/13/2011
Refactoring ๊ธฐ๋ฒ•
    : Extract Method
    ๊ทธ๋ฃน์œผ๋กœ ํ•จ๊ป˜ ๋ฌถ์„ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์กฐ๊ฐ์ด ์žˆ์œผ๋ฉด
     โ†’ ์ฝ”๋“œ์˜ ๋ชฉ์ ์ด ์ž˜ ๋“œ๋Ÿฌ๋‚˜๋Š” ์ด๋ฆ„์„ ๊ฐ–๋Š” ๋ณ„๋„์˜ ๋ฉ”์†Œ๋“œ๋กœ ๋ฝ‘์•„๋‚ธ๋‹ค.

{                                               {
                                                    // clipLimit๋ณด๋‹ค ํฐ ๊ฐ’์„ ์ž˜๋ผ๋‚ธ๋‹ค.
    // clipLimit๋ณด๋‹ค    ํฐ ๊ฐ’์„ ์ž˜๋ผ๋‚ธ๋‹ค.
                                                    for (int i = 0; i < actual.length; i++)
    for (int i = 0;   i < actual.length; i++)         if (actual[i] > clipLimit)
      if (actual[i]   > clipLimit)                      actual[i] = clipLimit;
        actual[i] =   clipLimit;                }
}
                                                private void cutLargeValues(int[] values, int limit)
                                                {
                                                  for (int i = 0; i < values.length; i++)
                                                    if (valuesl[i] > limit)
                                                      values [i] = limit;
                                                }




๏ฝ     ์งง๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์œผ๋กœ ๋œ ๋ฉ”์†Œ๋“œ์˜ ์ด์ 
      ๏ฝ   ์žฌ์‚ฌ์šฉ๋  ํ™•๋ฅ ์ด ๋†’์•„์ง
      ๏ฝ   ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ชฝ์—์„œ ๋ดค์„ ๋•Œ ์ผ๋ จ์˜ ์ฃผ์„์„
          ์ฝ๋Š” ๊ฒƒ ๊ณผ ๊ฐ™์€ ๋Š๋‚Œ์„ ์ค€๋‹ค
          ๏ฝ   ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค
      ๏ฝ   ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค
    28                                                      Confidential       12/13/2011
Refactoring ๊ธฐ๋ฒ•
: Rename Method
    ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์ด ๊ทธ ๋ชฉ์ ์„ ๋“œ๋Ÿฌ๋‚ด์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋‹ค๋ฉด
    โ†’ ๋ชฉ์ ์— ๋งž๊ฒŒ ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”๋ผ




๏ฝ    ์ข‹์€ ์ด๋ฆ„์€ ๋ชจ๋“ˆํ™”๋œ ์ฝ”๋“œ๊ฐ€ ๋น›์„ ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ์ „์ œ์กฐ๊ฑด

๏ฝ    ์ด๋ฆ„์„ ์ž˜ ์ง“๊ธฐ ์œ„ํ•ด์„œ
     ๏ฝ   ์ถ”์ƒํ™” ๋Šฅ๋ ฅ์„ ๊ธฐ๋ฅด์ž
     ๏ฝ   ๊ตญ์–ด๋ฅผ ์ž˜ํ•ด์•ผ ํ•œ๋‹ค.

๏ฝ    ์ด๋ฆ„์„ ์ž˜ ์ง“๋Š” ๊ธฐ์ˆ ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ง„์ •์œผ๋กœ ์ˆ™๋ จ๋œ
     ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ์—ด์‡  ์ค‘ ํ•˜๋‚˜!!
    29                      Confidential   12/13/2011
Refactoring ๊ธฐ๋ฒ•
  : Introduce Assertion
     ์ฝ”๋“œ์˜ ํ•œ ๋ถ€๋ถ„์ด ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ์— ๋Œ€ํ•˜์—ฌ ์–ด๋–ค ๊ฒƒ์„ ๊ฐ€์ •ํ•˜๊ณ  ์žˆ์œผ๋ฉด
     โ†’ assertion์„ ์จ์„œ ๊ฐ€์ •์„ ๋ช…์‹œ์ ์œผ๋กœ ๋งŒ๋“ค์–ด๋ผ

double getExpenseLimit() {                                          double getExpenseLimit() {
  // should have either expense limit or a primary project return     Assert.isTrue (_expenseLimit != NULL_EXPENSE || _primaryProject != null);
  (_expenseLimit != NULL_EXPENSE) ?                                   return (_expenseLimit != NULL_EXPENSE) ? _expenseLimit:
   _expenseLimit: _primaryProject.getMemberExpenseLimit();            _primaryProject.getMemberExpenseLimit();
}                                                                   }




 ๏ฝ     Assertion์€ ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝ์‹œํ‚ค์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.
 ๏ฝ     Assertion์€ ํ•ญ์ƒ ์ฐธ์ด๋ผ๊ณ  ๊ฐ€์ •๋˜๋Š” ์กฐ๊ฑด๋ฌธ
 ๏ฝ     Assertion์ด ์‹คํŒจํ•˜๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์‹ค์ˆ˜ํ–ˆ์Œ์„ ๋œปํ•œ๋‹ค.
 ๏ฝ     Assertion ๋‚จ์šฉ์— ์ฃผ์˜ํ•˜์ž
       ๏ฝ    ๊ด€๋ฆฌํ•˜๊ธฐ์— ์–ด๋ ค์šด ๋…ผ๋ฆฌ๊ฐ€ ์ค‘๋ณต๋  ์ˆ˜ ์žˆ๋‹ค
 ๏ฝ     Assertion ๋‚ด์˜ ์กฐ๊ฑด๋ฌธ์„ Extract Method๋กœ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜๋„ ์žˆ
       ์Œ


     30                                                                        Confidential          12/13/2011
์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ƒ„์ƒˆ
: ๊ธด ๋ฉ”์†Œ๋“œ - ๊ฐœ์š”
   ํ•ญ๋ชฉ                                 ์„ค๋ช…
   ์ง•ํ›„      โ€ข   ๋ฉ”์†Œ๋“œ์˜ ๊ธธ์ด๊ฐ€ ํ•œ ํ™”๋ฉด์„ ๋„˜๊ธด๋‹ค.


   ์›์ธ      โ€ข   ์ฝ”๋”ฉ์„ ์ ์ ˆํ•œ ์‹œ์ ์— ๋Š์ง€ ์•Š๊ณ , ํ•˜๋‚˜์”ฉ ๋” ์ถ”๊ฐ€ํ•จ




  ํ•ด์•ผ ํ•  ์ผ   โ€ข    ๋ฉ”์†Œ๋“œ๋ฅผ ๋‚˜๋ˆ„๊ธฐ ์ „์— ๋‹ค์Œ ๋ฆฌํŒฉํ† ๋ง ๊ฐ€๋Šฅ์„ฑ ๊ฒ€ํ† 
               -> ์ผ์ง์„ ์œผ๋กœ ๊ธด ์ฝ”๋“œ, ์กฐ๊ฑด๋ฌธ, ๋ณ€์ˆ˜ ์‚ฌ์šฉ๋ฒ•๋“ฑ ์ •๋ฆฌ?

           โ€ข    ์˜๋ฏธ๋ก  ์ ์œผ๋กœ ์ค‘์š”ํ•œ ์ฝ”๋“œ ๋ธ”๋ก์„ ์„ ํƒ
               -> ExtractMethod

   ํšจ๊ณผ      โ€ข   ์ƒˆ๋กœ์šด ํด๋ž˜์Šค์™€ ์ถ”์ƒํ™” ๋“ค์–ด๋‚จ
           โ€ข   ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„
           โ€ข   ์ค‘๋ณต ๋…ธ์ถœ

   ๊ธˆ๊ธฐ      ๊ธด ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ฐ€์žฅ ์ข‹์€ ํ‘œํ˜„ ๋ฐฉ๋ฒ•์ผ ๊ฒฝ์šฐ ๋ฆฌํŒฉํ† ๋ง ๊ธˆ์ง€
์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ƒ„์ƒˆ
: ๊ฑฐ๋Œ€ํ•œ ํด๋ž˜์Šค
  ํ•ญ๋ชฉ                              ์„ค๋ช…
  ์ง•ํ›„      โ€ข   ๋งŽ์€ ์ˆ˜์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜
          โ€ข   ๋งŽ์€ ์ˆ˜์˜ ๋ฉ”์†Œ๋“œ
          โ€ข   ๋งŽ์€ ์ˆ˜์˜ ์ค„


  ์›์ธ


 ํ•ด์•ผ ํ•  ์ผ   โ€ข   ์ฑ…์ž„์˜ ์ผ๋ถ€๋ฅผ ๋ถ„๋ฆฌํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด
              -> Extract Class
          โ€ข   ์ƒˆ๋กœ์šด ํ•˜์œ„ ํด๋ž˜์Šคํ˜•ํƒœ๋กœ ๋ฝ‘์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด
              -> Extract Subclass
          โ€ข   ๊ธฐ๋Šฅ์˜ ์ผ๋ถ€๋ฅผ ๋”ฐ๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด
              -> Extract Interface




  ํšจ๊ณผ      โ€ข   ์ƒˆ๋กœ์šด ํด๋ž˜์Šค์™€ ์ถ”์ƒํ™” ๋“ค์–ด๋‚จ
          โ€ข   ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„
          โ€ข   ์ค‘๋ณต ๋…ธ์ถœ

  ๊ธˆ๊ธฐ
Refactoring ๊ธฐ๋ฒ•
: Extract Class
    ๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์„ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ
    โ†’ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€๋ จ ์žˆ๋Š” ํ•„๋“œ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋กœ ์˜ฎ๊ฒจ๋ผ




๏ฝ    ๊ฐ™์ด ๋ณ€ํ•˜๊ฑฐ๋‚˜, ์„œ๋กœ ์˜์กด์ ์ธ ๋ฐ์ดํ„ฐ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด
     ์žˆ๋‹ค๋ฉด,
     ๏ฝ   ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๋ณ„๋„์˜ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌ!




    33                             Confidential   12/13/2011
Refactoring ๊ธฐ๋ฒ•
: Extract Class โ€“ ํ›„๋ณด ์ •ํ•˜๊ธฐ




34                         Confidential   12/13/2011
Refactoring ๊ธฐ๋ฒ•
: Extract Subclass
    ์–ด๋–ค ํด๋ž˜์Šค๊ฐ€ ์ผ๋ถ€ ์ธ์Šคํ„ด์Šค์— ์˜ํ•ด์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด
    โ†’ ๊ธฐ๋Šฅ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๋‹ด๋‹นํ•˜๋Š” ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ผ
                                          JobItem

                                    +getTotalPrice()
                      JobItem       +getUnitPrice()
                 +getTotalPrice()
                 +getUnitPrice()
                 +getEmployee()          LaborItem

                                    +getUnitPrice()
                                    +getEmployee()




๏ฝ    Extract Class์™€ Extract Subclass ์˜ ์„ ํƒ
     ๏ฝ   Extract Subclass๋Š” ํ•œ๊ฐ€์ง€ ๊ด€์ ์˜ ๋‹ค์–‘์„ฑ(variation)๋งŒ์„
         ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
         ๏ฝ   ์‚ฌ๋žŒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๊ฐ€๊ฒฉ๋Œ€๋งŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๋‹ค.
     ๏ฝ   Extract Class๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ด€์ ์˜ ๋‹ค์–‘์„ฑ(variation)์„ ์ˆ˜์šฉ
         ๊ฐ€๋Šฅํ•˜๋‹ค.
         ๏ฝ   ์‹œ๊ฐ„๋Œ€, ์ง€์—ญ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๊ฐ€๊ฒฉ๋Œ€๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    35                                                 Confidential   12/13/2011
Refactoring ๊ธฐ๋ฒ•
: Extract Interface
    ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•œ ํด๋ž˜์Šค ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋™์ผํ•œ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜,
    ๋‘ ํด๋ž˜์Šค๊ฐ€ ๊ณตํ†ต๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด
    โ†’ ๊ทธ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฝ‘์•„๋ผ
                                            <<interface>>
                                               Billable
                                    +getRate()
                     Employee       +hasSpecialSkill()
               +getRate()
               +hasSpecialSkill()
               +getName()
                                             Employee
               +getDepartment()

                                    +getRate()
                                    +hasSpecialSkill()
                                    +getName()
                                    +getDepartment()




๏ฝ    ํ•œ ๊ทธ๋ฃน์˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋‹จ์ง€ ์–ด๋–ค ํด๋ž˜์Šค์˜ ํŠน์ • ๋ถ€๋ถ„์ง‘
     ํ•ฉ๋งŒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
๏ฝ    ์ฑ…์ž„์ด ์–ด๋–ป๊ฒŒ ๋‚˜๋‰˜์–ด ์ง€๋Š”์ง€ ๋ช…ํ™•ํ•ด์ง
๏ฝ    Extract Superclass์™€์˜ ์ฐจ์ด์ 
     ๏ฝ   Extract Interface๋Š” ๊ณตํ†ต๋œ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ณตํ†ต๋œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€
         ์ถ”์ถœ๋œ๋‹ค.

    36                                               Confidential   12/13/2011
์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ƒ„์ƒˆ
: ๊ธด ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฆฌ์ŠคํŠธ - ๊ฐœ์š”
  ํ•ญ๋ชฉ                                 ์„ค๋ช…
  ์ง•ํ›„      ๋งค์†Œ๋“œ์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•œ ๋‘ ๊ฐœ ๋ณด๋‹ค ๋งŽ๋‹ค


  ์›์ธ      โ€ข   ๊ฐ์ฒด๊ฐ„์˜ Coupling์„ ์ค„์ด๋ ค๋Š” ์‹œ๋„์— ์˜ํ•ด ์ฃผ๋กœ ๋‚˜ํƒ€๋‚จ.




 ํ•ด์•ผ ํ•  ์ผ   โ€ข   ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด
              -> Replace Parameter with Method
          โ€ข   ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์ด ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ๋„˜์–ด์˜จ๋‹ค๋ฉด
              -> Preserve Whole Object
              ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋…ผ๋ฆฌ์  ๊ฐ์ฒด๋กœ ๋ถ€ํ„ฐ ์–ป์–ด์™€์•ผ ํ•œ๋‹ค๋ฉด
              -> Introduce Parameter Object
  ํšจ๊ณผ      โ€ข   ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„
          โ€ข   ์ค‘๋ณต ๋…ธ์ถœ
          โ€ข   ํฌ๊ธฐ ๊ฐ์†Œ

  ๊ธˆ๊ธฐ      ๋‘ ํด๋ž˜์Šค ๊ฐ„์˜ Coupling์„ ์ค„์ผ ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ
          ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฆฌ์ŠคํŠธ๋“ค์ด ์˜๋ฏธ์žˆ๋Š” ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์ด์ง€ ์•Š์„ ๋–„
Refactoring ๊ธฐ๋ฒ•
  : Replace Parameter with Method
    ๊ฐ์ฒด๊ฐ€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ, ๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธฐ๊ณ  ์žˆ๋‹ค.
    ์ˆ˜์‹ ์ž ๋˜ํ•œ ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ,
     โ†’ ๊ทธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ˆ˜์‹ ์ž๊ฐ€ ๊ทธ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํ•˜๋ผ



Int basePrice = quantity * itemPrice;
                                                                    int basePrice = quantity * itemPrice;
discountLevel = getDiscountLevel();
                                                                    double finalPrice = getDiscountedPrice(basePrice);
double finalPrice = getDiscountedPrice(basePrice, discountLevel);
Refactoring ๊ธฐ๋ฒ•
  : Preserve Whole Object
     ์–ด๋–ค ๊ฐ์ฒด์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ์–ป์€ ๋‹ค์Œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ
     ๋„˜๊ธฐ๊ณ  ์žˆ๋‹ค๋ฉด
     โ†’ ๋Œ€์‹  ๊ทธ ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ๋ผ



Int low = daysTempRange().getLow();
Int high = daysTempRange().getHigh();       withinPlan = plan.withinRange(daysTempRange());
withinPlan = plain.withinRange(low, high)




 ๏ฝ    ํ•œ ๊ฐ์ฒด์—์„œ ์–ป์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์ค„ ๋•Œ ๋ฐœ์ƒ
 ๏ฝ    ๊ฐ์ฒด์— ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ ํ˜ธ์ถœ๋˜๋Š” ๋ชจ๋“  ๊ณณ์„ ์ฐพ์•„์„œ ๊ณ ์ณ์•ผ ํ•˜๋Š”
      ์–ด๋ ค์›€ ๋ฐœ์ƒ
 ๏ฝ    ๋˜ํ•œ, ํ˜ธ์ถœ๋œ ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ๋Š” ๊ฐ์ฒด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜
      ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต์ฝ”๋“œ ๋ฐœ์ƒ์„ ์กฐ์žฅํ•จ
 ๏ฝ    ํ•˜์ง€๋งŒ, ์ƒˆ๋กœ์šด ์ข…์†๊ด€๊ณ„๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋จ
 ๏ฝ    ์ข…์†์„ฑ ๊ด€์ ์œผ๋กœ ๋ถ„์„ํ•ด์•ผ ํ•จ
Refactoring ๊ธฐ๋ฒ•
: Introduce Parameter Object
    ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ชฐ๋ ค๋‹ค๋‹ˆ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด
    โ†’ ๊ทธ๊ฒƒ๋“ค์„ ๊ฐ์ฒด๋กœ ๋ฐ”๊พธ์–ด๋ผ




๏ฝ   ๊ฐ™์ด ๋„˜๊ฒจ์ง€๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋Š” ํŠน๋ณ„ํ•œ ๊ทธ๋ฃน์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•ด
    ๏ฝ   -> ๋ฐ์ดํ„ฐ ๋ฉ์–ด๋ฆฌ
    ๏ฝ   -> ๊ฐ์ฒดํ˜•ํƒœ๋กœ ๋ฌถ์ผ ์ˆ˜ ์žˆ์Œ

๏ฝ   ๋ถ€๊ฐ€ ํšจ์šฉ
    ๏ฝ   ์ƒˆ๋กœ ์ƒ๊ธด ๊ฐ์ฒด์— ๋“ค์–ด๊ฐ€์•ผ ํ•  ๋ฉ”์†Œ๋“œ๊ฐ€ ์‰ฝ๊ฒŒ ๋ˆˆ์— ๋”
    ๏ฝ   ์ด์— ๋”ฐ๋ผ, ์ค‘๋ณต์„ ํšจ๊ณผ์ ์œผ๋กœ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Œ
์ด๋ฆ„




41   Confidential   12/13/2011
์ด๋ฆ„
: ๊ฐœ์š”
๏ฝ   ์ข‹์€ ์ด๋ฆ„์˜ ๊ธฐ๋Šฅ
    ๏ฝ   ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ๋…ผ์˜์˜ ๊ทผ๊ฐ„ ์–ดํœ˜ ์ œ๊ณต
    ๏ฝ   ์˜๋„ ๋ช…ํ™•ํ™”
        ๏ฝ   ์‹œ์Šคํ…œ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ์ง€์— ๋Œ€ํ•œ ๋ฏธ๋ฌ˜ํ•œ ๋ถ€๋ถ„ ์„ค๋ช…
    ๏ฝ   ์ฒด๊ณ„์ ์ธ ์ด๋ฆ„์€ ์„œ๋กœ ์ƒ์Šน์ž‘์šฉ ์ผ์œผํ‚ด

๏ฝ   ์ข‹์€ ์ด๋ฆ„์„ ์œ„ํ•œ ๊ฐ€์ด๋“œ ๋ผ์ธ
    ๏ฝ   ์˜์‚ฌ์†Œํ†ต์„ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐ€์น˜๋กœ ์‚ผ๋Š”๋‹ค.
    ๏ฝ   ์กฐ์ž‘ ๋ฉ”์†Œ๋“œ : ๋™์‚ฌํ˜•, ์ ‘๊ทผ ๋ฉ”์†Œ๋“œ : ๋ช…์‚ฌ, ํ˜•์šฉ์‚ฌ
    ๏ฝ   ๋น„์Šทํ•œ ๊ฒƒ๋“ค์—๋Š” ๊ฐ™์€ ๋‹จ์–ด ์‚ฌ์šฉ, ์„œ๋กœ ๋‹ค๋ฅธ๊ฒƒ ๋“ค์—๋Š” ๋‹ค๋ฅธ ๋‹จ์–ด ์‚ฌ์šฉ
    ๏ฝ   ํ•œ ๋‹จ์–ด๋กœ ๋œ ์ด๋ฆ„ ์„ ํ˜ธ

๏ฝ   ๋‹ค๋ฃจ๋Š” ๋ƒ„์ƒˆ
    ๏ฝ   ํƒ€์ž…์ด ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” ์ด๋ฆ„(Type Embedded in Name)
    ๏ฝ   ์˜์‚ฌ์†Œํ†ต์„ ๋ฐฉํ•ดํ•˜๋Š” ์ด๋ฆ„(Uncommunicative Name)
    ๏ฝ   ์ผ๊ด€์„ฑ ์—†๋Š” ์ด๋ฆ„(Inconsistent Name)
์ด๋ฆ„
: ํƒ€์ž…์ด ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” ์ด๋ฆ„
  ํ•ญ๋ชฉ                                           ์„ค๋ช…

  ์ง•ํ›„      ์ด๋ฆ„์ด ๋‹จ์–ด์™€ ์ธ์ˆ˜์˜ ํƒ€์ž…์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๋ณตํ•ฉ์–ด
          ex) addCourse(Course c)
          ๊ฐ์ฒด์˜ ํƒ€์ž…์ด ์ธ์ฝ”๋”ฉ๋œ ์ด๋ฆ„์ด ํ—๊ฐ€๋ฆฌ์•ˆ ํ‘œ๊ธฐ๋ฒ•
          ex) iCount
          ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค

  ์›์ธ      โ€ข   ์ด๋ฆ„์— ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋” ์˜์‚ฌ์†Œํ†ต์— ์ข‹์€ ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ
              -> ํ•˜์ง€๋งŒ, ์ด๋ฆ„๊ณผ ์ธ์ˆ˜์˜ ํƒ€์ž…์ด ์ค‘๋ณต๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ
          โ€ข   ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์—์„œ์˜ ํ—๊ฐ€๋ฆฌ์•ˆ ํ‘œ๊ธฐ๋ฒ• ์‚ฌ์šฉ
              -> ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์—์„œ๋Š” ํƒ€์ž…์ด ๋ถˆํ•„์š”ํ•จ


 ํ•ด์•ผ ํ•  ์ผ   โ€ข   ๋ถ€์ ์ ˆํ•œ ์ด๋ฆ„์— ๋Œ€ํ•ด์„œ
              -> Rename Method, Rename Field, Rename Constant



  ํšจ๊ณผ      โ€ข   ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„
          โ€ข   ์ค‘๋ณต ์ฐพ๊ธฐ ์‰ฌ์›Œ์ง



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




 ํ•ด์•ผ ํ•  ์ผ   โ€ข   Rename Method, Rename Field, Rename Constant




  ํšจ๊ณผ      โ€ข   ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„




  ๊ธˆ๊ธฐ      * ๋ฒ”์œ„๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž‘์€ ๊ณณ์—์„œ๋Š” ์งง์€ ์ด๋ฆ„์ด๋‚˜, ๋ฒˆํ˜ธ๋กœ ๊ตฌ๋ณ„๋˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ์˜๋„๋ฅผ ๋” ์ž˜ ์ „๋‹ฌํ• 
          ์ˆ˜ ์žˆ๋‹ค.
์ด๋ฆ„
: ์ผ๊ด€์„ฑ ์—†๋Š” ์ด๋ฆ„
  ํ•ญ๋ชฉ                                           ์„ค๋ช…
  ์ง•ํ›„      โ€ข   ๊ฐ™์€ ๊ฒƒ์— ๋Œ€ํ•ด ์—ฌ๊ธฐ์ €๊ธฐ์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค.
              Ex) add(), store(), put(), place(), register() ๋“ฑ

  ์›์ธ      โ€ข   ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๊ธฐ์— ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.




 ํ•ด์•ผ ํ•  ์ผ   โ€ข   ๊ฐ€์žฅ ์ข‹์€ ์ด๋ฆ„์„ ๊ณจ๋ผ ํ•ด๋‹น ์ด๋ฆ„์œผ๋กœ ๋‚˜๋จธ์ง€ ์ด๋ฆ„๋“ค์„ ์ˆ˜์ •
              -> Rename Method, Rename Field, Rename Constant


  ํšจ๊ณผ      โ€ข   ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„
          โ€ข   ์ค‘๋ณต ๋…ธ์ถœ


  ๊ธˆ๊ธฐ      โ€ข   ๋ฒ”์œ„๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž‘์€ ๊ณณ์—์„œ๋Š” ์งง์€ ์ด๋ฆ„์ด๋‚˜, ๋ฒˆํ˜ธ๋กœ ๊ตฌ๋ณ„๋˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ์˜๋„๋ฅผ ๋” ์ž˜ ์ „
              ๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
์ข‹์€ ์ด๋ฆ„์„ ์ง“๊ธฐ ์œ„ํ•œ ๊ทœ์น™

         ์˜๋„๋ฅผ ๋ถ„๋ช…ํžˆ ๋ฐํ˜€๋ผ

         ๊ทธ๋ฆ‡๋œ ์ •๋ณด๋ฅผ ํ”ผํ•˜๋ผ

          ์˜๋ฏธ ์žˆ๊ฒŒ ๊ตฌ๋ถ„ํ•˜๋ผ

       ๋ฐœ์Œํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผ

       ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผ

          ์ธ์ฝ”๋”ฉ์„ ํ”ผํ•˜๋ผ

       ์ž์‹ ์˜ ๊ธฐ์–ต๋ ฅ์„ ์ž๋ž‘ํ•˜์ง€ ๋งˆ๋ผ




46                Confidential   12/13/2011
๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ




47   Confidential   12/13/2011
๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ
: ์ฃฝ์€ ์ฝ”๋“œ & ์ถ”์ธก ์„ฑ ์ผ๋ฐ˜ํ™”
 ํ•ญ๋ชฉ                  ์ฃฝ์€ ์ฝ”๋“œ                                   ์ถ”์ธก ์„ฑ ์ผ๋ฐ˜ํ™”
 ์ง•ํ›„      โ€ข   ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ํ•„๋“œ, ์ฝ”๋“œ์˜ ์ผ๋ถ€๋ถ„, ๋ฉ”์„œ๋“œ   โ€ข   ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ, ํ•„๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋“ฑ
             ํ˜น์€ ํด๋ž˜์Šค๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ์ œ์™ธํ•œ ์–ด๋Š๊ณณ์—์„œ           ์ด ์žˆ๋‹ค.
             ๋„ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.                  โ€ข   ์ฝ”๋“œ๊ฐ€ ํ˜„์žฌ ๊ตฌํ˜„๋œ ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•ด ํ•„์š” ์ด์ƒ์œผ
                                              ๋กœ ๋ณต์žกํ•˜๋‹ค
 ์›์ธ      โ€ข   ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€ํ–ˆ๋‹ค.                   โ€ข    ์ผ๋ฐ˜์„ฑ์ด๋‚˜ ์™„๊ฒฐ์„ฑ์„ ์œ„ํ•ด ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ
         โ€ข   ์ƒˆ๋กœ์šด ์ ‘๊ทผ๋ฐฉ์‹ ๋„์ž… ํ›„ ์ด์ „์ฝ”๋“œ ์ •๋ฆฌํ•˜์ง€          ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ๋ฐœ์ƒ
             ์•Š์Œ.
         โ€ข   ๋ณต์žกํ•œ ๋กœ์ง์ฝ”๋“œ์— ์˜ํ•ด ์‹ค์ œ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š
             ๋Š” ์ฝ”๋“œ ๋ฐœ์ƒ


ํ•ด์•ผ ํ•  ์ผ   โ€ข   ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ ๋ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์‚ญ์ œ       โ€ข   ๊ธฐ๋Šฅ์„ ๋ถ€๋ชจ๋‚˜ ์ž์‹ ํด๋ž˜์Šค๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค
                                              -> Collapse Hierarchy
                                          โ€ข   ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœ์ž๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค
                                              -> Inline Class
                                          โ€ข   ํ•„์š”์—†๋Š” ๋ฉ”์„œ๋“œ
                                              -> Inline Method
                                          โ€ข   ํ•„์š”์—†๋Š” ํ•„๋“œ
                                              -> ์ œ๊ฑฐ
                                          โ€ข   ํ•„์š”์—†๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜
                                              -> Remove Parameter
 ํšจ๊ณผ      โ€ข   ์ฝ”๋“œ ํฌ๊ธฐ ๊ฐ„์†Œํ™”, ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„, ๋‹จ์ˆœ์„ฑ ํ–ฅ์ƒ
 ๊ธˆ๊ธฐ      โ€ข   ํ”„๋ ˆ์ž„์›Œํฌ ๋“ฑ์„ ๊ฐœ๋ฐœํ•œ๋‹ค๋ฉด, ์ฃฝ์€ ์ฝ”๋“œ๋กœ ๋ณด์ด๋Š” ์กด์žฌํ•  ๊ฒƒ์ด์ง€๋งŒ ์‹ค์ œ๋กœ ์ฃฝ์€ ์ฝ”๋“œ๋Š” ์•„๋‹ˆ๋‹ค.


48                                            Confidential    12/13/2011
Refactoring ๊ธฐ๋ฒ•
: Inline Class & Collapse Hierarchy
* Inline Class
  ํด๋ž˜์Šค๊ฐ€ ๋ณ„๋‹ค๋ฅธ ์ผ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด
  โ†’ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ์˜ฎ๊ธฐ๊ณ  ์‚ญ์ œํ•œ๋‹ค.




* Collapse Hierarchy
 ์ˆ˜ํผํด๋ž˜์Šค์™€ ์„œ๋ธŒํด๋ž˜์Šค๊ฐ€ ๋ณ„๋กœ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค๋ฉด
  โ†’ ๊ทธ๊ฒƒ๋“ค์„ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ๋ผ            LoginContext                  LoginModule

                                                   +authenticate()


                                    Collapse Hierarchy


                          IDPasswordLoginModule      KerberosLoginModule x                            x
                                                                                  FingerPrintLoginModule


                         +authenticate()             +authenticate()          +authenticate()


 49                                           Confidential           12/13/2011
Refactoring ๊ธฐ๋ฒ•
  : Inline Method
     ๋ฉ”์†Œ๋“œ์˜ ๋‚ด์šฉ์ด ๊ทธ ์ด๋ฆ„๋งŒํผ ๋ช…ํ™•ํ• ๋•Œ
     โ†’ ๋ฉ”์†Œ๋“œ์˜ ๋‚ด์šฉ์„ ํ˜ธ์ถœ์ž๋กœ ์˜ฎ๊ธฐ๊ณ  ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

int getRating() {                                  int getRating() {
  return (moreThanFiveLateDeliveries()) ? 2 : 1;     return (_numberOfLateDeliveries > 5) ? 2 : 1;
}                                                  }

boolean moreThanFiveLateDeliveries() {
  return _numberOfLateDeliveries > 5;
}




 ๏ฝ    ๊ณผ๋„ํ•œ Indirection ์‚ฌ์šฉ ์‹œ ์ ์šฉ

 ๏ฝ    ๋ฉ”์†Œ๋“œ์˜ ๋‚ด์šฉ์ด ์ด๋ฆ„๋งŒํผ์ด๋‚˜ ๋ช…ํ™•ํ•  ๋•Œ

 ๏ฝ    ์ž˜๋ชป Refactoring๋œ ์ฝ”๋“œ
      ๏ฝ    ๋ฉ”์†Œ๋“œ๋“ค์˜ ๋‚ด์šฉ์„ ํ•˜๋‚˜์˜ ํฐ ๋ฉ”์†Œ๋“œ์— ํฌํ•จํ•œ ๋‹ค์Œ ๋‹ค์‹œ
           Refactoring
     50                                                       Confidential        12/13/2011
์ค‘๋ณต




51   Confidential   12/13/2011
์ค‘๋ณต
: ๊ฐœ์š”
๏ฝ   ์ค‘๋ณต์€ ์žฌ๋‚œ์˜ ๊ตฌ๋ ํ……์ด

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

๏ฝ   ๋‹ค๋ฃจ๋Š” ๋ƒ„์ƒˆ
    ๏ฝ   ๋งค์ง๋„˜๋ฒ„(Magic Number)
    ๏ฝ   ์ค‘๋ณต๋œ ์ฝ”๋“œ(Duplicated Code)
    ๏ฝ   ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–๋Š” ๋Œ€์ฒด ํด๋ž˜์Šค(Alternative Classes with
        Different Interfaces)
์ค‘๋ณต
: ๋งค์ง๋„˜๋ฒ„
  ํ•ญ๋ชฉ                                           ์„ค๋ช…
  ์ง•ํ›„      โ€ข   ์ฝ”๋“œ ์ค‘๊ฐ„์— ์ƒ์ˆ˜๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค.


  ์›์ธ      โ€ข   ๋ˆ„๊ตฐ๊ฐ€ ํ•„์š”์— ์˜ํ•ด ์ƒ์ˆ˜๋ฅผ ์ฝ”๋“œ์— ์‚ฝ์ž…




 ํ•ด์•ผ ํ•  ์ผ   โ€ข   Replace Magic Number with Symbolic Constant
          โ€ข   ๊ฐ’์ด ๋ฌธ์ž์—ด์ผ ๊ฒฝ์šฐ ๊ตญ์ œํ™”๋ฅผ ์œ„ํ•ด ๋งคํ•‘ ๋„๊ตฌ ํ™œ์šฉ


  ํšจ๊ณผ      โ€ข   ์ค‘๋ณต ์ถ•์†Œ
          โ€ข   ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„


  ๊ธˆ๊ธฐ      โ€ข   ํ…Œ์ŠคํŠธ์ฝ”๋“œ์—์„œ๋Š” ํ•„์š”ํ•œ ๊ฐ’์„ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ๋•Œ๊ฐ€ ๋” ์ฝ๊ธฐ ํŽธํ•œ ๊ฒฝ์šฐ ์žˆ์Œ
          โ€ข   ํ•˜์ง€๋งŒ, ์ƒ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ถ€ํ„ฐ ์œ ๋„๋œ ๊ฐ’์ด๋ผ๋ฉด ๊ธฐํ˜ธ์ƒ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋นผ๋‚ผ ํ•„์š” ์žˆ์Œ
์ค‘๋ณต
          : ๋งค์ง๋„˜๋ฒ„
public void analyze(File file) throws FileNotFoundException {                    private static final int INDEX_TYPE = 0;
 BufferedReader reader = new BufferedReader(new FileReader(file));               private static final int INDEX_TIME = 1;
                                                                                 private static final int INDEX_URL = 2;
    try {                                                                        private static final int INDEX_IPADRESS = 3;
      String aLine = reader.readLine();
                                                                                 public void analyze(File file) throws FileNotFoundException {
     while (aLine != null) {                                                      BufferedReader reader = new BufferedReader(new FileReader(file));
      // type, time, id, ip address
      String[] record = aLine.split(SEPERATOR);                                      try {
                                                                                       String aLine = reader.readLine();
      AccessLog aLog = new AccessLog();
      aLog.setType(record[0]);                                                        while (aLine != null) {
      aLog.setTime(record[1]);                                                         // type, time, id, ip address
      aLog.setUrl(record[2]);                                                          String[] record = aLine.split(SEPERATOR);
      aLog.setIpAddress(record[3]);                  Replace Magic Number with
                                                         Symbolic Constant             AccessLog aLog = new AccessLog();
      aLine = reader.readLine();                                                       aLog.setType(record[INDEX_TYPE]);
      }                                                                                aLog.setTime(record[INDEX_TIME]);
    } catch (IOException e) {                                                          aLog.setUrl(record[INDEX_URL]);
      e.printStackTrace();                                                             aLog.setIpAddress(record[INDEX_IPADRESS]);
    } finally {
      // ..                                                                              aLine = reader.readLine();
    }                                                                                  }
}                                                                                    } catch (IOException e) {
                                                                                       e.printStackTrace();
                                                                                     } finally {
                                                                                       // ..
                                                                                     }
                                                                                 }




โ†’ ์ค‘๋ณต์ถ•์†Œ, ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„


           54                                                                              Confidential           12/13/2011
์ค‘๋ณต
: ์ค‘๋ณต๋œ ์ฝ”๋“œ
  ํ•ญ๋ชฉ                                                ์„ค๋ช…
  ์ง•ํ›„       โ€ข   ๋‘ ์ฝ”๋“œ๊ฐ€ ๊ฑฐ์˜ ๋™์ผํ•ด ๋ณด์ธ๋‹ค.
           โ€ข   ๋‘ ์ฝ”๋“œ์˜ ๊ธฐ๋Šฅ์ด ๊ฑฐ์˜ ๋™์ผํ•˜๋‹ค.

  ์›์ธ       โ€ข   ๊ฐœ๋ฐœ์ž๋“ค์ด ์„œ๋กœ ๋‹ค๋ฅธ๋ถ€๋ถ„์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์—…ํ•จ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒ
           โ€ข   ์ค‘๋ณต์„ ์ œ๊ฑฐํ•  ์ •๋„๋กœ ๋ถ€์ง€๋Ÿฐํ•˜์ง€ ๋ชปํ•จ
           โ€ข   ๋‹ค๋ฅธ ๋ƒ„์ƒˆ๊ฐ€ ์ค‘๋ณต์„ ๊ฐ€๋ฆฌ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ
           โ€ข   ์˜๋„์ ์ธ Copy & Paste
 ํ•ด์•ผ ํ•  ์ผ    โ€ข   ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ ๋˜๋Š” ํด๋ž˜์Šค์—์„œ ์ค‘๋ณต
               -> Extract Method
           โ€ข   ๋‘ ํ˜•์ œํด๋ž˜์Šค์— ์ค‘๋ณต
               -> Extract Method -> Pull Up Field or Pull Up Method -> Form Template Method
           โ€ข   ์„œ๋กœ ๊ด€๋ จ ์—†๋Š” ๋‘ ํด๋ž˜์Šค์— ์ค‘๋ณต
               -> Extract Class
           โ€ข   ๋ฌผ๋ฆฌ์ ์œผ๋ก  ๋™์ผํ•˜์ง€ ์•Š์ง€๋งŒ, ๊ฐ™์€ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰
               -> Substitute Algorithm

  ํšจ๊ณผ       โ€ข   ์ค‘๋ณต ์ค„์ž„
           โ€ข   ๋” ๋‚˜์€ ์ถ”์ƒํ™” ๋ฐ ๋” ์œ ์—ฐํ•œ ์ฝ”๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.


  ๊ธˆ๊ธฐ
์ค‘๋ณต
: ์ค‘๋ณต๋œ ์ฝ”๋“œ




           ์‹ค์Šต




56              Confidential   12/13/2011
์ค‘๋ณต
: ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–๋Š” ๋Œ€์ฒด ํด๋ž˜์Šค
  ํ•ญ๋ชฉ                                        ์„ค๋ช…
  ์ง•ํ›„      โ€ข   ๊ฐ™์€ ์ผ์„ ํ•˜๋Š” ๋‘ ํด๋ž˜์Šค์— ์‚ฌ์šฉ๋œ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ์„œ๋กœ ๋‹ค๋ฆ„


  ์›์ธ      โ€ข   ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋น„์Šทํ•œ ์ƒํ™ฉ์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ๋น„์Šทํ•œ ์ผ์„ ํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š”
              ๊ฒƒ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•จ


 ํ•ด์•ผ ํ•  ์ผ   โ€ข   ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํด๋ž˜์Šค๋“ค ์กฐ์œจ
              -> Rename Method ์ด์šฉ ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ์œ ์‚ฌํ•˜๊ฒŒ ๋งŒ๋“ฌ
              -> Move Method, Add Parameter, Parameterize Method ์ด์šฉ ํ”„๋กœํ† ์ฝœ ์œ ์‚ฌํ•˜๊ฒŒ ๋งŒ๋“ฌ
              -> Extract Superclass
              -> ๋‚˜๋จธ์ง€ ํด๋ž˜์Šค ์‚ญ์ œ
  ํšจ๊ณผ      โ€ข   ์ค‘๋ณต ์ถ•์†Œ




  ๊ธˆ๊ธฐ      โ€ข   ๋‘ ํด๋ž˜์Šค๊ฐ€ ๊ฐ๊ฐ ๋ณ„๊ฐœ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์†ํ•ด ์žˆ์„ ๊ฒฝ์šฐ.
์กฐ๊ฑด๋กœ์ง




58   Confidential   12/13/2011
์กฐ๊ฑด๋กœ์ง
: ๊ฐœ์š”
๏ฝ    ์‰ฝ๊ฒŒ ๋ฐœ์ƒ๋  ์—ฌ์ง€๊ฐ€ ํผ

๏ฝ    ์กฐ๊ฑด๋ฌธ์ด ๋ณต์žกํ•ด ์ง€๋ฉด?
     ๏ฝ   ๋‹ค์–‘ํ•œ ๊ฒฝ๋กœ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•จ
     ๏ฝ   ๋น ์ง€๋Š” ์กฐ๊ฑด์ด ๋ฐœ์ƒํ•  ์—ฌ์ง€๊ฐ€ ํผ

๏ฝ    ์กฐ๊ฑด ๋ฌธ์„ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด ํŠน์ˆ˜ ์กฐ๊ฑด๋ฌธ์„ ๋งŒ๋“ค๊ธฐ ์‰ฌ์›€

๏ฝ    ์กฐ๊ฑด๋กœ์ง์€ ๊ฐ์ฒด์ง€ํ–ฅ์  ์ ‘๊ทผ๋ฐฉ๋ฒ•์„ ์ถฉ๋ถ„ํžˆ ๊ณ ๋ คํ•˜์ง€ ๋ชปํ•ด
     ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Œ

๏ฝ        ๋‹ค๋ฃจ๋Š” ๋ƒ„์ƒˆ
     ๏ฝ   ๋ณต์žกํ•œ Boolean ํ‘œํ˜„์‹(Complicated Boolean Expression)
     ๏ฝ   ๊ฐ€์žฅ๋œ ์ƒ์†(Simulated Inheritance)

    59                                Confidential   12/13/2011
์กฐ๊ฑด๋กœ์ง
: ๋ณต์žกํ•œ Boolean ํ‘œํ˜„์‹
์ ์ˆ˜, ๊ธ‰์—ฌ, ๊ณต์ธ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋Œ€์ถœ ์Šน์ธ ์—ฌ๋ถ€๋ฅผ ๋ฆฌํ„ด
์›๋ณธ์ฝ”๋“œ)
 public boolean isAcceptable1(int score, int income, boolean authorized) {
   if (!((score > 700)
        || ((income >= 40000) && (income <= 100000) && authorized && (score > 500))
        || (income > 100000))
      )
     return false;
   else
     return true;
 }



                                DeMorganโ€™s Law

์ˆ˜์ •์ฝ”๋“œ)
public boolean isAcceptable2(int score, int income, boolean authorized)
 {
   if (((score <= 700)
        && ((income < 40000) || (income > 100000) || !authorized || (score <= 500))
        && (income <= 100000))
      )
     return false;
   else
     return true;
 }



 60                                                           Confidential   12/13/2011
Refactoring ๊ธฐ๋ฒ•
: Introduce Explaining Variable
์ ์ˆ˜, ๊ธ‰์—ฌ, ๊ณต์ธ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋Œ€์ถœ ์Šน์ธ ์—ฌ๋ถ€๋ฅผ ๋ฆฌํ„ด
์›๋ณธ์ฝ”๋“œ)
 public boolean isAcceptable1(int score, int income, boolean authorized) {
   if (!((score > 700)
        || ((income >= 40000) && (income <= 100000) && authorized && (score > 500))
        || (income > 100000))
      )
     return false;
   else
     return true;
 }



                   Introduce Explaining Variable
์ˆ˜์ •์ฝ”๋“œ)
 public boolean isAcceptable3(int score, int income, boolean authorized)
 {
   boolean hasMidRangeIncome = (income >= 40000) && (income <= 100000);
   boolean hasHighIncome = income > 100000;;
   boolean hasHighScore = score > 700;

     if (!( hasHighScore
          || (hasMidRangeIncome && authorized && (score > 500))
          || hasHighIncome)
        )
       return false;
     else
       return true;
 }
 61                                                               Confidential   12/13/2011
Refactoring ๊ธฐ๋ฒ•
 : Introduce Explaining Variable & DeMorganโ€™s Law
Introduce Explaining Variable)
 public boolean isAcceptable3(int score, int income, boolean authorized)
  {
    boolean hasMidRangeIncome = (income >= 40000) && (income <= 100000);
    boolean hasHighIncome = income > 100000;;
    boolean hasHighScore = score > 700;

      if (!( hasHighScore
           || (hasMidRangeIncome && authorized && (score > 500))
           || hasHighIncome)
         )
        return false;
      else
        return true;
  }
                         Introduce Explaining Variable
์ˆ˜์ •์ฝ”๋“œ)                         & DeMorganโ€™s Law
  public boolean isAcceptable4(int score, int income, boolean authorized)
  {
    boolean hasMidRangeIncome = (income >= 40000) && (income <= 100000);
    boolean hasHighIncome = income > 100000;;
    boolean hasHighScore = score > 700;

      if (!hasHighScore
           && (!hasMidRangeIncome || !authorized || !(score > 500))
           && !hasHighIncome)
        return false;
      else
        return true;
  }


  62                                                              Confidential   12/13/2011
Refactoring ๊ธฐ๋ฒ•
: Decompose Conditional
์›๋ณธ์ฝ”๋“œ)
 public boolean isAcceptable1(int score, int income, boolean authorized) {
   if (!((score > 700)
        || ((income >= 40000) && (income <= 100000) && authorized && (score > 500))
        || (income > 100000))
      )
     return false;
   else
     return true;
 }




                             Decompose Conditional


์ˆ˜์ •์ฝ”๋“œ)
 public boolean isAcceptable5(int score, int income, boolean authorized)
 {

     if (!(isHighScore(score)
          || ( isMidRangeIncome(income) && authorized && isMidScore(score))
          || isHighIncome(income))
        )
       return false;
     else
       return true;
 }




 63                                                              Confidential   12/13/2011
Refactoring ๊ธฐ๋ฒ•
: ์กฐ๊ฑด๋ฌธ ์น˜ํ™˜
Decompose Conditional)
  public boolean isAcceptable5(int score, int income, boolean authorized)
  {

      if (!(isHighScore(score)
           || ( isMidRangeIncome(income) && authorized && isMidScore(score))
           || isHighIncome(income))
         )
        return false;
      else
        return true;
  }



                              ์กฐ๊ฑด๋ฌธ ์น˜ํ™˜

์กฐ๊ฑด๋ฌธ ์น˜ํ™˜)
 public boolean isAcceptable6(int score, int income, boolean authorized)
 {

      if (isHighScore(score)
           || ( isMidRangeIncome(income) && authorized && isMidScore(score))
           || isHighIncome(income)
         )
        return true;
      else
        return false;
 }




 64                                                               Confidential   12/13/2011
Refactoring ๊ธฐ๋ฒ•
: Consolidate Conditional Expression
์กฐ๊ฑด๋ฌธ ์น˜ํ™˜)
 public boolean isAcceptable1(int score, int income, boolean authorized) {
    if (!((score > 700)
  public|| ((income >= 40000) && (income <= 100000) &&boolean authorized)
         boolean isAcceptable6(int score, int income, authorized && (score > 500))
  {     || (income > 100000))
       )
    ifreturn false;
       (isHighScore(score)
    else|| ( isMidRangeIncome(income) && authorized && isMidScore(score))
         || isHighIncome(income)
      return true;
  }    )
      return true;
    else
      return false;
  }



                 Consolidate Conditional Expression

Consolidate Conditional Expression)
 public boolean isAcceptable8(int score, int income, boolean authorized)
 {

     if (isHighScore(score) || isHighIncome(income)) //
       return true;
     if (isMidRangeIncome(income) && authorized && isMidScore(score))
       return true;
     else                                              Refactoring์„     ํ•จ์œผ๋กœ์จ
       return false;
 }
                                                      - ์กฐ๊ฑด์˜ ์žฌ์‚ฌ์šฉ์œผ๋กœ ์ค‘๋ณต ์ถ•์†Œ
                                                      - ์กฐ๊ฑด๋กœ์ง ๋ช…ํ™•ํ™”๋กœ ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„
                                                      - ์„ฑ๋Šฅ ํ–ฅ์ƒ์˜ ํฌ์ธํŠธ๋ฅผ ์ฐพ๊ธฐ ์‰ฌ์›Œ์ง
 65                                                            Confidential   12/13/2011
๋ณต์žกํ•œ Boolean ํ‘œํ˜„์‹




             ์‹ค์Šต




66                Confidential   12/13/2011
์กฐ๊ฑด๋กœ์ง
     : ๊ฐ€์žฅ๋œ ์ƒ์†๋ฌธ
                                                              ํ•ด์•ผ ํ•  ์ผ
public class Employee {
  private int type;
  private static final int ENGINEER = 0;
                                                          ๏ฝ
                                                                  1๋‹จ๊ณ„
  private static final int SALESMAN = 1;
  private static final int MANAGER = 2;                       ๏ฝ
 public Employee(int type) {
   this.type = type;                                              ๏ฝ   ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ์ดํ›„ Type
 }
                                                                      ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
                                                                          Replace Type Code with
 public int calculatePayment() {
    switch (type) {                                                   ๏‚จ
    case ENGINEER:
      return monthlySalary;                                               State/Strategy
                                                                      ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
    case SALESMAN:
      return monthlySalary + commission;                          ๏ฝ
    case MANAGER:
      return monthlySalary + bonus;                                   ๏‚จ   Replace Type Code with
    default:
      throw new RuntimeException("Incorrect Employee");                   Subclass
 }}

 public String getJobTitle() {                                ๏ฝ   2๋‹จ๊ณ„
    switch (type) {
    case ENGINEER:                                                ๏ฝ   Replace Conditional with
      return "Engineer";
    case SALESMAN:                                                    Class
      return "Salesman";
    case MANAGER:
      return "Manager";
    default:
      throw new RuntimeException("Incorrect Employee");
    }
 }}
      67                                                          Confidential   12/13/2011
๋ณต์žกํ•œ Boolean ํ‘œํ˜„์‹




             ์‹ค์Šต




68                Confidential   12/13/2011
ํด๋ž˜์Šค ์‚ฌ์ด์˜ ๋ƒ„์ƒˆ




69     Confidential   12/13/2011
๋ฐ์ดํ„ฐ




70   Confidential   12/13/2011
๋ฐ์ดํ„ฐ
: ๊ฐœ์š”
     ๋ฐฐ์†ก ์‹œ์Šคํ…œ์˜ Book ํด๋ž˜์Šค                                                  ์‡ผํ•‘๋ชฐ ์‹œ์Šคํ…œ์˜ Book ํด๋ž˜์Šค

            height            title          genre               category


        width                                         author

                     weight                                          price

                                                                             getDiscount()
      getRequiredDeliveryRoom()                        content
                                      Book




๏ฝ    ๋ฐ์ดํ„ฐ๋Š” ์˜์‚ฌ์†Œํ†ต์˜ ๊ธฐ์ ์ด ๋จ

๏ฝ    ๋ˆ„๋ฝ๋œ ํด๋ž˜์Šค, ์ž˜ ๋ชป ๋งŒ๋“ค์–ด์ง„ ํด๋ž˜์Šค์˜ ์ง•ํ›„

๏ฝ    ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ์กฐ์งํ™” ๋˜์–ด ์žˆ์œผ๋ฉด, ๊ทธ ์•ˆ์— ์†ํ•ด์žˆ๋Š” ํ–‰์œ„๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Œ

71                                                   Confidential   12/13/2011
๋ฐ์ดํ„ฐ
: ๊ธฐ๋ณธ ํƒ€์ž…์— ๋Œ€ํ•œ ๊ฐ•๋ฐ•๊ด€๋…
๏ฝ    ์ง•ํ›„
     ๏ฝ   ๊ธฐ๋ณธํƒ€์ž… ๋˜๋Š” ๊ธฐ๋ณธ ํƒ€์ž…์— ๊ฐ€๊นŒ์šด ํƒ€์ž…์˜ ์‚ฌ์šฉ
     ๏ฝ   ์ž‘์€ ์ •์ˆ˜๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ์—ด๊ฑฐํ˜• ๋ฐ ์ƒ์ˆ˜
     ๏ฝ   ํ•„๋“œ๋ช…์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด ์ƒ์ˆ˜

๏ฝ    ์›์ธ
     ๏ฝ   ๋ˆ„๋ฝ๋œ ํด๋ž˜์Šค
         ->Replace Data Value with Object
     ๏ฝ   ๊ฐ€์žฅ๋œ ํƒ€์ž…
         -> ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด: Replace Type Code with
         Class
     ๏ฝ   ๊ฐ€์žฅ๋œ ํ•„๋“œ์ ‘๊ทผ์ž : Replace Array with Object
    72                          Confidential   12/13/2011
Refactoring ๊ธฐ๋ฒ•
  : Replace Data with Object
                                                                                                     User

                                                                                         +firstName: String
                                                                                         +lastName: String




         Order                                                                                   Customer
                             Replace Data with
+orderNumber: String              Object                 Order                           +firstName: String
+customeFirstNamer: String                                           1            1      +lastName: String
+customerLastName: String                        +orderNumber
+price: float
+addressState: String                                                                             Address
+addressCity: String
                                                                                         +state
+addressStreet: String                                                                   +city
+addressZipCode1: String                                                                 +zipCode1
+addressZipCode 2: String                                            1            1
                                                                                         +zipCode2
+telAreaCode: String
+telNumber: String                                                                       +getDeliveryCost()



                                                                         home
                                                                                                  Contact

                                                                         office          +areaCode
                                                                                         +number




   73                                                            Confidential         12/13/2011
Refactoring ๊ธฐ๋ฒ•
 : Replace Array with Object
    ๋ฐฐ์—ด์˜ ์š”์†Œ๋“ค์ด ์„œ๋กœ ๋‹ค๋ฅธ ๋œป์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด
    โ†’ ๋ฐฐ์—ด์„ ๊ฐ๊ฐ์˜ ์š”์†Œ์— ๋Œ€ํ•œ ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋กœ ๋ฐ”๊ฟ”๋ผ

String[] row = new String[3];   Performance row = new Performance();
   row [0] = "Liverpool";          row.setName("Liverpool");
   row [1] = "15";                 row.setWins("15");




๏ฝ    ๋ฐฐ์—ด์€ ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š” ๋น„์Šทํ•œ ๊ฐ์ฒด๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ
     ๋ชจ์—ฌ ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ๋งŒ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•จ




    74                                Confidential   12/13/2011
๋ฐ์ดํ„ฐ
: ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค
๏ฝ    public field ๋˜๋Š” ๋‹จ์ˆœ getter/setter๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Œ

๏ฝ    ์›์ธ
     ๏ฝ   ๋ฐ์ดํ„ฐ ๋ฉ์–ด๋ฆฌ๋ฅผ ํด๋ž˜์Šค๋กœ ์ถ”์ถœํ•˜๋Š” ๊ณผ์ •์—์„œ ์ƒ๊น€

๏ฝ    ํ•ด์•ผ ํ•  ์ผ
     ๏ฝ   1๋‹จ๊ณ„-๊ธฐ๋ณธ ํ•„๋“œ ์บก์Šํ™” : Encapsulate Field
     ๏ฝ   2๋‹จ๊ณ„-๋ถˆํ•„์š”ํ•œ ์„ธํŒ…๋ฉ”์†Œ๋“œ ์ œ๊ฑฐ : Remove Setting Method
     ๏ฝ   3๋‹จ๊ณ„-Collection ํ•„๋“œ ์บก์Šํ™” : Encapsulate Collection
     ๏ฝ   4๋‹จ๊ณ„-ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ ๊ด€๋ จ ๋กœ์ง ์ด๋™ : Extract Method and Move
         Method
     ๏ฝ   5๋‹จ๊ณ„-์ค‘๋ณต์ •๋ฆฌ

๏ฝ    ์ฃผ์˜์ 
     ๏ฝ   ์ž์ฃผ ์ ‘๊ทผ๋˜๋Š” ํ•„๋“œ์˜ ๊ฒฝ์šฐ, ์„ฑ๋Šฅ์ƒ ๋ฌธ์ œ ์ด์œ  ๋•Œ๋ฌธ์—, public ํ•„๋“œ๋กœ ๋‚จ๊ฒจ
         ์งˆ ๊ฒฝ์šฐ ์žˆ์Œ
     ๏ฝ   ๋ฆฌํ”Œ๋ ‰์…˜ ๋˜๋Š”, getter/setter ๋ฉ”์„œ๋“œ์— ์˜์กด

    75                                Confidential   12/13/2011
Refactoring ๊ธฐ๋ฒ•
: Encapsulate Collection
    Collection์„ get/setํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด
    โ†’ ๊ทธ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ฝ๊ธฐ์ „์šฉ ๋ทฐ(read-only view)๋ฅผ ๋ฆฌํ„ดํ•˜๋„๋ก ๋งŒ๋“ค๊ณ , add/remove ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋ผ




๏ฝ    ์œ„ํ—˜
     ๏ฝ   Collection์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์†Œ๋“œ(get)
         ๏ฝ   ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ๋ฆฌํ„ด๋ฐ›์€ Collection์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ
             ๋‹ค.


     ๏ฝ   Collection์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š” ๋ฉ”์†Œ๋“œ(set)
         ๏ฝ   Collection์„ ๋„˜๊ฒจ์ค€ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ Collection์˜ ๋ฐ์ดํ„ฐ๋ฅผ
             ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
    76                                   Confidential   12/13/2011
Encapsulate Collection




                   ์‹ค์Šต




77                       Confidential   12/13/2011
์ƒ์†




78   Confidential   12/13/2011
์ƒ์†
: ๊ฑฐ๋ถ€๋œ ์œ ์‚ฐ
      ํ•ญ๋ชฉ                                       ์„ค๋ช…

      ์ง•ํ›„      โ€ข   ํ•˜์œ„ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†ํ•œ ๋ฉ”์†Œ๋“œ์—์„œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค.(๋ช…์‹œ์  ๊ฑฐ๋ถ€)
              โ€ข   ํ•˜์œ„ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†ํ•œ ๋ฉ”์†Œ๋“œ์—์„œ ์•„๋ฌด์ผ๋„ ์•ˆํ•œ๋‹ค.(์•”์‹œ์  ๊ฑฐ๋ถ€)
              โ€ข   ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•˜์œ„ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค.
              โ€ข   ์ƒ์†๊ตฌ์กฐ๊ฐ€ ์ ์ ˆํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค์™€ Is-A ๊ด€๊ณ„๊ฐ€ ์•„๋‹ˆ๋‹ค
      ์›์ธ      โ€ข   ๊ตฌํ˜„์ƒ์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด์„œ๋งŒ ์ƒ์†์„ ์‚ฌ์šฉ




     ํ•ด์•ผ ํ•  ์ผ   โ€ข   ํ˜ผ๋™๋˜์ง€ ์•Š์œผ๋ฉด ๊ทธ๋Œ€๋กœ ๋†”๋‘˜ ์ˆ˜ ์žˆ์Œ
              โ€ข   ์ƒ์†๊ด€๊ณ„ ์œ ์ง€ํ•  ํ•„์š” ์—†์œผ๋ฉด, Replace Inheritance with Delegation ์ ์šฉ
              โ€ข   ์ƒ์†๊ตฌ์กฐ ์žฌ ์กฐ์ •
                  Extract Subclass, Push Down Field, Push Down Method

      ํšจ๊ณผ

      ๊ธˆ๊ธฐ      โ€ข   ๋•Œ๋•Œ๋กœ, ๊ฑฐ๋ถ€๋œ ์œ ์‚ฐ์€ ์ƒˆ๋กœ์šด ํƒ€์ž…์˜ ํญ์ฃผ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์˜๋„์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜๋„ ์žˆ๋‹ค.
                  -> Java ์˜ ์ฝ๊ธฐ์ „์šฉ Collection




79                                              Confidential   12/13/2011
์ƒ์†
: ๊ฑฐ๋ถ€๋œ ์œ ์‚ฐ

        Drawable                                     Drawable

     +draw()                Line ์ถ”๊ฐ€               +draw()
                                                                                                   Exception
     +getArea()                                   +getArea()
                                                                                                  ๋ฐœ์ƒ์‹œํ‚ค๊ฑฐ๋‚˜,
                                                                                                   0์„ ๋ฆฌํ„ด
Rectangle          Circle                  Rectangle               Circle               Line

                                                                                   +getArea()



                                                                             ์ƒ์†๊ตฌ์กฐ ์žฌ์กฐ์ •



                                                           Drawable

                                                       +draw()




                                                  Shape                     Line

                                              +getArea()              +getLength()




                                      Rectangle           Circle




80                                                         Confidential              12/13/2011
Liskov Substitution Principle(LSP)
โ€œFunctions that use pointers or references to base classes must be able
 to use objects of derived classes without knowing it.โ€
                                ๊ณ ์œ  ํŠน์„ฑ์„ ๊ณ ๋ คํ•˜๋ฉด, Square๋Š” Rectangle์˜ ์ผ๋ถ€์ž„์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์—†์–ด
                                ๋ณด์ธ๋‹ค.
                                -> ํ•˜์ง€๋งŒ, ํ–‰์œ„๋ฅผ ๊ณ ๋ คํ•˜๋ฉด LSP์— ์œ„๋ฐฐ๋œ๋‹ค.
               Shape
                                   Rectangle.setWidth() ์™€ Square.setWidth()๊ฐ€ ํ•˜๋Š” ์ผ์€ ๋‹ค๋ฅผ ๊ฒƒ์ด๋‹ค.
           +getArea()



                                                                                Shape

 Rectangle             Circle                                               +getArea()
                                ์ƒ์†๊ตฌ์กฐ ์žฌ์กฐ์ •
+width
+height
+setWidth()
+setHeight()
+getWidth()                                        Square         Rectangle             Circle
+getHeight()                                     +width          +width
                                                 +height         +height
                                                 +setLength()    +setWidth()
                                                                 +setHeight()
  Square                                                         +getWidth()
                                                                 +getHeight()




โ€œOOD์—์„œ IS-A๊ด€๊ณ„๋Š” ์™ธ์ ์œผ๋กœ ๋ณด์—ฌ์ง€๋Š” ํ–‰์œ„์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋„์ถœํ•˜์—ฌ์•ผ ํ•œ๋‹ค.โ€

81                                                              Confidential        12/13/2011
Refactoring ๊ธฐ๋ฒ•
: Replace Inheritance with Delegation
์„œ๋ธŒํด๋ž˜์Šค๊ฐ€ ์ˆ˜ํผํด๋ž˜์Šค ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ผ๋ถ€๋ถ„๋งŒ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ
์ƒ์†๋ฐ›๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒฝ์šฐ
โ†’ ์ˆ˜ํผํด๋ž˜์Šค๋ฅผ ์œ„ํ•œ ํ•„๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฉ”์†Œ๋“œ๋“ค์ด ์ˆ˜ํผํด๋ž˜์Šค์— ์œ„์ž„ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•œ ํ›„ ์ƒ์† ๊ด€๊ณ„๋ฅผ ์ œ๊ฑฐ




82                                Confidential   12/13/2011
์ƒ์†
: ๋ถ€์ ์ ˆํ•œ ์นœ๋ฐ€(ํ•˜์œ„ ํด๋ž˜์Šค ํ˜•ํƒœ)
      ํ•ญ๋ชฉ                                ์„ค๋ช…

      ์ง•ํ›„      โ€ข   ์–ด๋–ค ํด๋ž˜์Šค์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋‚ด์ ์ธ ๋ถ€๋ถ„(private์ด์–ด์•ผ๋งŒ ํ•˜๋Š”)์— ์ ‘๊ทผํ•œ๋‹ค.



      ์›์ธ      โ€ข   ๋ถ€๋ชจํด๋ž˜์Šค์™€ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”์ด์ƒ์œผ๋กœ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋‹ค.




     ํ•ด์•ผ ํ•  ์ผ   โ€ข   ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ œ์–ด๋˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ถ€๋ชจํด๋ž˜์Šค์˜ ํ•„๋“œ์— ์ ‘๊ทผ
                  -> Self Encapsulate Field
              โ€ข   ๋ถ€๋ชจํด๋ž˜์Šค๊ฐ€ ์ž์‹ ํด๋ž˜์Šค๋“ค์ด ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •์˜ ๊ฐ€๋Šฅ
                  -> Form Template Method
              โ€ข   ๊ฒฐํ•ฉ๋„๋ฅผ ๋”์šฑ ์ค„์ผ ํ•„์š”
                  -> Replace Inheritance with Delegation
      ํšจ๊ณผ

      ๊ธˆ๊ธฐ




83                                      Confidential   12/13/2011
Refactoring ๊ธฐ๋ฒ•
: Form Template Method
๊ฐ๊ฐ์˜ ์„œ๋ธŒํด๋ž˜์Šค์—, ๋™์ผํ•œ ์ˆœ์„œ๋กœ ๋น„์Šทํ•œ ๋‹จ๊ณ„๋ฅผ ํ–‰ํ•˜์ง€๋งŒ, ๋‹จ๊ณ„๊ฐ€ ์™„์ „ํžˆ
๊ฐ™์ง€๋Š” ์•Š์€ ๋‘ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด,
โ†’ ๊ทธ ๋‹จ๊ณ„๋ฅผ ๋™์ผํ•œ ์‹œ๊ทธ๋„ˆ์ฒ˜๋ฅผ ๊ฐ€์ง„ ๋ฉ”์†Œ๋“œ๋กœ ๋งŒ๋“ค์–ด๋ผ,
 ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์›๋ž˜์˜ ๋‘ ๋ฉ”์†Œ๋“œ๋Š” ์„œ๋กœ ๊ฐ™์•„์ง€๋ฏ€๋กœ, ์ˆ˜ํผํด๋ž˜์Šค๋กœ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค.




84                              Confidential   12/13/2011
์ƒ์†
: ๊ฒŒ์œผ๋ฅธ ํด๋ž˜์Šค
      ํ•ญ๋ชฉ                                  ์„ค๋ช…

      ์ง•ํ›„      โ€ข   ํด๋ž˜์Šค๊ฐ€ ๋งŽ์€ ์ผ์„ ํ•˜์ง€ ์•Š๊ณ , ๋Œ€๋ถ€๋ถ„ Delegationํ•œ๋‹ค.



      ์›์ธ      โ€ข   ๋ถ€๋ชจํด๋ž˜์Šค์™€ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”์ด์ƒ์œผ๋กœ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋‹ค.




     ํ•ด์•ผ ํ•  ์ผ   โ€ข   ๋ถ€๋ชจํด๋ž˜์Šค๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋ฉด
                  -> Collapse Hierarchy
              โ€ข   ๊ทธ ์ด์™ธ
                  -> Inline Class

      ํšจ๊ณผ

      ๊ธˆ๊ธฐ      โ€ข   ๋•Œ๋กœ๋Š” ์˜๋„๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ ๊ฒŒ์œผ๋ฅธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.




85                                         Confidential   12/13/2011
์ฑ…์ž„




86   Confidential   12/13/2011
์ฑ…์ž„
: ๊ฐœ์š”
๏ฝ    ๋‹ค๋ฃจ๋Š” ๋ƒ„์ƒˆ
     ๏ฝ   ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š•์‹ฌ
     ๏ฝ   ๋ถ€์ ์ ˆํ•œ ์นœ๋ฐ€
     ๏ฝ   ๋ฉ”์‹œ์ง€ ์ฒด์ธ
     ๏ฝ   ๋ฏธ๋“ค๋งจ




    87               Confidential   12/13/2011
์ฑ…์ž„
: ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š•์‹ฌ & ๋ถ€์ ์ ˆํ•œ ์นœ๋ฐ€
            Class A               Class B              Class A                     Class B
       ..                     ..                  ..                            attributeA
       amethod()              getX()              amethod()
       bmethod()              getY()              bmethod()                     amethod()



                      ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š•์‹ฌ                                  ๋ถ€์ ์ ˆํ•œ ์นœ๋ฐ€


      ํŠน์ • ํด๋ž˜์Šค ๋‚ด์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋™์ž‘์„ ์œ„ํ•ด ๋‹ค๋ฅธ ํด            ํŠน์ • ํด๋ž˜์Šค์—์„œ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ private ๋ฉค๋ฒ„๋ฅผ ์ ‘๊ทผ
์ง•ํ›„
      ๋ž˜์Šค์— ์žˆ๋Š” ์ •๋ณด๋ฅผ ๋งŽ์ด ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ               ํ•œ๋‹ค.



                                            ๋‘ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ํด๋ž˜์Šค๊ฐ€ ์—‰์ผœ ์žˆ๋‹ค๋ฉด
                                             - Move Method
                                            ์ค‘์žฌํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—‰์ผœ์žˆ๋‹ค๋ฉด
ํ•ด๊ฒฐ์ฑ…   Move Method                            - Extract Hierarchy-> Hide Delegate
                                            ํด๋ž˜์Šค๋“ค์ด ์„œ๋กœ ๊ฐ€๋ฅดํ‚ค๊ณ  ์žˆ๋‹ค๋ฉด
                                             - Change Bidirectional Reference to Unidirectional




88                                                 Confidential    12/13/2011
Refactoring ๊ธฐ๋ฒ•
: Hide Delegate
    ์–ด๋–ค ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์œ„์ž„ ํด๋ž˜์Šค๋ฅผ
    ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ,
     โ†’ ์„œ๋ฒ„์— ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋Œ€๋ฆฌ๊ฐ์ฒด
    (Delegate)๋ฅผ ์ˆจ๊ฒจ๋ผ




๏ฝ    ์ง๊ต์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค.
     ๏ฝ   Client ํด๋ž˜์Šค๊ฐ€ ๋” ์ด์ƒ Department์˜ ๋ณ€ํ™”์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ๊ฐ–
         ์ง€ ์•Š๋Š”๋‹ค.

๏ฝ    Law of Demeter๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

๏ฝ    ๋ถ€์ž‘์šฉ : ๊ฒŒ์œผ๋ฅธ ํด๋ž˜์Šค๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.
    89                           Confidential   12/13/2011
Refactoring ๊ธฐ๋ฒ•
: Change Bidirectional Association to Unidirectional
    ์„œ๋กœ ๋งํฌ๋ฅผ ๊ฐ€์ง€๋Š” ๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค์—์„œ ํ•œ์ชฝ์ด ๋‹ค๋ฅธ์ชฝ์„ ๋” ์ด์ƒ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์„๋•Œ
    โ†’ ๋ถˆํ•„์š”ํ•œ ๋งํฌ๋ฅผ ์ œ๊ฑฐํ•˜๋ผ.




๏ฝ    Bidirectional Association์€ ์‚ฌ์šฉํ•˜๋Š” ์ธก๋ฉด์—์„  ํŽธํ•˜๋‹ค.

๏ฝ    ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ„ํ—˜์„ ์ง€๋‹˜
     ๏ฝ   ๋ณต์žก์„ฑ ์ฆ๊ฐ€ -> ๋ฒ„๊ทธ๋ฐœ์ƒ์˜ ์›์ฒœ
     ๏ฝ   Zombie ๊ฐ์ฒด ์ƒ์„ฑ ์‹ค์ˆ˜
     ๏ฝ   ์ž์—ฐ์ ์œผ๋กœ Cluster๊ฒฐ์„ฑ -> Coupling ์ฆ๊ฐ€

    90                             Confidential   12/13/2011
์ฑ…์ž„
 : ๋ฉ”์‹œ์ง€ ์ฒด์ธ & ๋ฏธ๋“ค๋งจ

                                            Remove Middleman




                                              Hide Delegate

                      ๋ฉ”์‹œ์ง€ ์ฒด์ธ                                          ๋ฏธ๋“ค๋งจ

      ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒจํ„ด์ด ๋‚˜ํƒ€๋‚œ๋‹ค.                           ์–ด๋–ค ํด๋ž˜์Šค์— ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฉ”์„œ๋“œ์—์„œ ๋‹ค๋ฅธ ๊ฐ์ฒด
 ์ง•ํ›„   person.getDepartment().getManager()        ์— ์žˆ๋Š” ๋™์ผํ•œ ๋ฉ”์„œ๋“œ๋‚˜ ์œ ์‚ฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค


      ๏‚ง Delegate ๊ฐ์ฒด์— ์ƒˆ๋กœ์šด Feature๊ฐ€ ์ƒ๊ฒจ๋„            ๏‚ง ๊ฐ์ฒด๋“ค๊ฐ„์˜ ์ปคํ”Œ๋ง์ด ๊ฐ์†Œํ•œ๋‹ค.
 ์žฅ์      Server๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์ด ํ•„์š”์—†๋‹ค.                      ๏‚ง ์ƒ์„ฑํ•ด์•ผ ํ•  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์ข€ ๋” ์ ๋‹ค.


      ๏‚ง ๊ฐ์ฒด๋“ค๊ฐ„์˜ ์ปคํ”Œ๋ง์ด ์ฆ๊ฐ€ํ•œ๋‹ค.                         ๏‚ง Delegate ๊ฐ์ฒด์— ์ƒˆ๋กœ์šด Feature๊ฐ€ ์ƒ๊ธฐ๋ฉด Server
 ๋‹จ์    ๏‚ง ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•  ์ผ€์ด์Šค๊ฐ€ ์ข€ ๋” ๋งŽ๋‹ค.                       ๊ฐ์ฒด์—๋„ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค.


      Hide Delegate๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด์™€            Remove Middleman ์„ ํ†ตํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง์ ‘
ํ•ด๊ฒฐ์ฑ…
      ์ข…์†์ ์ด๊ฒŒ ๋งŒ๋“ฌ                                   ํ˜ธ์ถœํ•˜๊ฒŒ ํ•จ


โ˜ž ์ •๋‹ต์€ ์—†๋‹ค! ์ฝ”๋“œ์˜ ์ง„ํ™”์— ๋”ฐ๋ผ, ์ƒํ™ฉ์— ์ ํ•ฉํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž.
 91                                                    Confidential   12/13/2011
๋ณ€๊ฒฝ ์ˆ˜์šฉํ•˜๊ธฐ




92   Confidential   12/13/2011
๋ณ€๊ฒฝ ์ˆ˜์šฉํ•˜๊ธฐ
: ๊ฐœ์š”
๏ฝ    ๋‹ค๋ฃจ๋Š” ๋ƒ„์ƒˆ
     ๏ฝ   ์—ฌ๋Ÿฌ ์›์ธ์— ์˜ํ•œ ๋ณ€๊ฒฝ(Divergent Change)
     ๏ฝ   ํ‰ํ–‰์ƒ์†๊ณ„์ธต๊ตฌ์กฐ(Parallel Inheritance Hierarchies)
     ๏ฝ   ์กฐํ•ฉ์  ํญ๋ฐœ(Combinational Explosion)
     ๏ฝ   ์‚ฐํƒ„์ด ์ˆ˜์ˆ (Shotgun Surgery)




    93                              Confidential   12/13/2011
๋ณ€๊ฒฝ ์ˆ˜์šฉํ•˜๊ธฐ
: ์—ฌ๋Ÿฌ ์›์ธ์— ์˜ํ•œ ๋ณ€๊ฒฝ(Divergent Change)
                       Shape                                     Shape                                      ShapWriter

                   +draw()                            ๊ธฐ๋ณธ ์„  ๋‘๊ป˜๋ฅผ
                                                            +draw()                                        +persist()
                   +persist()
                                                     โ€˜5pxโ€™๋กœ ํ–ˆ์œผ๋ฉด..                                 Binaryํ˜•ํƒœ ๋ฟ ์•„๋‹ˆ๋ผ,
                                                                                                  XMLํ˜•ํƒœ๋กœ๋„ ์ €์žฅ์ด
                                                                                                       ๋˜์—ˆ์œผ๋ฉด..


                                                  Rectangle      Circle     Triangle     RectangleWriter    CircleWriter    TriangleWriter
     Rectangle         Circle        Triangle
                                                 +draw()      +draw()     +draw()        +persistence()    +persistence()   +persistence()
    +draw() V      +draw() V      +draw()V
    +persist() V   +persist() V   +persist() V




๏ฝ    ์ง•ํ›„
     ๏ฝ     ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ์ด์œ ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

๏ฝ    ์›์ธ
     ๏ฝ     ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ๋‘ ๊ฐ€์ง€ ์ด์ƒ์˜ ์ฑ…์ž„์„ ๊ฐ–๋Š”๋‹ค.

๏ฝ    ํ•ด์•ผ ํ•  ์ผ
     ๏ฝ     Extract Class๋ฅผ ํ†ตํ•ด ์ฑ…์ž„์„ ๋ณ„๋„์˜ Class๋กœ ๋ฝ‘์•„๋‚ธ๋‹ค.

    94                                                                        Confidential   12/13/2011
๋ณ€๊ฒฝ ์ˆ˜์šฉํ•˜๊ธฐ
: ์—ฌ๋Ÿฌ ์›์ธ์— ์˜ํ•œ ๋ณ€๊ฒฝ ์‹๋ณ„๋ฒ•

๏ฝ    ์ง๊ด€์ ์œผ๋กœ

๏ฝ    SRP Test

๏ฝ    Method๋ฅผ Uses๊ด€๊ณ„๋กœ ๊ทธ๋ฃนํ™”
     ๋˜๋Š”, Used๊ด€๊ณ„๋กœ ๊ทธ๋ฃนํ™”

๏ฝ    ํ˜•์ƒ๊ด€๋ฆฌ History ๋ถ„์„
     ๏ฝ   ๊ฐ™์ด ๋ณ€๊ฒฝ๋˜๋Š” ํด๋ž˜์Šค ๋˜๋Š” ๋ฉ”์„œ๋“œ์˜ ๊ทธ๋ฃน์ด ์ƒ์ดํ•˜๋‹ค๋ฉด?



    95                     Confidential   12/13/2011
๋ณ€๊ฒฝ ์ˆ˜์šฉํ•˜๊ธฐ
: ํ‰ํ–‰์ƒ์†๊ณ„์ธต๊ตฌ์กฐ
                               Shape                                      ShapWriter

                            +draw()                                      +persist()




                Rectangle      Circle     Triangle   RectangleWriter      CircleWriter    TriangleWriter

               +draw()      +draw()     +draw()      +persistence()      +persistence()   +persistence()




๏ฝ    ์ง•ํ›„
     ๏ฝ   ์–ด๋–ค ๊ณ„์ธต๊ตฌ์กฐ์˜ ํ•˜์œ„ํด๋ž˜์Šค ์ƒ์„ฑ -> ๋˜ ๋‹ค๋ฅธ ๊ณ„์ธต๊ตฌ์กฐ์˜ ํ•˜์œ„ํด๋ž˜์Šค ์ƒ์„ฑํ•„์š”

๏ฝ    ์›์ธ
     ๏ฝ   ํŽธ์˜์ƒ ๋™์ผํ•œ ๊ณ„์ธต๊ตฌ์กฐ๊ฐ€ ์ƒ์„ฑ๋จ
     ๏ฝ   ๋Œ€๋ถ€๋ถ„ ์ง์„ ์ด๋ฃจ๋Š” ํด๋ž˜์Šค๋Š” ๋™์ผํ•œ ๊ฒฐ์ •์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์ธก๋ฉด์„ ํ‘œํ˜„ํ•œ๋‹ค.

๏ฝ    ํ•ด์•ผ ํ•  ์ผ
     ๏ฝ   Move Method, Move Field๋ฅผ ํ•œ์ชฝ ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ์ œ๊ฑฐ

    96                                                                 Confidential         12/13/2011
๋ณ€๊ฒฝ ์ˆ˜์šฉํ•˜๊ธฐ
    : ์กฐํ•ฉ์  ํญ๋ฐœ
                                                             ShapeWriter

             Triangle                                        +persist()
              ์ถ”๊ฐ€?                                                                                                DB ์ถ”๊ฐ€?


                                        Rectangle                                       Circle

                                       +draw()                                       +draw()




                        RectangleExcelWriter     RectangleXmlWriter   RectangleExcelWriter       RectangleXmlWriter




๏ฝ    ์ง•ํ›„
     ๏ฝ   ์ƒˆ๋กœ์šด ํ•˜์œ„ํด๋ž˜์Šค ์ถ”๊ฐ€๋ฅผ ์œ„ํ•ด์„œ ๊ฐ™์€ ๊ณ„์ธต๊ตฌ์กฐ์˜ ์—ฌ๊ธฐ์ €๊ธฐ ๋‹ค์ˆ˜์˜ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ

๏ฝ    ์›์ธ
     ๏ฝ   ๋‘ ๊ฐœ ์ด์ƒ์˜ ๊ด€์ (or Concern)์ด ํ•˜๋‚˜์˜ ๊ณ„์ธต๊ตฌ์กฐ๋กœ ๋ชจ๋ธ๋ง ๋˜์–ด ์žˆ๋‹ค.

๏ฝ    ํ•ด์•ผ ํ•  ์ผ
     ๏ฝ   Replace Inheritance with Delegation
     ๏ฝ   Tease Apart Inheritance



    97                                                                                       Confidential             12/13/2011
Refactoring ๊ธฐ๋ฒ•
: Tease Apart Inheritance
    ๋‘ ๊ฐ€์ง€ ์ž‘์—…์„ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ์ƒ์† ๊ตฌ์กฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
    โ†’ ๋‘ ๊ฐœ์˜ ์ƒ์†๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค๊ณ , ํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ํ•˜๋‚˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์œ„์ž„ํ•˜๋ผ.




๏ฝ    ์–ด๋–ค ์ž‘์—…์ด ๋” ์ค‘์š”ํ•œ์ง€๋ฅผ ๋”ฐ์ ธ์„œ, ์ค‘์š”ํ•œ ์ž‘์—…์„ ๋‚จ
     ๊ธฐ๊ณ  ๋‚˜๋จธ์ง€ ์ž‘์—…์„ ์ƒˆ๋กœ์šด ์ƒ์†๊ตฌ์กฐ๋กœ ์˜ฎ๊ธด๋‹ค.




    98                              Confidential   12/13/2011
๋ณ€๊ฒฝ ์ˆ˜์šฉํ•˜๊ธฐ
: ์‚ฐํƒ„์ด ์ˆ˜์ˆ (Shotgun Surgery)
๏ฝ    ์ง•ํ›„
     ๏ฝ   ๊ฐ„๋‹จํ•œ ๋ณ€๊ฒฝ์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

๏ฝ    ์›์ธ
     ๏ฝ   ํ•˜๋‚˜์˜ ์ฑ…์ž„์ด ์—ฌ๋Ÿฌ ๊ตฐ๋ฐ ๋ถ„์‚ฐ๋˜์–ด ์žˆ๋‹ค.
     ๏ฝ   ์ฑ…์ž„ ์ „์ฒด๋ฅผ ๋‹ด๋‹นํ•  ํด๋ž˜์Šค๊ฐ€ ๋ˆ„๋ฝ๋˜์–ด ์žˆ๋‹ค.

๏ฝ    ํ•ด์•ผ ํ•  ์ผ
     ๏ฝ   ์ฑ…์ž„์„ ๋‹ด๋‹นํ•  ํด๋ž˜์Šค ์ƒ์„ฑ
     ๏ฝ   Move Method, Move Field๋ฅผ ํ†ตํ•ด ๊ด€๋ จ ๋ฉ”์†Œ๋“œ & ํ•„๋“œ ์ด๋™

๏ฝ    ์˜ˆ
     ๏ฝ   ๊ตฌ์„ฑ์ •๋ณด
     ๏ฝ   ๋กœ๊น…์ •๋ณด
     ๏ฝ   Persistence ๊ด€๋ จ ์ •๋ณด

    99                              Confidential   12/13/2011
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋ž˜์Šค




100    Confidential   12/13/2011
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋ž˜์Šค
: ๊ฐœ์š”
๏ฝ    ์ง•ํ›„
     ๏ฝ    ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์—†๋‹ค.


๏ฝ    ํ•ด์•ผ ํ•  ์ผ
     ๏ฝ    ํ•œ ๋‘๊ฐœ์˜ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ ํ•„์š”
          ๏ฝ   Introduce Foreign Method
     ๏ฝ    ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฉ”์„œ๋“œ ํ•„์š”
          ๏ฝ   Introduce Local Extension
     ๏ฝ    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ ˆ์ด์–ด
          ์ถ”๊ฐ€                                        [Introduce Local Extension]




    101                                   Confidential   12/13/2011

More Related Content

What's hot

.NET 7 ใงใฎ ASP.NET Core Blazor ใฎๆ–ฐๆฉŸ่ƒฝใƒ”ใƒƒใ‚ฏใ‚ขใƒƒใƒ—
.NET 7 ใงใฎ ASP.NET Core Blazor ใฎๆ–ฐๆฉŸ่ƒฝใƒ”ใƒƒใ‚ฏใ‚ขใƒƒใƒ—.NET 7 ใงใฎ ASP.NET Core Blazor ใฎๆ–ฐๆฉŸ่ƒฝใƒ”ใƒƒใ‚ฏใ‚ขใƒƒใƒ—
.NET 7 ใงใฎ ASP.NET Core Blazor ใฎๆ–ฐๆฉŸ่ƒฝใƒ”ใƒƒใ‚ฏใ‚ขใƒƒใƒ—ไธ€ๅธŒ ๅคง็”ฐ
ย 
ใƒ•ใƒชใƒผใงใงใใ‚‹ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃWeb็ทจ(SQLMใ‚๏ฝใ‚’ๆฅฝใ—ใ‚‚ใ†)
ใƒ•ใƒชใƒผใงใงใใ‚‹ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃWeb็ทจ(SQLMใ‚๏ฝใ‚’ๆฅฝใ—ใ‚‚ใ†)ใƒ•ใƒชใƒผใงใงใใ‚‹ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃWeb็ทจ(SQLMใ‚๏ฝใ‚’ๆฅฝใ—ใ‚‚ใ†)
ใƒ•ใƒชใƒผใงใงใใ‚‹ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃWeb็ทจ(SQLMใ‚๏ฝใ‚’ๆฅฝใ—ใ‚‚ใ†)abend_cve_9999_0001
ย 
Unicodeใซใ‚ˆใ‚‹XSSใจ SQLใ‚คใƒณใ‚ธใ‚งใ‚ฏใ‚ทใƒงใƒณใฎๅฏ่ƒฝๆ€ง
Unicodeใซใ‚ˆใ‚‹XSSใจSQLใ‚คใƒณใ‚ธใ‚งใ‚ฏใ‚ทใƒงใƒณใฎๅฏ่ƒฝๆ€งUnicodeใซใ‚ˆใ‚‹XSSใจSQLใ‚คใƒณใ‚ธใ‚งใ‚ฏใ‚ทใƒงใƒณใฎๅฏ่ƒฝๆ€ง
Unicodeใซใ‚ˆใ‚‹XSSใจ SQLใ‚คใƒณใ‚ธใ‚งใ‚ฏใ‚ทใƒงใƒณใฎๅฏ่ƒฝๆ€งHiroshi Tokumaru
ย 
AWS + Windows(C#)ใงๆง‹็ฏ‰ใ™ใ‚‹.NETๆœ€ๅ…ˆ็ซฏๆŠ€่ก“ใซใ‚ˆใ‚‹ใƒใ‚คใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นใ‚ฆใ‚งใƒ–ใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณ้–‹็™บๅฎŸ่ทต
AWS + Windows(C#)ใงๆง‹็ฏ‰ใ™ใ‚‹.NETๆœ€ๅ…ˆ็ซฏๆŠ€่ก“ใซใ‚ˆใ‚‹ใƒใ‚คใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นใ‚ฆใ‚งใƒ–ใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณ้–‹็™บๅฎŸ่ทตAWS + Windows(C#)ใงๆง‹็ฏ‰ใ™ใ‚‹.NETๆœ€ๅ…ˆ็ซฏๆŠ€่ก“ใซใ‚ˆใ‚‹ใƒใ‚คใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นใ‚ฆใ‚งใƒ–ใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณ้–‹็™บๅฎŸ่ทต
AWS + Windows(C#)ใงๆง‹็ฏ‰ใ™ใ‚‹.NETๆœ€ๅ…ˆ็ซฏๆŠ€่ก“ใซใ‚ˆใ‚‹ใƒใ‚คใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นใ‚ฆใ‚งใƒ–ใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณ้–‹็™บๅฎŸ่ทตYoshifumi Kawai
ย 
AWS Black Belt Online Seminar AWSไธŠใฎJenkinsๆดป็”จๆ–นๆณ•
AWS Black Belt Online Seminar AWSไธŠใฎJenkinsๆดป็”จๆ–นๆณ•AWS Black Belt Online Seminar AWSไธŠใฎJenkinsๆดป็”จๆ–นๆณ•
AWS Black Belt Online Seminar AWSไธŠใฎJenkinsๆดป็”จๆ–นๆณ•Amazon Web Services Japan
ย 
Mise en conformitรฉ des bases de donnรฉes MySQL avec le RGPD
Mise en conformitรฉ des bases de donnรฉes MySQL avec le RGPDMise en conformitรฉ des bases de donnรฉes MySQL avec le RGPD
Mise en conformitรฉ des bases de donnรฉes MySQL avec le RGPDValentin Traรซn
ย 
ใ‚ทใƒชใ‚ณใƒณใƒใƒฌใƒผใงใ‚จใƒณใ‚ธใƒ‹ใ‚ขๅฐฑ่ทใ™ใ‚‹ๅ‰ใซ็Ÿฅใ‚ŠใŸใ‹ใฃใŸใ“ใจ
ใ‚ทใƒชใ‚ณใƒณใƒใƒฌใƒผใงใ‚จใƒณใ‚ธใƒ‹ใ‚ขๅฐฑ่ทใ™ใ‚‹ๅ‰ใซ็Ÿฅใ‚ŠใŸใ‹ใฃใŸใ“ใจใ‚ทใƒชใ‚ณใƒณใƒใƒฌใƒผใงใ‚จใƒณใ‚ธใƒ‹ใ‚ขๅฐฑ่ทใ™ใ‚‹ๅ‰ใซ็Ÿฅใ‚ŠใŸใ‹ใฃใŸใ“ใจ
ใ‚ทใƒชใ‚ณใƒณใƒใƒฌใƒผใงใ‚จใƒณใ‚ธใƒ‹ใ‚ขๅฐฑ่ทใ™ใ‚‹ๅ‰ใซ็Ÿฅใ‚ŠใŸใ‹ใฃใŸใ“ใจTatsuya Nanjo
ย 
Web App for Containers + MySQLใงใ‚ณใƒณใƒ†ใƒŠๅฏพๅฟœใ—ใŸRailsใ‚ขใƒ—ใƒชใ‚’ไฝœใ‚ใ†๏ผ
Web App for Containers + MySQLใงใ‚ณใƒณใƒ†ใƒŠๅฏพๅฟœใ—ใŸRailsใ‚ขใƒ—ใƒชใ‚’ไฝœใ‚ใ†๏ผWeb App for Containers + MySQLใงใ‚ณใƒณใƒ†ใƒŠๅฏพๅฟœใ—ใŸRailsใ‚ขใƒ—ใƒชใ‚’ไฝœใ‚ใ†๏ผ
Web App for Containers + MySQLใงใ‚ณใƒณใƒ†ใƒŠๅฏพๅฟœใ—ใŸRailsใ‚ขใƒ—ใƒชใ‚’ไฝœใ‚ใ†๏ผYoichi Kawasaki
ย 
Formation Usine Logicielle gratuite par Ippon 2014
Formation Usine Logicielle gratuite par Ippon 2014Formation Usine Logicielle gratuite par Ippon 2014
Formation Usine Logicielle gratuite par Ippon 2014Ippon
ย 
Cassandraใƒใƒผใ‚ธใƒงใƒณใ‚ขใƒƒใƒ—๏ผ†็งป่จญ
Cassandraใƒใƒผใ‚ธใƒงใƒณใ‚ขใƒƒใƒ—๏ผ†็งป่จญCassandraใƒใƒผใ‚ธใƒงใƒณใ‚ขใƒƒใƒ—๏ผ†็งป่จญ
Cassandraใƒใƒผใ‚ธใƒงใƒณใ‚ขใƒƒใƒ—๏ผ†็งป่จญTakehiro Torigaki
ย 
PECL operator ใงๆผ”็ฎ—ๅญใ‚ชใƒผใƒใƒผใƒญใƒผใƒ‰
PECL operator ใงๆผ”็ฎ—ๅญใ‚ชใƒผใƒใƒผใƒญใƒผใƒ‰PECL operator ใงๆผ”็ฎ—ๅญใ‚ชใƒผใƒใƒผใƒญใƒผใƒ‰
PECL operator ใงๆผ”็ฎ—ๅญใ‚ชใƒผใƒใƒผใƒญใƒผใƒ‰y-uti
ย 
แ„‹แ…ขแ„Œแ…กแ„‹แ…ตแ†ฏ แ„‹แ…กแ†ซแ„’แ…กแ†ซ แ„‹แ…ตแ„‹แ…ฃแ„€แ…ต
แ„‹แ…ขแ„Œแ…กแ„‹แ…ตแ†ฏ แ„‹แ…กแ†ซแ„’แ…กแ†ซ แ„‹แ…ตแ„‹แ…ฃแ„€แ…ตแ„‹แ…ขแ„Œแ…กแ„‹แ…ตแ†ฏ แ„‹แ…กแ†ซแ„’แ…กแ†ซ แ„‹แ…ตแ„‹แ…ฃแ„€แ…ต
แ„‹แ…ขแ„Œแ…กแ„‹แ…ตแ†ฏ แ„‹แ…กแ†ซแ„’แ…กแ†ซ แ„‹แ…ตแ„‹แ…ฃแ„€แ…ตSungchul Park
ย 
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Java Performance Tuning
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Java Performance Tuning[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Java Performance Tuning
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Java Performance TuningJi-Woong Choi
ย 
๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ์•„ํ‚คํ…์ณ ์„ค๊ณ„ #3 ๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ณ
๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ์•„ํ‚คํ…์ณ ์„ค๊ณ„ #3 ๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ณ๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ์•„ํ‚คํ…์ณ ์„ค๊ณ„ #3 ๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ณ
๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ์•„ํ‚คํ…์ณ ์„ค๊ณ„ #3 ๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ณTerry Cho
ย 
ๅ“่ณชใจ้–‹็™บใ‚นใƒ”ใƒผใƒ‰ใฎไธก็ซ‹ใจใ€OSSใฎใƒชใ‚นใ‚ฏไฝŽๆธ›็ญ–ใฎใ”็ดนไป‹ / GTMF2019
ๅ“่ณชใจ้–‹็™บใ‚นใƒ”ใƒผใƒ‰ใฎไธก็ซ‹ใจใ€OSSใฎใƒชใ‚นใ‚ฏไฝŽๆธ›็ญ–ใฎใ”็ดนไป‹ / GTMF2019ๅ“่ณชใจ้–‹็™บใ‚นใƒ”ใƒผใƒ‰ใฎไธก็ซ‹ใจใ€OSSใฎใƒชใ‚นใ‚ฏไฝŽๆธ›็ญ–ใฎใ”็ดนไป‹ / GTMF2019
ๅ“่ณชใจ้–‹็™บใ‚นใƒ”ใƒผใƒ‰ใฎไธก็ซ‹ใจใ€OSSใฎใƒชใ‚นใ‚ฏไฝŽๆธ›็ญ–ใฎใ”็ดนไป‹ / GTMF2019Game Tools & Middleware Forum
ย 
[OKKYCON] ๋ฐ•์žฌ์„ฑ - ์˜์‹์ ์ธ ์—ฐ์Šต์œผ๋กœ TDD, ๋ฆฌํŒฉํ† ๋ง ์—ฐ์Šตํ•˜๊ธฐ
[OKKYCON] ๋ฐ•์žฌ์„ฑ - ์˜์‹์ ์ธ ์—ฐ์Šต์œผ๋กœ TDD, ๋ฆฌํŒฉํ† ๋ง ์—ฐ์Šตํ•˜๊ธฐ[OKKYCON] ๋ฐ•์žฌ์„ฑ - ์˜์‹์ ์ธ ์—ฐ์Šต์œผ๋กœ TDD, ๋ฆฌํŒฉํ† ๋ง ์—ฐ์Šตํ•˜๊ธฐ
[OKKYCON] ๋ฐ•์žฌ์„ฑ - ์˜์‹์ ์ธ ์—ฐ์Šต์œผ๋กœ TDD, ๋ฆฌํŒฉํ† ๋ง ์—ฐ์Šตํ•˜๊ธฐOKKY
ย 
aws blackbelt amazon elasticsearch service
aws blackbelt amazon elasticsearch service aws blackbelt amazon elasticsearch service
aws blackbelt amazon elasticsearch service Amazon Web Services Japan
ย 
2 Tomcatใซใ‚ˆใ‚‹Webใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใ‚ตใƒผใƒๆง‹็ฏ‰ ็ฌฌ4็ซ  Tomcatใฎๆง‹ๆˆ(1)-ไปฎๆƒณใƒ›ใ‚นใƒˆใ€Apache้€ฃๆบ
2 Tomcatใซใ‚ˆใ‚‹Webใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใ‚ตใƒผใƒๆง‹็ฏ‰ ็ฌฌ4็ซ  Tomcatใฎๆง‹ๆˆ(1)-ไปฎๆƒณใƒ›ใ‚นใƒˆใ€Apache้€ฃๆบ2 Tomcatใซใ‚ˆใ‚‹Webใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใ‚ตใƒผใƒๆง‹็ฏ‰ ็ฌฌ4็ซ  Tomcatใฎๆง‹ๆˆ(1)-ไปฎๆƒณใƒ›ใ‚นใƒˆใ€Apache้€ฃๆบ
2 Tomcatใซใ‚ˆใ‚‹Webใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใ‚ตใƒผใƒๆง‹็ฏ‰ ็ฌฌ4็ซ  Tomcatใฎๆง‹ๆˆ(1)-ไปฎๆƒณใƒ›ใ‚นใƒˆใ€Apache้€ฃๆบEnpel
ย 
RESTful API ์„ค๊ณ„
RESTful API ์„ค๊ณ„RESTful API ์„ค๊ณ„
RESTful API ์„ค๊ณ„Jinho Yoo
ย 

What's hot (20)

.NET 7 ใงใฎ ASP.NET Core Blazor ใฎๆ–ฐๆฉŸ่ƒฝใƒ”ใƒƒใ‚ฏใ‚ขใƒƒใƒ—
.NET 7 ใงใฎ ASP.NET Core Blazor ใฎๆ–ฐๆฉŸ่ƒฝใƒ”ใƒƒใ‚ฏใ‚ขใƒƒใƒ—.NET 7 ใงใฎ ASP.NET Core Blazor ใฎๆ–ฐๆฉŸ่ƒฝใƒ”ใƒƒใ‚ฏใ‚ขใƒƒใƒ—
.NET 7 ใงใฎ ASP.NET Core Blazor ใฎๆ–ฐๆฉŸ่ƒฝใƒ”ใƒƒใ‚ฏใ‚ขใƒƒใƒ—
ย 
ใƒ•ใƒชใƒผใงใงใใ‚‹ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃWeb็ทจ(SQLMใ‚๏ฝใ‚’ๆฅฝใ—ใ‚‚ใ†)
ใƒ•ใƒชใƒผใงใงใใ‚‹ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃWeb็ทจ(SQLMใ‚๏ฝใ‚’ๆฅฝใ—ใ‚‚ใ†)ใƒ•ใƒชใƒผใงใงใใ‚‹ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃWeb็ทจ(SQLMใ‚๏ฝใ‚’ๆฅฝใ—ใ‚‚ใ†)
ใƒ•ใƒชใƒผใงใงใใ‚‹ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃWeb็ทจ(SQLMใ‚๏ฝใ‚’ๆฅฝใ—ใ‚‚ใ†)
ย 
Unicodeใซใ‚ˆใ‚‹XSSใจ SQLใ‚คใƒณใ‚ธใ‚งใ‚ฏใ‚ทใƒงใƒณใฎๅฏ่ƒฝๆ€ง
Unicodeใซใ‚ˆใ‚‹XSSใจSQLใ‚คใƒณใ‚ธใ‚งใ‚ฏใ‚ทใƒงใƒณใฎๅฏ่ƒฝๆ€งUnicodeใซใ‚ˆใ‚‹XSSใจSQLใ‚คใƒณใ‚ธใ‚งใ‚ฏใ‚ทใƒงใƒณใฎๅฏ่ƒฝๆ€ง
Unicodeใซใ‚ˆใ‚‹XSSใจ SQLใ‚คใƒณใ‚ธใ‚งใ‚ฏใ‚ทใƒงใƒณใฎๅฏ่ƒฝๆ€ง
ย 
AWS + Windows(C#)ใงๆง‹็ฏ‰ใ™ใ‚‹.NETๆœ€ๅ…ˆ็ซฏๆŠ€่ก“ใซใ‚ˆใ‚‹ใƒใ‚คใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นใ‚ฆใ‚งใƒ–ใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณ้–‹็™บๅฎŸ่ทต
AWS + Windows(C#)ใงๆง‹็ฏ‰ใ™ใ‚‹.NETๆœ€ๅ…ˆ็ซฏๆŠ€่ก“ใซใ‚ˆใ‚‹ใƒใ‚คใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นใ‚ฆใ‚งใƒ–ใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณ้–‹็™บๅฎŸ่ทตAWS + Windows(C#)ใงๆง‹็ฏ‰ใ™ใ‚‹.NETๆœ€ๅ…ˆ็ซฏๆŠ€่ก“ใซใ‚ˆใ‚‹ใƒใ‚คใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นใ‚ฆใ‚งใƒ–ใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณ้–‹็™บๅฎŸ่ทต
AWS + Windows(C#)ใงๆง‹็ฏ‰ใ™ใ‚‹.NETๆœ€ๅ…ˆ็ซฏๆŠ€่ก“ใซใ‚ˆใ‚‹ใƒใ‚คใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นใ‚ฆใ‚งใƒ–ใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณ้–‹็™บๅฎŸ่ทต
ย 
AWS Black Belt Online Seminar AWSไธŠใฎJenkinsๆดป็”จๆ–นๆณ•
AWS Black Belt Online Seminar AWSไธŠใฎJenkinsๆดป็”จๆ–นๆณ•AWS Black Belt Online Seminar AWSไธŠใฎJenkinsๆดป็”จๆ–นๆณ•
AWS Black Belt Online Seminar AWSไธŠใฎJenkinsๆดป็”จๆ–นๆณ•
ย 
Mise en conformitรฉ des bases de donnรฉes MySQL avec le RGPD
Mise en conformitรฉ des bases de donnรฉes MySQL avec le RGPDMise en conformitรฉ des bases de donnรฉes MySQL avec le RGPD
Mise en conformitรฉ des bases de donnรฉes MySQL avec le RGPD
ย 
ใ‚ทใƒชใ‚ณใƒณใƒใƒฌใƒผใงใ‚จใƒณใ‚ธใƒ‹ใ‚ขๅฐฑ่ทใ™ใ‚‹ๅ‰ใซ็Ÿฅใ‚ŠใŸใ‹ใฃใŸใ“ใจ
ใ‚ทใƒชใ‚ณใƒณใƒใƒฌใƒผใงใ‚จใƒณใ‚ธใƒ‹ใ‚ขๅฐฑ่ทใ™ใ‚‹ๅ‰ใซ็Ÿฅใ‚ŠใŸใ‹ใฃใŸใ“ใจใ‚ทใƒชใ‚ณใƒณใƒใƒฌใƒผใงใ‚จใƒณใ‚ธใƒ‹ใ‚ขๅฐฑ่ทใ™ใ‚‹ๅ‰ใซ็Ÿฅใ‚ŠใŸใ‹ใฃใŸใ“ใจ
ใ‚ทใƒชใ‚ณใƒณใƒใƒฌใƒผใงใ‚จใƒณใ‚ธใƒ‹ใ‚ขๅฐฑ่ทใ™ใ‚‹ๅ‰ใซ็Ÿฅใ‚ŠใŸใ‹ใฃใŸใ“ใจ
ย 
Web App for Containers + MySQLใงใ‚ณใƒณใƒ†ใƒŠๅฏพๅฟœใ—ใŸRailsใ‚ขใƒ—ใƒชใ‚’ไฝœใ‚ใ†๏ผ
Web App for Containers + MySQLใงใ‚ณใƒณใƒ†ใƒŠๅฏพๅฟœใ—ใŸRailsใ‚ขใƒ—ใƒชใ‚’ไฝœใ‚ใ†๏ผWeb App for Containers + MySQLใงใ‚ณใƒณใƒ†ใƒŠๅฏพๅฟœใ—ใŸRailsใ‚ขใƒ—ใƒชใ‚’ไฝœใ‚ใ†๏ผ
Web App for Containers + MySQLใงใ‚ณใƒณใƒ†ใƒŠๅฏพๅฟœใ—ใŸRailsใ‚ขใƒ—ใƒชใ‚’ไฝœใ‚ใ†๏ผ
ย 
Formation Usine Logicielle gratuite par Ippon 2014
Formation Usine Logicielle gratuite par Ippon 2014Formation Usine Logicielle gratuite par Ippon 2014
Formation Usine Logicielle gratuite par Ippon 2014
ย 
Cassandraใƒใƒผใ‚ธใƒงใƒณใ‚ขใƒƒใƒ—๏ผ†็งป่จญ
Cassandraใƒใƒผใ‚ธใƒงใƒณใ‚ขใƒƒใƒ—๏ผ†็งป่จญCassandraใƒใƒผใ‚ธใƒงใƒณใ‚ขใƒƒใƒ—๏ผ†็งป่จญ
Cassandraใƒใƒผใ‚ธใƒงใƒณใ‚ขใƒƒใƒ—๏ผ†็งป่จญ
ย 
PECL operator ใงๆผ”็ฎ—ๅญใ‚ชใƒผใƒใƒผใƒญใƒผใƒ‰
PECL operator ใงๆผ”็ฎ—ๅญใ‚ชใƒผใƒใƒผใƒญใƒผใƒ‰PECL operator ใงๆผ”็ฎ—ๅญใ‚ชใƒผใƒใƒผใƒญใƒผใƒ‰
PECL operator ใงๆผ”็ฎ—ๅญใ‚ชใƒผใƒใƒผใƒญใƒผใƒ‰
ย 
แ„‹แ…ขแ„Œแ…กแ„‹แ…ตแ†ฏ แ„‹แ…กแ†ซแ„’แ…กแ†ซ แ„‹แ…ตแ„‹แ…ฃแ„€แ…ต
แ„‹แ…ขแ„Œแ…กแ„‹แ…ตแ†ฏ แ„‹แ…กแ†ซแ„’แ…กแ†ซ แ„‹แ…ตแ„‹แ…ฃแ„€แ…ตแ„‹แ…ขแ„Œแ…กแ„‹แ…ตแ†ฏ แ„‹แ…กแ†ซแ„’แ…กแ†ซ แ„‹แ…ตแ„‹แ…ฃแ„€แ…ต
แ„‹แ…ขแ„Œแ…กแ„‹แ…ตแ†ฏ แ„‹แ…กแ†ซแ„’แ…กแ†ซ แ„‹แ…ตแ„‹แ…ฃแ„€แ…ต
ย 
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Java Performance Tuning
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Java Performance Tuning[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Java Performance Tuning
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Java Performance Tuning
ย 
๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ์•„ํ‚คํ…์ณ ์„ค๊ณ„ #3 ๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ณ
๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ์•„ํ‚คํ…์ณ ์„ค๊ณ„ #3 ๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ณ๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ์•„ํ‚คํ…์ณ ์„ค๊ณ„ #3 ๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ณ
๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ์•„ํ‚คํ…์ณ ์„ค๊ณ„ #3 ๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ณ
ย 
ๅ“่ณชใจ้–‹็™บใ‚นใƒ”ใƒผใƒ‰ใฎไธก็ซ‹ใจใ€OSSใฎใƒชใ‚นใ‚ฏไฝŽๆธ›็ญ–ใฎใ”็ดนไป‹ / GTMF2019
ๅ“่ณชใจ้–‹็™บใ‚นใƒ”ใƒผใƒ‰ใฎไธก็ซ‹ใจใ€OSSใฎใƒชใ‚นใ‚ฏไฝŽๆธ›็ญ–ใฎใ”็ดนไป‹ / GTMF2019ๅ“่ณชใจ้–‹็™บใ‚นใƒ”ใƒผใƒ‰ใฎไธก็ซ‹ใจใ€OSSใฎใƒชใ‚นใ‚ฏไฝŽๆธ›็ญ–ใฎใ”็ดนไป‹ / GTMF2019
ๅ“่ณชใจ้–‹็™บใ‚นใƒ”ใƒผใƒ‰ใฎไธก็ซ‹ใจใ€OSSใฎใƒชใ‚นใ‚ฏไฝŽๆธ›็ญ–ใฎใ”็ดนไป‹ / GTMF2019
ย 
[OKKYCON] ๋ฐ•์žฌ์„ฑ - ์˜์‹์ ์ธ ์—ฐ์Šต์œผ๋กœ TDD, ๋ฆฌํŒฉํ† ๋ง ์—ฐ์Šตํ•˜๊ธฐ
[OKKYCON] ๋ฐ•์žฌ์„ฑ - ์˜์‹์ ์ธ ์—ฐ์Šต์œผ๋กœ TDD, ๋ฆฌํŒฉํ† ๋ง ์—ฐ์Šตํ•˜๊ธฐ[OKKYCON] ๋ฐ•์žฌ์„ฑ - ์˜์‹์ ์ธ ์—ฐ์Šต์œผ๋กœ TDD, ๋ฆฌํŒฉํ† ๋ง ์—ฐ์Šตํ•˜๊ธฐ
[OKKYCON] ๋ฐ•์žฌ์„ฑ - ์˜์‹์ ์ธ ์—ฐ์Šต์œผ๋กœ TDD, ๋ฆฌํŒฉํ† ๋ง ์—ฐ์Šตํ•˜๊ธฐ
ย 
aws blackbelt amazon elasticsearch service
aws blackbelt amazon elasticsearch service aws blackbelt amazon elasticsearch service
aws blackbelt amazon elasticsearch service
ย 
Phpcon2015
Phpcon2015Phpcon2015
Phpcon2015
ย 
2 Tomcatใซใ‚ˆใ‚‹Webใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใ‚ตใƒผใƒๆง‹็ฏ‰ ็ฌฌ4็ซ  Tomcatใฎๆง‹ๆˆ(1)-ไปฎๆƒณใƒ›ใ‚นใƒˆใ€Apache้€ฃๆบ
2 Tomcatใซใ‚ˆใ‚‹Webใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใ‚ตใƒผใƒๆง‹็ฏ‰ ็ฌฌ4็ซ  Tomcatใฎๆง‹ๆˆ(1)-ไปฎๆƒณใƒ›ใ‚นใƒˆใ€Apache้€ฃๆบ2 Tomcatใซใ‚ˆใ‚‹Webใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใ‚ตใƒผใƒๆง‹็ฏ‰ ็ฌฌ4็ซ  Tomcatใฎๆง‹ๆˆ(1)-ไปฎๆƒณใƒ›ใ‚นใƒˆใ€Apache้€ฃๆบ
2 Tomcatใซใ‚ˆใ‚‹Webใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใ‚ตใƒผใƒๆง‹็ฏ‰ ็ฌฌ4็ซ  Tomcatใฎๆง‹ๆˆ(1)-ไปฎๆƒณใƒ›ใ‚นใƒˆใ€Apache้€ฃๆบ
ย 
RESTful API ์„ค๊ณ„
RESTful API ์„ค๊ณ„RESTful API ์„ค๊ณ„
RESTful API ์„ค๊ณ„
ย 

Viewers also liked

Bnf seeg ws
Bnf seeg wsBnf seeg ws
Bnf seeg wsbbongcsu
ย 
Refactoring tutorial 1์ฃผ์ฐจ[refactoring ๊ฐœ์š”]
Refactoring tutorial 1์ฃผ์ฐจ[refactoring ๊ฐœ์š”]Refactoring tutorial 1์ฃผ์ฐจ[refactoring ๊ฐœ์š”]
Refactoring tutorial 1์ฃผ์ฐจ[refactoring ๊ฐœ์š”]bbongcsu
ย 
์• ์ž์ผ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ด์šฉํ•œ ๊ณ ํ’ˆ์งˆ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ
์• ์ž์ผ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ด์šฉํ•œ ๊ณ ํ’ˆ์งˆ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์• ์ž์ผ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ด์šฉํ•œ ๊ณ ํ’ˆ์งˆ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ
์• ์ž์ผ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ด์šฉํ•œ ๊ณ ํ’ˆ์งˆ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœJaehoon Oh
ย 
The roadtocodecraft
The roadtocodecraftThe roadtocodecraft
The roadtocodecraftbbongcsu
ย 
Bnf seeg
Bnf seegBnf seeg
Bnf seegbbongcsu
ย 
Legacy code refactoring video rental system
Legacy code refactoring   video rental systemLegacy code refactoring   video rental system
Legacy code refactoring video rental systemJaehoon Oh
ย 
์• ์ž์ผ ๋งˆ์ธ๋“œ์…‹
์• ์ž์ผ ๋งˆ์ธ๋“œ์…‹์• ์ž์ผ ๋งˆ์ธ๋“œ์…‹
์• ์ž์ผ ๋งˆ์ธ๋“œ์…‹Jaehoon Oh
ย 
Clean code
Clean codeClean code
Clean codebbongcsu
ย 
แ„‹แ…ตแ†ซแ„‰แ…ฎแ„แ…ฆแ„‰แ…ณแ„แ…ณ แ„Œแ…ฎแ„ƒแ…ฉ แ„€แ…ข๋ฐœ
แ„‹แ…ตแ†ซแ„‰แ…ฎแ„แ…ฆแ„‰แ…ณแ„แ…ณ แ„Œแ…ฎแ„ƒแ…ฉ แ„€แ…ข๋ฐœแ„‹แ…ตแ†ซแ„‰แ…ฎแ„แ…ฆแ„‰แ…ณแ„แ…ณ แ„Œแ…ฎแ„ƒแ…ฉ แ„€แ…ข๋ฐœ
แ„‹แ…ตแ†ซแ„‰แ…ฎแ„แ…ฆแ„‰แ…ณแ„แ…ณ แ„Œแ…ฎแ„ƒแ…ฉ แ„€แ…ข๋ฐœJaehoon Oh
ย 
Tdd ์™œ ๋ฐฐ์šฐ๊ธฐ ์–ด๋ ค์šด๊ฐ€
Tdd ์™œ ๋ฐฐ์šฐ๊ธฐ ์–ด๋ ค์šด๊ฐ€Tdd ์™œ ๋ฐฐ์šฐ๊ธฐ ์–ด๋ ค์šด๊ฐ€
Tdd ์™œ ๋ฐฐ์šฐ๊ธฐ ์–ด๋ ค์šด๊ฐ€Jaehoon Oh
ย 
Robot framework แ„‹แ…ณแ†ฏ แ„‹แ…ตแ„‹แ…ญแ†ผแ„’แ…กแ†ซ แ„€แ…ตแ„‚แ…ณแ†ผ แ„แ…ฆแ„‰แ…ณแ„แ…ณ แ„Œแ…กแ„ƒแ…ฉแ†ผแ„’แ…ช
Robot framework แ„‹แ…ณแ†ฏ แ„‹แ…ตแ„‹แ…ญแ†ผแ„’แ…กแ†ซ แ„€แ…ตแ„‚แ…ณแ†ผ แ„แ…ฆแ„‰แ…ณแ„แ…ณ แ„Œแ…กแ„ƒแ…ฉแ†ผแ„’แ…ชRobot framework แ„‹แ…ณแ†ฏ แ„‹แ…ตแ„‹แ…ญแ†ผแ„’แ…กแ†ซ แ„€แ…ตแ„‚แ…ณแ†ผ แ„แ…ฆแ„‰แ…ณแ„แ…ณ แ„Œแ…กแ„ƒแ…ฉแ†ผแ„’แ…ช
Robot framework แ„‹แ…ณแ†ฏ แ„‹แ…ตแ„‹แ…ญแ†ผแ„’แ…กแ†ซ แ„€แ…ตแ„‚แ…ณแ†ผ แ„แ…ฆแ„‰แ…ณแ„แ…ณ แ„Œแ…กแ„ƒแ…ฉแ†ผแ„’แ…ชJaehoon Oh
ย 

Viewers also liked (11)

Bnf seeg ws
Bnf seeg wsBnf seeg ws
Bnf seeg ws
ย 
Refactoring tutorial 1์ฃผ์ฐจ[refactoring ๊ฐœ์š”]
Refactoring tutorial 1์ฃผ์ฐจ[refactoring ๊ฐœ์š”]Refactoring tutorial 1์ฃผ์ฐจ[refactoring ๊ฐœ์š”]
Refactoring tutorial 1์ฃผ์ฐจ[refactoring ๊ฐœ์š”]
ย 
์• ์ž์ผ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ด์šฉํ•œ ๊ณ ํ’ˆ์งˆ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ
์• ์ž์ผ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ด์šฉํ•œ ๊ณ ํ’ˆ์งˆ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์• ์ž์ผ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ด์šฉํ•œ ๊ณ ํ’ˆ์งˆ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ
์• ์ž์ผ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ด์šฉํ•œ ๊ณ ํ’ˆ์งˆ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ
ย 
The roadtocodecraft
The roadtocodecraftThe roadtocodecraft
The roadtocodecraft
ย 
Bnf seeg
Bnf seegBnf seeg
Bnf seeg
ย 
Legacy code refactoring video rental system
Legacy code refactoring   video rental systemLegacy code refactoring   video rental system
Legacy code refactoring video rental system
ย 
์• ์ž์ผ ๋งˆ์ธ๋“œ์…‹
์• ์ž์ผ ๋งˆ์ธ๋“œ์…‹์• ์ž์ผ ๋งˆ์ธ๋“œ์…‹
์• ์ž์ผ ๋งˆ์ธ๋“œ์…‹
ย 
Clean code
Clean codeClean code
Clean code
ย 
แ„‹แ…ตแ†ซแ„‰แ…ฎแ„แ…ฆแ„‰แ…ณแ„แ…ณ แ„Œแ…ฎแ„ƒแ…ฉ แ„€แ…ข๋ฐœ
แ„‹แ…ตแ†ซแ„‰แ…ฎแ„แ…ฆแ„‰แ…ณแ„แ…ณ แ„Œแ…ฎแ„ƒแ…ฉ แ„€แ…ข๋ฐœแ„‹แ…ตแ†ซแ„‰แ…ฎแ„แ…ฆแ„‰แ…ณแ„แ…ณ แ„Œแ…ฎแ„ƒแ…ฉ แ„€แ…ข๋ฐœ
แ„‹แ…ตแ†ซแ„‰แ…ฎแ„แ…ฆแ„‰แ…ณแ„แ…ณ แ„Œแ…ฎแ„ƒแ…ฉ แ„€แ…ข๋ฐœ
ย 
Tdd ์™œ ๋ฐฐ์šฐ๊ธฐ ์–ด๋ ค์šด๊ฐ€
Tdd ์™œ ๋ฐฐ์šฐ๊ธฐ ์–ด๋ ค์šด๊ฐ€Tdd ์™œ ๋ฐฐ์šฐ๊ธฐ ์–ด๋ ค์šด๊ฐ€
Tdd ์™œ ๋ฐฐ์šฐ๊ธฐ ์–ด๋ ค์šด๊ฐ€
ย 
Robot framework แ„‹แ…ณแ†ฏ แ„‹แ…ตแ„‹แ…ญแ†ผแ„’แ…กแ†ซ แ„€แ…ตแ„‚แ…ณแ†ผ แ„แ…ฆแ„‰แ…ณแ„แ…ณ แ„Œแ…กแ„ƒแ…ฉแ†ผแ„’แ…ช
Robot framework แ„‹แ…ณแ†ฏ แ„‹แ…ตแ„‹แ…ญแ†ผแ„’แ…กแ†ซ แ„€แ…ตแ„‚แ…ณแ†ผ แ„แ…ฆแ„‰แ…ณแ„แ…ณ แ„Œแ…กแ„ƒแ…ฉแ†ผแ„’แ…ชRobot framework แ„‹แ…ณแ†ฏ แ„‹แ…ตแ„‹แ…ญแ†ผแ„’แ…กแ†ซ แ„€แ…ตแ„‚แ…ณแ†ผ แ„แ…ฆแ„‰แ…ณแ„แ…ณ แ„Œแ…กแ„ƒแ…ฉแ†ผแ„’แ…ช
Robot framework แ„‹แ…ณแ†ฏ แ„‹แ…ตแ„‹แ…ญแ†ผแ„’แ…กแ†ซ แ„€แ…ตแ„‚แ…ณแ†ผ แ„แ…ฆแ„‰แ…ณแ„แ…ณ แ„Œแ…กแ„ƒแ…ฉแ†ผแ„’แ…ช
ย 

Similar to Refactoring tutorial

Refactoring Tutorial 1์ฃผ์ฐจ[ Refactoring ๊ฐœ์š”]
Refactoring  Tutorial 1์ฃผ์ฐจ[ Refactoring ๊ฐœ์š”]Refactoring  Tutorial 1์ฃผ์ฐจ[ Refactoring ๊ฐœ์š”]
Refactoring Tutorial 1์ฃผ์ฐจ[ Refactoring ๊ฐœ์š”]Bingu Shim
ย 
Refactoring Tutorial 1์ฃผ์ฐจ[ Refactoring ๊ฐœ์š”]
Refactoring  Tutorial 1์ฃผ์ฐจ[ Refactoring ๊ฐœ์š”]Refactoring  Tutorial 1์ฃผ์ฐจ[ Refactoring ๊ฐœ์š”]
Refactoring Tutorial 1์ฃผ์ฐจ[ Refactoring ๊ฐœ์š”]Bingu Shim
ย 
Devon 2011-b-5 ํšจ๊ณผ์ ์ธ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ๋‹ค๋ฃจ๊ธฐ
Devon 2011-b-5 ํšจ๊ณผ์ ์ธ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ๋‹ค๋ฃจ๊ธฐDevon 2011-b-5 ํšจ๊ณผ์ ์ธ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ๋‹ค๋ฃจ๊ธฐ
Devon 2011-b-5 ํšจ๊ณผ์ ์ธ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ๋‹ค๋ฃจ๊ธฐDaum DNA
ย 
DevRookie ๋ฆฌํŽ™ํ„ฐ๋ง.pptx
DevRookie ๋ฆฌํŽ™ํ„ฐ๋ง.pptxDevRookie ๋ฆฌํŽ™ํ„ฐ๋ง.pptx
DevRookie ๋ฆฌํŽ™ํ„ฐ๋ง.pptxMUUMUMUMU
ย 
Working with code
Working with codeWorking with code
Working with codeJaeYeoul Ahn
ย 
์นด์‚ฌ ๊ณต๊ฐœ์„ธ๋ฏธ๋‚˜1ํšŒ W.E.L.C.
์นด์‚ฌ ๊ณต๊ฐœ์„ธ๋ฏธ๋‚˜1ํšŒ  W.E.L.C.์นด์‚ฌ ๊ณต๊ฐœ์„ธ๋ฏธ๋‚˜1ํšŒ  W.E.L.C.
์นด์‚ฌ ๊ณต๊ฐœ์„ธ๋ฏธ๋‚˜1ํšŒ W.E.L.C.Ryan Park
ย 
TDD&Refactoring Day 01: Refactoring
TDD&Refactoring Day 01: RefactoringTDD&Refactoring Day 01: Refactoring
TDD&Refactoring Day 01: RefactoringSuwon Chae
ย 
Chapter7~9 ppt
Chapter7~9 pptChapter7~9 ppt
Chapter7~9 pptInjae Lee
ย 
C++ api design ํ’ˆ์งˆ
C++ api design ํ’ˆ์งˆC++ api design ํ’ˆ์งˆ
C++ api design ํ’ˆ์งˆHyeonSeok Choi
ย 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Designhyun soomyung
ย 
C Language II
C Language IIC Language II
C Language IISuho Kwon
ย 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Ryan Park
ย 
[HaU] ์‹ ์ž… ๊ธฐ์ˆ  ๋ฉด์ ‘ ์ค€๋น„ java
[HaU] ์‹ ์ž… ๊ธฐ์ˆ  ๋ฉด์ ‘ ์ค€๋น„ java[HaU] ์‹ ์ž… ๊ธฐ์ˆ  ๋ฉด์ ‘ ์ค€๋น„ java
[HaU] ์‹ ์ž… ๊ธฐ์ˆ  ๋ฉด์ ‘ ์ค€๋น„ java์œ ๋ฆฌ ํ•˜
ย 
แ„แ…ขแ„แ…ณแ†บแ„’แ…กแ†ซ แ„แ…ฉแ„ƒแ…ณ (ํด๋ฆฐ ์ฝ”๋“œ, Clean Code)
แ„แ…ขแ„แ…ณแ†บแ„’แ…กแ†ซ แ„แ…ฉแ„ƒแ…ณ (ํด๋ฆฐ ์ฝ”๋“œ, Clean Code)แ„แ…ขแ„แ…ณแ†บแ„’แ…กแ†ซ แ„แ…ฉแ„ƒแ…ณ (ํด๋ฆฐ ์ฝ”๋“œ, Clean Code)
แ„แ…ขแ„แ…ณแ†บแ„’แ…กแ†ซ แ„แ…ฉแ„ƒแ…ณ (ํด๋ฆฐ ์ฝ”๋“œ, Clean Code)Jay Park
ย 
[์Šคํ”„๋ง ์Šคํ„ฐ๋”” 1์ผ์ฐจ] ํ…œํ”Œ๋ฆฟ
[์Šคํ”„๋ง ์Šคํ„ฐ๋”” 1์ผ์ฐจ] ํ…œํ”Œ๋ฆฟ[์Šคํ”„๋ง ์Šคํ„ฐ๋”” 1์ผ์ฐจ] ํ…œํ”Œ๋ฆฟ
[์Šคํ”„๋ง ์Šคํ„ฐ๋”” 1์ผ์ฐจ] ํ…œํ”Œ๋ฆฟAnselmKim
ย 
ใ€Žแ„‹แ…ตแ„‘แ…ฆแ†จแ„แ…ตแ„‡แ…ณ แ„ƒแ…ตแ„‡แ…ฅแ„€แ…ตแ†ผใ€ - ๋””๋ฒ„๊น… ์ง€์˜ฅ์—์„œ ํƒˆ์ถœํ•˜๋Š” 66๊ฐ€์ง€ ์ „๋žต๊ณผ ๊ธฐ๋ฒ•
ใ€Žแ„‹แ…ตแ„‘แ…ฆแ†จแ„แ…ตแ„‡แ…ณ แ„ƒแ…ตแ„‡แ…ฅแ„€แ…ตแ†ผใ€ - ๋””๋ฒ„๊น… ์ง€์˜ฅ์—์„œ ํƒˆ์ถœํ•˜๋Š” 66๊ฐ€์ง€ ์ „๋žต๊ณผ ๊ธฐ๋ฒ•ใ€Žแ„‹แ…ตแ„‘แ…ฆแ†จแ„แ…ตแ„‡แ…ณ แ„ƒแ…ตแ„‡แ…ฅแ„€แ…ตแ†ผใ€ - ๋””๋ฒ„๊น… ์ง€์˜ฅ์—์„œ ํƒˆ์ถœํ•˜๋Š” 66๊ฐ€์ง€ ์ „๋žต๊ณผ ๊ธฐ๋ฒ•
ใ€Žแ„‹แ…ตแ„‘แ…ฆแ†จแ„แ…ตแ„‡แ…ณ แ„ƒแ…ตแ„‡แ…ฅแ„€แ…ตแ†ผใ€ - ๋””๋ฒ„๊น… ์ง€์˜ฅ์—์„œ ํƒˆ์ถœํ•˜๋Š” 66๊ฐ€์ง€ ์ „๋žต๊ณผ ๊ธฐ๋ฒ•๋ณต์—ฐ ์ด
ย 
The Cucumber for Java
The Cucumber for JavaThe Cucumber for Java
The Cucumber for JavaJonghwa Lee
ย 

Similar to Refactoring tutorial (20)

Refactoring Tutorial 1์ฃผ์ฐจ[ Refactoring ๊ฐœ์š”]
Refactoring  Tutorial 1์ฃผ์ฐจ[ Refactoring ๊ฐœ์š”]Refactoring  Tutorial 1์ฃผ์ฐจ[ Refactoring ๊ฐœ์š”]
Refactoring Tutorial 1์ฃผ์ฐจ[ Refactoring ๊ฐœ์š”]
ย 
Refactoring Tutorial 1์ฃผ์ฐจ[ Refactoring ๊ฐœ์š”]
Refactoring  Tutorial 1์ฃผ์ฐจ[ Refactoring ๊ฐœ์š”]Refactoring  Tutorial 1์ฃผ์ฐจ[ Refactoring ๊ฐœ์š”]
Refactoring Tutorial 1์ฃผ์ฐจ[ Refactoring ๊ฐœ์š”]
ย 
The Introduction to Refactoring
The Introduction to Refactoring The Introduction to Refactoring
The Introduction to Refactoring
ย 
Devon 2011-b-5 ํšจ๊ณผ์ ์ธ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ๋‹ค๋ฃจ๊ธฐ
Devon 2011-b-5 ํšจ๊ณผ์ ์ธ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ๋‹ค๋ฃจ๊ธฐDevon 2011-b-5 ํšจ๊ณผ์ ์ธ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ๋‹ค๋ฃจ๊ธฐ
Devon 2011-b-5 ํšจ๊ณผ์ ์ธ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ๋‹ค๋ฃจ๊ธฐ
ย 
DevRookie ๋ฆฌํŽ™ํ„ฐ๋ง.pptx
DevRookie ๋ฆฌํŽ™ํ„ฐ๋ง.pptxDevRookie ๋ฆฌํŽ™ํ„ฐ๋ง.pptx
DevRookie ๋ฆฌํŽ™ํ„ฐ๋ง.pptx
ย 
Working with code
Working with codeWorking with code
Working with code
ย 
์นด์‚ฌ ๊ณต๊ฐœ์„ธ๋ฏธ๋‚˜1ํšŒ W.E.L.C.
์นด์‚ฌ ๊ณต๊ฐœ์„ธ๋ฏธ๋‚˜1ํšŒ  W.E.L.C.์นด์‚ฌ ๊ณต๊ฐœ์„ธ๋ฏธ๋‚˜1ํšŒ  W.E.L.C.
์นด์‚ฌ ๊ณต๊ฐœ์„ธ๋ฏธ๋‚˜1ํšŒ W.E.L.C.
ย 
TDD&Refactoring Day 01: Refactoring
TDD&Refactoring Day 01: RefactoringTDD&Refactoring Day 01: Refactoring
TDD&Refactoring Day 01: Refactoring
ย 
Chapter7~9 ppt
Chapter7~9 pptChapter7~9 ppt
Chapter7~9 ppt
ย 
C++ api design ํ’ˆ์งˆ
C++ api design ํ’ˆ์งˆC++ api design ํ’ˆ์งˆ
C++ api design ํ’ˆ์งˆ
ย 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
ย 
C Language II
C Language IIC Language II
C Language II
ย 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
ย 
[HaU] ์‹ ์ž… ๊ธฐ์ˆ  ๋ฉด์ ‘ ์ค€๋น„ java
[HaU] ์‹ ์ž… ๊ธฐ์ˆ  ๋ฉด์ ‘ ์ค€๋น„ java[HaU] ์‹ ์ž… ๊ธฐ์ˆ  ๋ฉด์ ‘ ์ค€๋น„ java
[HaU] ์‹ ์ž… ๊ธฐ์ˆ  ๋ฉด์ ‘ ์ค€๋น„ java
ย 
แ„แ…ขแ„แ…ณแ†บแ„’แ…กแ†ซ แ„แ…ฉแ„ƒแ…ณ (ํด๋ฆฐ ์ฝ”๋“œ, Clean Code)
แ„แ…ขแ„แ…ณแ†บแ„’แ…กแ†ซ แ„แ…ฉแ„ƒแ…ณ (ํด๋ฆฐ ์ฝ”๋“œ, Clean Code)แ„แ…ขแ„แ…ณแ†บแ„’แ…กแ†ซ แ„แ…ฉแ„ƒแ…ณ (ํด๋ฆฐ ์ฝ”๋“œ, Clean Code)
แ„แ…ขแ„แ…ณแ†บแ„’แ…กแ†ซ แ„แ…ฉแ„ƒแ…ณ (ํด๋ฆฐ ์ฝ”๋“œ, Clean Code)
ย 
[์Šคํ”„๋ง ์Šคํ„ฐ๋”” 1์ผ์ฐจ] ํ…œํ”Œ๋ฆฟ
[์Šคํ”„๋ง ์Šคํ„ฐ๋”” 1์ผ์ฐจ] ํ…œํ”Œ๋ฆฟ[์Šคํ”„๋ง ์Šคํ„ฐ๋”” 1์ผ์ฐจ] ํ…œํ”Œ๋ฆฟ
[์Šคํ”„๋ง ์Šคํ„ฐ๋”” 1์ผ์ฐจ] ํ…œํ”Œ๋ฆฟ
ย 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
ย 
ใ€Žแ„‹แ…ตแ„‘แ…ฆแ†จแ„แ…ตแ„‡แ…ณ แ„ƒแ…ตแ„‡แ…ฅแ„€แ…ตแ†ผใ€ - ๋””๋ฒ„๊น… ์ง€์˜ฅ์—์„œ ํƒˆ์ถœํ•˜๋Š” 66๊ฐ€์ง€ ์ „๋žต๊ณผ ๊ธฐ๋ฒ•
ใ€Žแ„‹แ…ตแ„‘แ…ฆแ†จแ„แ…ตแ„‡แ…ณ แ„ƒแ…ตแ„‡แ…ฅแ„€แ…ตแ†ผใ€ - ๋””๋ฒ„๊น… ์ง€์˜ฅ์—์„œ ํƒˆ์ถœํ•˜๋Š” 66๊ฐ€์ง€ ์ „๋žต๊ณผ ๊ธฐ๋ฒ•ใ€Žแ„‹แ…ตแ„‘แ…ฆแ†จแ„แ…ตแ„‡แ…ณ แ„ƒแ…ตแ„‡แ…ฅแ„€แ…ตแ†ผใ€ - ๋””๋ฒ„๊น… ์ง€์˜ฅ์—์„œ ํƒˆ์ถœํ•˜๋Š” 66๊ฐ€์ง€ ์ „๋žต๊ณผ ๊ธฐ๋ฒ•
ใ€Žแ„‹แ…ตแ„‘แ…ฆแ†จแ„แ…ตแ„‡แ…ณ แ„ƒแ…ตแ„‡แ…ฅแ„€แ…ตแ†ผใ€ - ๋””๋ฒ„๊น… ์ง€์˜ฅ์—์„œ ํƒˆ์ถœํ•˜๋Š” 66๊ฐ€์ง€ ์ „๋žต๊ณผ ๊ธฐ๋ฒ•
ย 
The Cucumber for Java
The Cucumber for JavaThe Cucumber for Java
The Cucumber for Java
ย 
EC 789
EC 789EC 789
EC 789
ย 

Refactoring tutorial

  • 2. ๋ชฉ์ฐจ ๏ฝ ๋ฆฌํŒฉํ† ๋ง ๊ฐœ์š” ๏ฝ ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ๋ƒ„์ƒˆ ๏ฝ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ƒ„์ƒˆ ๏ฝ ์ด๋ฆ„ ๏ฝ ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ ๏ฝ ์ค‘๋ณต ๏ฝ ์กฐ๊ฑด ๋กœ์ง ๏ฝ ํด๋ž˜์Šค ์‚ฌ์ด์˜ ๋ƒ„์ƒˆ ๏ฝ ๋ฐ์ดํ„ฐ ๏ฝ ์ƒ์† ๏ฝ ์ฑ…์ž„ ๏ฝ ๋ณ€๊ฒฝ์ˆ˜์šฉํ•˜๊ธฐ ๏ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋ž˜์Šค ๏ฝ ํ”„๋กœ๊ทธ๋žจ ๋ฆฌํŒฉํ† ๋ง
  • 4. ๋ฆฌํŒฉํ† ๋ง ๋ฐฐ๊ฒฝ : ๋ฆฌํŒฉํ† ๋ง ์ด๋ž€? Bad Code Good Code ๋ฆฌํŒฉํ† ๋ง
  • 5. ๋ฆฌํŒฉํ† ๋ง ๋ฐฐ๊ฒฝ: : Bad Code๊ฐ€ ์•ผ๊ธฐ์‹œํ‚ค๋Š” ๋ฌธ์ œ์  Broken Window Theory ๋‚˜์œ์ฝ”๋“œ์— ์˜ํ•œ ์ƒ์‚ฐ์„ฑ ์ €ํ•˜๋Š” ๊ณ„์† ์•…ํ™”๋จ
  • 6. ๋ฆฌํŒฉํ† ๋ง ์ •์˜ ๏ฝ ๋ช…์‚ฌํ˜• ์ •์˜ ๏ฝ โ€œ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ณ , ์ ์€ ๋น„์šฉ์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฒ‰์œผ๋กœ ๋ณด์ด๋Š” ๋™์ž‘์˜ ๋ณ€ํ™” ์—†์ด ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ณ€ ๊ฒฝํ•˜๋Š” ๊ฒƒโ€ ๏ฝ ๋™์‚ฌํ˜• ์ •์˜ ๏ฝ โ€œ์ผ๋ จ์˜ ๋ฆฌํŒฉํ† ๋ง์„ ์ ์šฉํ•˜์—ฌ ๊ฒ‰์œผ๋กœ ๋ณด์ด๋Š” ๋™์ž‘์˜ ๋ณ€ํ™” ์—†์ด ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊พผ๋‹ค.โ€ ๏ฝ ๋‹ค์Œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋™์ž‘์˜ ๋ณ€๊ฒฝ ์—ฌ๋ถ€ ๊ฒ€์ฆ ๏ฝ ํ…Œ์ŠคํŒ… ๏ฝ ์ตœ๋Œ€ํ•œ ๊ฐœ๋ฐœ Tool์˜ ์ง€์› ๊ธฐ๋Šฅ ์‚ฌ์šฉ ๏ฝ ์•„์ฃผ ์กฐ์‹ฌํžˆ ์ง„ํ–‰ ๏ฝ Refactoring์˜ ์˜ˆ public int getCharge(int quantity) { public int getCharge(int quantity) { int charge = 0; int charge = 0; Date now = new Date(); Date now = new Date(); // ํ˜„์žฌ Summerํƒ€์ž„ ๊ธฐ๊ฐ„์ด๋ผ๋ฉด if (isSummerTime(now)) { if (now.before(SUMMER_START)|| now.after(SUMMER_END)) { charge = quantity * WINTER_RATE + charge = quantity * WINTER_RATE + WINTER_SERVICEC_CHARGE; WINTER_SERVICEC_CHARGE; } else { } else { charge = quantity * SUMMER_RATE; charge = quantity * SUMMER_RATE; } } return charge; return charge } } private boolean isSummerTime(Date now) { return now.before(SUMMER_START) || now.after(SUMMER_END); }
  • 7. ๋ฆฌํŒฉํ† ๋ง ์›๋ฆฌ : ์™œ ๋ฆฌํŒฉํ† ๋ง์„ ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? ๏ฝ ํ”„๋กœ๊ทธ๋žจ์„ ๋นจ๋ฆฌ ์ž‘์„ฑํ•˜๋„๋ก ๋„์™€์คŒ ๏ฝ ์–ด๋–ป๊ฒŒ? ๏ฝ ๋ฆฌํŒฉํ† ๋ง์€ ๋””์ž์ธ์„ ๊ฐœ์„ ์‹œ์ผœ ์คŒ ๏ฝ ๋””์ž์ธ์ด ๋‚˜์œ ์ฝ”๋“œ๋Š”? ๏ฝ ๊ฐ™์€ ์ž‘์—…์„ ์œ„ํ•ด ๋” ๋งŽ์€ ์ฝ”๋“œ ์‚ฌ์šฉ ๏ฝ ์ค‘๋ณต์ด ๋งŽ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›€ ๏ฝ ์ˆ˜์ • ์‹œ ์–ด๋ ค์›€์œผ๋กœ ๋‚˜ํƒ€๋‚จ ๏ฝ ๋ฆฌํŒฉํ† ๋ง์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ฌ ๏ฝ ๋ฆฌํŒฉํ† ๋ง๋œ ์ฝ”๋“œ๋Š” ์ˆจ๊ฒจ์ง„ ์‚ฌ์šฉ์ž์ธ ์œ ์ง€๋ณด์ˆ˜์ž์˜ ์ดํ•ด๋ฅผ ๋„์›€ ๏ฝ ๋‚ฎ์„  ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋ฆฌํŒฉํ† ๋ง ํ•˜๋ฉด์„œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ธฐ๋„ ํ•จ
  • 8. ๋ฆฌํŒฉํ† ๋ง ์›๋ฆฌ : ์–ธ์ œ ๋ฆฌํŒฉํ† ๋ง์„ ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? ๏ฝ ํ‹ˆํ‹ˆ์ด ๊ณ„์† ๏ฝ ๋ฆฌํŒฉํ† ๋ง ์ž์ฒด๊ฐ€ ๋ชฉ์ ์ด ์•„๋‹ˆ๋ผ, ๋‹ค๋ฅธ ๊ฒƒ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌํŒฉํ† ๋ง ์„ ํ•˜๋Š” ๊ฒƒ์ด๊ณ , ๋ฆฌํŒฉํ† ๋ง์€ ๊ทธ ๋‹ค๋ฅธ ๊ฒƒ์„ ํ•˜๋Š”๋ฐ ๋„์›€์„ ์ค€๋‹ค. ๏ฝ ์‚ผ์ง„ ๊ทœ์น™ ๏ฝ ์„ธ ๋ฒˆ์งธ๋กœ ๋น„์Šทํ•œ ๊ฒƒ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฆฌํŒฉํ† ๋ง์„ ํ•œ๋‹ค ๏ฝ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ, ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ๏ฝ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด์„œ ๏ฝ ์ฝ”๋“œ ๊ฒ€ํ†  ์‹œ ๏ฝ ๊ณ ์ˆ˜์ค€์˜ ์˜๊ฒฌ์„ ์–ป์„ ์ˆ˜ ์žˆ์Œ ๏ฝ ์ค€๋น„๊ฐ€ ๋งŽ์ด ํ•„์š”ํ•จ
  • 9. ๋ฆฌํŒฉํ† ๋ง ์›๋ฆฌ : ๋‘ ๊ฐœ์˜ ๋ชจ์ž ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋ฆฌํŒฉํ† ๋ง ๏‚ง ๊ธฐ์กด ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๏‚ง ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์—†์ด ์ฝ”๋“œ ๊ตฌ์กฐ ์ˆ˜์ • ๏‚ง ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ ๏‚ง ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„์•ผ ํ•จ ๏‚ง ํ…Œ์ŠคํŠธ ์ •์ƒ ๋™์ž‘ ํ™•์ธ ๏‚ง ํ…Œ์ŠคํŠธ ์ •์ƒ ๋™์ž‘ ํ™•์ธ ๊ฐœ๋ฐœํ•  ๋•Œ์—๋Š” ๋ชจ์ž๋ฅผ ์ž์ฃผ ๋ฐ”๊ฟ” ์“ฐ๊ณ (10๋ถ„~30๋ถ„), ํ•œ ์‹œ์ ์—๋Š” ํ•˜๋‚˜์˜ ๋ชจ์ž๋งŒ ์จ์•ผ ํ•œ๋‹ค.
  • 10. ๋ฆฌํŒฉํ† ๋ง ์›๋ฆฌ : ๋ฆฌํŒฉํ† ๋ง์„ ํ•  ๋•Œ์˜ ๋ฌธ์ œ ๏ฝ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์™€ ์—ฐ๊ด€๋œ ์ฝ”๋“œ์˜ ๋ฆฌํŒฉํ† ๋ง ๏ฝ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ณ€๊ฒฝ ๏ฝ Publish ๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ด๋ฆ„ ๋ฐ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ๋ฆฌํŒฉํ† ๋ง ๏ฝ Ex) Android์˜ Service.onStart() ๋ฉ”์†Œ๋“œ ๏ฝ ์ƒˆ๋กœ์šด I/F๋ฅผ ๋งŒ๋“ค๊ณ  Delegation ์‚ฌ์šฉ ๏ฝ ์˜ˆ๋ฐฉ์ฑ… : ์• ๋งคํ•œ ๋ฉ”์†Œ๋“œ๋Š” API์— ๋„ฃ์ง€ ๋ง์ž ๏ฝ Publish ๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ Throw์ ˆ์˜ ๋ณ€๊ฒฝ ๏ฝ ์ด ๊ฒฝ์šฐ Delegation ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ๏ฝ ์˜ˆ๋ฐฉ์ฑ… : Super Exception ์‚ฌ์šฉ ๏ฝ ๋ฆฌํŒฉํ† ๋ง์ด ์–ด๋ ค์šด ๋””์ž์ธ ๋ณ€๊ฒฝ ๏ฝ ๋””์ž์ธ์— ์‹ค์ˆ˜๊ฐ€ ์žˆ์–ด ๋งˆ์Œ๋Œ€๋กœ ๋ฆฌํŒฉํ† ๋ง ํ•  ์ˆ˜ ์—†์„ ๋•Œ ๏ฝ ์–ด๋–ค ๋””์ž์ธ ๊ฒฐ์ • ์‚ฌํ•ญ์ด ๋„ˆ๋ฌด ์ค‘์š”ํ•ด์„œ ๋ฆฌํŒฉํ† ๋ง์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๏ฝ ๋ณด์•ˆ ๋ฌธ์ œ, ํผํฌ๋จผ์Šค ๋ฌธ์ œ ๏ฝ ์–ธ์ œ ๋ฆฌํŒฉํ† ๋ง์„ ํ•˜์ง€ ๋ง์•„์•ผ ํ•˜๋Š”๊ฐ€? ๏ฝ ์ฝ”๋“œ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ž‘์„ฑ ํ•˜๋Š” ๊ฒŒ ๋‚˜์„ ์ •๋„๋กœ ์—‰๋ง์ธ ๊ฒฝ์šฐ ๏ฝ ํ˜„์žฌ์˜ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๏ฝ ๋งˆ๊ฐ์ผ์— ๊ฐ€๊นŒ์šธ ๊ฒฝ์šฐ
  • 11. ๋ฆฌํŒฉํ† ๋ง ์›๋ฆฌ : ์‚ฌ์ „ ๋””์ž์ธ๊ณผ ๋ฆฌํŒฉํ† ๋ง์˜ ํšจ์šฉ์„ฑ ๊ด€๊ณ„ ๏ฝ โ€œ๋””์ž์ธ์œผ๋กœ๋Š” ์ƒ๊ฐ์„ ์•„์ฃผ ๋นจ๋ฆฌ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ ์ƒ๊ฐ์—๋Š” ์—ฌ ๊ธฐ์ €๊ธฐ ์ž‘์€ ๊ตฌ๋ฉ์ด ๋šซ๋ ค์žˆ๋‹ค.โ€ ๏ฝ โ€œWith design I can think very fast, but my thinking is full of little holesโ€ โ€“ Alistair Cockburn ๏ฝ ๋ฆฌํŒฉํ† ๋ง์— ์˜ํ•ด ์‚ฌ์ „ ๋””์ž์ธ์˜ Role์ด ๋ณ€๊ฒฝ๋จ ๏ฝ ์™„๋ฒฝํ•œ ์‚ฌ์ „ ๋””์ž์ธ์ด ์•„๋‹Œ ์ ์ ˆํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜๋Š” ๋””์ž์ธ์ด๋ฉด ์ถฉ๋ถ„ ๏ฝ ๋ฆฌํŒฉํ† ๋ง์„ ํ†ตํ•ด ๋ณ€๊ฒฝ์— ๋งŽ์€ ๋น„์šฉ์ด ๋“ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ ๏ฝ ๋”ฐ๋ผ์„œ, ๋””์ž์ธ์ด ๋‹จ์ˆœํ™” ๋จ ๏ฝ ๋””์ž์ธ ์ค‘์‹ฌ์˜ ๋‹จ์  ๏ฝ ์„ค๊ณ„ ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค. ๏ฝ ๋ณต์žกํ•ด ์ง„๋‹ค. ๏ฝ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋งŽ์ด ๋“ ๋‹ค. ๏ฝ ์ค‘๋ณต์— ์˜ํ•œ๊ฒŒ ์•„๋‹Œ Complexity ๋•Œ๋ฌธ
  • 12. ๋ฆฌํŒฉํ† ๋ง ์›๋ฆฌ : ๋ฆฌํŒฉํ† ๋ง๊ณผ ํผํฌ๋จผ์Šค ๏ฝ ๋ฆฌํŒฉํ† ๋ง์€ ์žฅ๊ธฐ์ ์œผ๋กœ ์ตœ์ ํ™” ๋‹จ๊ณ„์— ์†Œํ”„ํŠธ์›จ์–ด์˜ ํŠœ๋‹์„ ๋•๋Š”๋‹ค. ๏ฝ ๋ฆฌํŒฉํ† ๋ง์„ ํ†ตํ•ด ํผํฌ๋จผ์Šค ํŠœ๋‹์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„ ์–ป์„ ์ˆ˜ ์žˆ์Œ. ๏ฝ ํ”„๋กœ๊ทธ๋žจ์ด ์ž˜ ๋ถ„ํ•ด๋˜์–ด ์žˆ์œผ๋ฉด, ํŠœ๋‹์„ ์œ„ํ•œ ๋ถ„์„ ์‹œ ์ข€ ๋” ์„ธ๋ฐ€ํ•œ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • 13. ๋ƒ„์ƒˆ ๏ฝ ๋ƒ„์ƒˆ(์ฝ”๋“œ๋ƒ„์ƒˆ)๋Š” ์ฝ”๋“œ์— ์ž ์žฌ๋œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ  ํ‘œ ์‹œ ๏ฝ ๋ฆฌํŒฉํ† ๋ง์„ ํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์  ํ‘œ์‹œ ๏ฝ ๋Œ€ํ‘œ์  ๋ƒ„์ƒˆ ๏ฝ ์ค‘๋ณต์ฝ”๋“œ ๏ฝ ๋ถ€์ ์ ˆํ•œ ์ด๋ฆ„ ๏ฝ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š•์‹ฌ ๏ฝ ๋ถ€์ ์ ˆํ•œ ์นœ๋ฐ€ ๏ฝ ์ฃผ์„ ๏ฝ ๊ธด ๋ฉ”์†Œ๋“œ ๏ฝ ๊ธด ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ ๏ฝ Switch๋ฌธ
  • 14. ๋ƒ„์ƒˆ : ์ค‘๋ณต ์ฝ”๋“œ ๏ฝ ๊ฐ€์žฅ ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ๋ƒ„์ƒˆ ๏ฝ ๋‘ ๊ฐ€์ง€ ์ค‘๋ณต์ด ์žˆ์Œ ๏ฝ Obvious ์ค‘๋ณต ๏ฝ ๋ณดํ†ต Copy & Paste์— ์˜ํ•ด ๋ฐœ์ƒ ๏ฝ Unobvious ์ค‘๋ณต ๏ฝ ๊ณ„์ธต๊ตฌ์กฐ์˜ ๋ณ‘๋ ฌ์  ๊ตฌํ˜„ ๏ฝ ๋น„์Šทํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜(ex, ๋ฌธ์ž์—ด, ๋„๋ฉ”์ธ ํŠนํ™” ๋กœ์ง) ๏ฝ ํ•ด๊ฒฐ์ฑ… ๏ฝ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์—์„œ ์ค‘๋ณต ๏ฝ ExtractMethod ๏ฝ ๋‘ ํ˜•์ œ ํด๋ž˜์Šค์—์„œ ์ค‘๋ณต ๏ฝ ExtractMethod -> Pull Up Field or Pull Up Method -> Form Template Method
  • 15. ๋ƒ„์ƒˆ : ๋ถ€์ ์ ˆํ•œ ์ด๋ฆ„ ๏ฝ ์ž˜๋ชป๋œ ์ด๋ฆ„์€ ์ฝ”๋“œ์˜ ์ดํ•ด๋ฅผ ๋ฐฉํ•ดํ•œ๋‹ค. ๏ฝ โ€œPeople often make assumptions based on the object names aloneโ€ โ€“ Word Cunningham ๏ฝ ํ•ด๊ฒฐ์ฑ… ๏ฝ Rename Method ๏ฝ Rename Field ๏ฝ Rename Constants ๏ฝ Tip ! ๏ฝ ์ผ๊ด€์„ฑ ์—†๋Š” ์ƒ์„ธ์ด๋ฆ„ ๋ณด๋‹ค๋Š” ์ผ๊ด€์„ฑ ์žˆ๋Š” ๊ด‘์˜์˜ ์ด๋ฆ„์ด ์ ํ•ฉ ๏ฝ add, register, put, create -> add ๏ฝ ์ผ๊ด€์„ฑ ์žˆ๋Š” ์ด๋ฆ„์„ ์œ„ํ•ด์„œ ์šฉ์–ด ์‚ฌ์ „์€ ํ•„์ˆ˜์ 
  • 16. ๋ƒ„์ƒˆ : ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š•์‹ฌ ๏ฝ ํŠน์ • ํด๋ž˜์Šค ๋‚ด์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋™ PriceCalculator Product ์ž‘์„ ์œ„ํ•ด ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์žˆ๋Š” .. calculate() .. getQuantity() ์ •๋ณด๋ฅผ ๋งŽ์ด ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ bmethod() getDiscountRate() ๏ฝ ํ•ด๊ฒฐ์ฑ… ๏ฝ Move Method
  • 17. ๋ƒ„์ƒˆ : ๋ถ€์ ์ ˆํ•œ ์นœ๋ฐ€ ๏ฝ ํŠน์ • ํด๋ž˜์Šค ๋‚ด์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋‹ค๋ฅธ Class A Class B ํด๋ž˜์Šค์— ์žˆ๋Š” ๋ฉ”์†Œ๋“œ(private ์ด .. .. ์–ด์•ผ ํ• )๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ amethod() xmethod() bmethod() ymethod() ๏ฝ ํ•ด๊ฒฐ์ฑ… ๏ฝ ๋‘ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ํด๋ž˜์Šค๊ฐ€ ์—‰์ผœ ์žˆ๋‹ค ๋ฉด ๏ฝ Move Method ๏ฝ ์„œ๋กœ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค๋ฉด ๏ฝ Change Bidirectional Reference to Unidirectional ๏ฝ ์ค‘์žฌํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—‰์ผœ ์žˆ๋‹ค๋ฉด ๏ฝ Extract Hierarchy-> Hide Delegate
  • 18. ๋ƒ„์ƒˆ : ์ฃผ์„ ๏ฝ ์ฃผ์„์€ ๋Œ€๋ถ€๋ถ„ ์ฝ”๋“œ๊ฐ€ ๋ช…ํ™• ์น˜ ์•Š๋‹ค๊ณ  ํŒ๋‹จ๋  ๋•Œ ์“ฐ์ž„ ๏ฝ ์ฃผ์„์€ ๋‚˜์œ ์ฝ”๋“œ๋ฅผ ์œ ๋„ํ•จ ๏ฝ ํ•ด๊ฒฐ์ฑ… ๏ฝ ์ฝ”๋“œ์˜ ์ผ์ • ๋ธ”๋ก ์„ค๋ช… ๏ฝ Extract Method ๏ฝ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•˜๋Š” ์ผ ์„ค๋ช… ๏ฝ Rename Method ๏ฝ ์„  ์กฐ๊ฑด ์„ค๋ช… ๏ฝ Introduce Assertion
  • 19. ๋ƒ„์ƒˆ : ๊ธด ๋ฉ”์†Œ๋“œ ๏ฝ ๊ธด ๋ฉ”์†Œ๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ํž˜๋“ค๊ฒŒ ๋งŒ๋“ ๋‹ค. ๏ฝ ์ฃผ์„์„ ๋‹ฌ์•„์•ผ ํ•  ํ•„์š”๋ฅผ ๋Š๋‚„ ๋•Œ ๋งˆ๋‹ค ๋ฉ”์†Œ๋“œ๋กœ ๋ถ„๋ฆฌ ๏ฝ ํ•ด๊ฒฐ์ฑ… ๏ฝ Extract Method ๏ฝ ์ฃผ์˜์  ๏ฝ ์ฝ”๋“œ์˜ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ์ž˜ ๋‚˜ํƒ€๋‚ด๋Š” ์ด๋ฆ„ ์ง€์–ด์•ผ ๏ฝ ๋ถ€์ ์ ˆํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์งง์€ ๋ฉ”์†Œ๋“œ ์ง‘ํ•ฉ์€ ๊ธด ๋ฉ”์†Œ๋“œ๋ณด๋‹ค ์ดํ•ดํ•˜ ๊ธฐ ํž˜๋“ค๋‹ค.
  • 20. ๋ƒ„์ƒˆ : ๊ธด ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ ๏ฝ ๊ฐ์ฒด์ง€ํ–ฅ ์ฝ”๋“œ์—์„œ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋งŽ์„ ํ•„์š” ์—†๋‹ค. ๏ฝ ๋ฌธ์ œ์  ๏ฝ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›€ ๏ฝ ์ผ๊ด€์„ฑ ์—†์Œ ๏ฝ ๋ณ€๊ฒฝ์ด ๋งŽ์ด ๋จ ๏ฝ ํ•ด๊ฒฐ์ฑ… ๏ฝ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ๊ฐ’ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ์Œ ๏ฝ Replace Parameter with Method ๏ฝ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜์˜ Object๋กœ ๋ถ€ํ„ฐ ๋‚˜์˜ค๋ฉด ๏ฝ Preserve Whole Object ๏ฝ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ ๊ฐ์ฒด๋กœ ๋ถ€ํ„ฐ ์–ป์–ด์ง€๋Š”๊ฒŒ ์•„๋‹ ๊ฒฝ์šฐ ๏ฝ Introduce Parameter Object ๏ฝ ์ฃผ์˜์  ๏ฝ Caller์™€ Callee๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ข…์†์„ฑ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋ฆฌํŒฉํ† ๋ง์„ ํ”ผํ•ด์•ผํ•จ
  • 21. ๋ƒ„์ƒˆ : Switch ๋ฌธ ๏ฝ Switch๋ฌธ์€ ๋ณธ์งˆ์ ์œผ๋กœ ์ค‘๋ณต์˜ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ ๏ฝ ํƒ€์ž… ์ถ”๊ฐ€ ์‹œ, ๊ด€๋ จ๋œ ๋ชจ๋“  Switch๋ฌธ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•จ ๏ฝ ์ข‹์€ OOP์ฝ”๋“œ์˜ ํŠน์ง•์€ Switch๋ฌธ์ด ๋น„๊ต์  ์ ์Œ ๏ฝ ํ•ด๊ฒฐ์ฑ… ๏ฝ ๋™์ผํ•œ ์กฐ๊ฑด์— ๋Œ€ํ•œ Switch๋ฌธ์ด ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉ๋จ ๏ฝ Step 1: Extract Method๋ฅผ ํ†ตํ•ด ๊ฐ ์กฐ๊ฑด ์ ˆ์—์„œ ์ฝ”๋“œ ์ถ”์ถœ ๏ฝ Step 2: Move Method๋ฅผ ํ†ตํ•ด ์—ฐ๊ด€๋œ ์ฝ”๋“œ๋ฅผ ์˜ณ๋ฐ”๋ฅธ ํด๋ž˜์Šค๋กœ ์˜ฎ๊น€ ๏ฝ Step 3: Replace Type Code with Subclass or Replace Type Code with State/Strategy ๋ฅผ ํ†ตํ•ด ์ƒ์†๊ตฌ์กฐ ๋งŒ๋“ฌ ๏ฝ ์ฃผ์˜ ๏ฝ Switch๋ฌธ์˜ ์ค‘๋ณต์ด ๋งŽ์ง€ ์•Š๋‹ค๋ฉด ๋ฐ”๊ฟ€ ํ•„์š” ์—†์Œ 21 Confidential 12/13/2011
  • 22. ๊ฒฐ๋ก  ๏ฝ ๋ฆฌํŒฉํ† ๋ง์€ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ ๋‹ค. ๏ฝ ๋ฆฌํŒฉํ† ๋ง์€ ๋ชฉํ‘œ๊ฐ€ ์•„๋‹ˆ๋ผ, ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•˜๊ธฐ ์œ„ํ•œ ๊ณผ ์ •์ด๋‹ค. ๏ฝ ๋ฆฌํŒฉํ† ๋ง์€ ํ‹ˆํ‹ˆํžˆ ๊ณ„์† ํ•ด์•ผ ํ•œ๋‹ค. 22 Confidential 12/13/2011
  • 24. ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ƒ„์ƒˆ 24 Confidential 12/13/2011
  • 25. ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ƒ„์ƒˆ : ๊ฐœ์š” ๏ฝ ํŠน์ง• ๏ฝ ์ฐพ๊ธฐ ์‰ฝ๋‹ค. ๏ฝ ๊ด€๋ จ ๋ƒ„์ƒˆ ๏ฝ ์ฃผ์„ ๏ฝ ๊ธด ๋ฉ”์†Œ๋“œ ๏ฝ ๊ฑฐ๋Œ€ํ•œ ํด๋ž˜์Šค ๏ฝ ๊ธด ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฆฌ์ŠคํŠธ
  • 26. ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ƒ„์ƒˆ : ์ฃผ์„ ํ•ญ๋ชฉ ์„ค๋ช… ์ง•ํ›„ โ€ข ์ฃผ์„๊ธฐํ˜ธ๊ฐ€ ์ฝ”๋“œ์— ๋‚˜ํƒ€๋‚จ -> ์ฃผ์„์€ ํ–ฅํ›„ ์—…๋ฐ์ดํŠธ์—์„œ ๋ˆ„๋ฝ๋  ์—ฌ์ง€๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋ชป ๋œ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ผ ๊ฐ€๋Šฅ์„ฑ ์ดํผ ์›์ธ โ€ข ์ฝ”๋“œ๊ฐ€ ๋ช…ํ™• ์น˜ ์•Š๋‹ค๊ณ  ํŒ๋‹จ๋  ๋•Œ ์“ฐ์ž„ - ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋˜๋Š” ๊ฐœ๋ฐœ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์œ„ํ•ด ์“ฐ์ž„ ํ•ด์•ผ ํ•  ์ผ โ€ข ์ผ์ • ๋ธ”๋ก ์„ค๋ช… -> Extract Method โ€ข ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•˜๋Š” ์ผ ์„ค๋ช… -> Rename Method โ€ข ์„ ์กฐ๊ฑด ์„ค๋ช… -> Introduce Assertion ํšจ๊ณผ โ€ข ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„ โ€ข ์ค‘๋ณต ๋…ธ์ถœ ๊ธˆ๊ธฐ ์ž๊ธฐ ์—ญํ• ์„ ๋‹คํ•˜๋Š” ์ฃผ์„ ์‚ญ์ œํ•˜์ง€ ๋ง์•„์•ผ ํ•จ
  • 27. ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ƒ„์ƒˆ : ์ฃผ์„ - ์˜ˆ์ œ์ฝ”๋“œ package ch3; public class Matcher { public Matcher() { } ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•˜๋Š” ์ผ ์„ค๋ช… [Rename Method] // ๋ฐฐ์—ด๊ฐ’์˜ ๊ฐ ์š”์†Œ๋“ค์ด ์ด์— ๋Œ€์‘๋˜๋Š” ์˜ˆ์ธก ๊ฐ’๊ณผ ํ—ˆ์šฉ๋ฒ”์œ„ ๋‚ด์˜ ์ฐจ์ด๋ฅผ ๊ฐ–๋Š”์ง€ ์ฒดํฌํ•œ๋‹ค. public boolean compare(int[] expected, int[] actual, int clipLimit, int delta) { // clipLimit๋ณด๋‹ค ํฐ ๊ฐ’์„ ์ž˜๋ผ๋‚ธ๋‹ค. ๋ธ”๋ก์ด ํ•˜๋Š” ์ผ ์„ค๋ช… [Extract Method] for (int i = 0; i < actual.length; i++) if (actual[i] > clipLimit) actual[i] = clipLimit; // ๋น„๊ตํ•˜๋ ค๋Š” ๋‘ ๋ฐฐ์—ด๊ฐ’์˜ ๊ธธ์ด๊ฐ€ ๊ฐ™์€์ง€ ์ฒดํฌํ•œ๋‹ค. ๋ธ”๋ก์ด ํ•˜๋Š” ์ผ ์„ค๋ช… [Extract Method] if (actual.length != expected.length) return false; // ๋ฐฐ์—ด์˜ ๊ฐ ๊ฐ’์˜ ์ฐจ์ด๊ฐ€ delta๋ฅผ ๋ฒ—์–ด๋‚˜๋Š”์ง€ ์ฒดํฌํ•œ๋‹ค. for (int i = 0; i < actual.length; i++) if (Math.abs(expected[i] - actual[i]) > delta) return false; return true; } } 27 Confidential 12/13/2011
  • 28. Refactoring ๊ธฐ๋ฒ• : Extract Method ๊ทธ๋ฃน์œผ๋กœ ํ•จ๊ป˜ ๋ฌถ์„ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์กฐ๊ฐ์ด ์žˆ์œผ๋ฉด โ†’ ์ฝ”๋“œ์˜ ๋ชฉ์ ์ด ์ž˜ ๋“œ๋Ÿฌ๋‚˜๋Š” ์ด๋ฆ„์„ ๊ฐ–๋Š” ๋ณ„๋„์˜ ๋ฉ”์†Œ๋“œ๋กœ ๋ฝ‘์•„๋‚ธ๋‹ค. { { // clipLimit๋ณด๋‹ค ํฐ ๊ฐ’์„ ์ž˜๋ผ๋‚ธ๋‹ค. // clipLimit๋ณด๋‹ค ํฐ ๊ฐ’์„ ์ž˜๋ผ๋‚ธ๋‹ค. for (int i = 0; i < actual.length; i++) for (int i = 0; i < actual.length; i++) if (actual[i] > clipLimit) if (actual[i] > clipLimit) actual[i] = clipLimit; actual[i] = clipLimit; } } private void cutLargeValues(int[] values, int limit) { for (int i = 0; i < values.length; i++) if (valuesl[i] > limit) values [i] = limit; } ๏ฝ ์งง๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์œผ๋กœ ๋œ ๋ฉ”์†Œ๋“œ์˜ ์ด์  ๏ฝ ์žฌ์‚ฌ์šฉ๋  ํ™•๋ฅ ์ด ๋†’์•„์ง ๏ฝ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ชฝ์—์„œ ๋ดค์„ ๋•Œ ์ผ๋ จ์˜ ์ฃผ์„์„ ์ฝ๋Š” ๊ฒƒ ๊ณผ ๊ฐ™์€ ๋Š๋‚Œ์„ ์ค€๋‹ค ๏ฝ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค ๏ฝ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค 28 Confidential 12/13/2011
  • 29. Refactoring ๊ธฐ๋ฒ• : Rename Method ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์ด ๊ทธ ๋ชฉ์ ์„ ๋“œ๋Ÿฌ๋‚ด์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋‹ค๋ฉด โ†’ ๋ชฉ์ ์— ๋งž๊ฒŒ ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”๋ผ ๏ฝ ์ข‹์€ ์ด๋ฆ„์€ ๋ชจ๋“ˆํ™”๋œ ์ฝ”๋“œ๊ฐ€ ๋น›์„ ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ์ „์ œ์กฐ๊ฑด ๏ฝ ์ด๋ฆ„์„ ์ž˜ ์ง“๊ธฐ ์œ„ํ•ด์„œ ๏ฝ ์ถ”์ƒํ™” ๋Šฅ๋ ฅ์„ ๊ธฐ๋ฅด์ž ๏ฝ ๊ตญ์–ด๋ฅผ ์ž˜ํ•ด์•ผ ํ•œ๋‹ค. ๏ฝ ์ด๋ฆ„์„ ์ž˜ ์ง“๋Š” ๊ธฐ์ˆ ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ง„์ •์œผ๋กœ ์ˆ™๋ จ๋œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ์—ด์‡  ์ค‘ ํ•˜๋‚˜!! 29 Confidential 12/13/2011
  • 30. Refactoring ๊ธฐ๋ฒ• : Introduce Assertion ์ฝ”๋“œ์˜ ํ•œ ๋ถ€๋ถ„์ด ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ์— ๋Œ€ํ•˜์—ฌ ์–ด๋–ค ๊ฒƒ์„ ๊ฐ€์ •ํ•˜๊ณ  ์žˆ์œผ๋ฉด โ†’ assertion์„ ์จ์„œ ๊ฐ€์ •์„ ๋ช…์‹œ์ ์œผ๋กœ ๋งŒ๋“ค์–ด๋ผ double getExpenseLimit() { double getExpenseLimit() { // should have either expense limit or a primary project return Assert.isTrue (_expenseLimit != NULL_EXPENSE || _primaryProject != null); (_expenseLimit != NULL_EXPENSE) ? return (_expenseLimit != NULL_EXPENSE) ? _expenseLimit: _expenseLimit: _primaryProject.getMemberExpenseLimit(); _primaryProject.getMemberExpenseLimit(); } } ๏ฝ Assertion์€ ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝ์‹œํ‚ค์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค. ๏ฝ Assertion์€ ํ•ญ์ƒ ์ฐธ์ด๋ผ๊ณ  ๊ฐ€์ •๋˜๋Š” ์กฐ๊ฑด๋ฌธ ๏ฝ Assertion์ด ์‹คํŒจํ•˜๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์‹ค์ˆ˜ํ–ˆ์Œ์„ ๋œปํ•œ๋‹ค. ๏ฝ Assertion ๋‚จ์šฉ์— ์ฃผ์˜ํ•˜์ž ๏ฝ ๊ด€๋ฆฌํ•˜๊ธฐ์— ์–ด๋ ค์šด ๋…ผ๋ฆฌ๊ฐ€ ์ค‘๋ณต๋  ์ˆ˜ ์žˆ๋‹ค ๏ฝ Assertion ๋‚ด์˜ ์กฐ๊ฑด๋ฌธ์„ Extract Method๋กœ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜๋„ ์žˆ ์Œ 30 Confidential 12/13/2011
  • 31. ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ƒ„์ƒˆ : ๊ธด ๋ฉ”์†Œ๋“œ - ๊ฐœ์š” ํ•ญ๋ชฉ ์„ค๋ช… ์ง•ํ›„ โ€ข ๋ฉ”์†Œ๋“œ์˜ ๊ธธ์ด๊ฐ€ ํ•œ ํ™”๋ฉด์„ ๋„˜๊ธด๋‹ค. ์›์ธ โ€ข ์ฝ”๋”ฉ์„ ์ ์ ˆํ•œ ์‹œ์ ์— ๋Š์ง€ ์•Š๊ณ , ํ•˜๋‚˜์”ฉ ๋” ์ถ”๊ฐ€ํ•จ ํ•ด์•ผ ํ•  ์ผ โ€ข ๋ฉ”์†Œ๋“œ๋ฅผ ๋‚˜๋ˆ„๊ธฐ ์ „์— ๋‹ค์Œ ๋ฆฌํŒฉํ† ๋ง ๊ฐ€๋Šฅ์„ฑ ๊ฒ€ํ†  -> ์ผ์ง์„ ์œผ๋กœ ๊ธด ์ฝ”๋“œ, ์กฐ๊ฑด๋ฌธ, ๋ณ€์ˆ˜ ์‚ฌ์šฉ๋ฒ•๋“ฑ ์ •๋ฆฌ? โ€ข ์˜๋ฏธ๋ก  ์ ์œผ๋กœ ์ค‘์š”ํ•œ ์ฝ”๋“œ ๋ธ”๋ก์„ ์„ ํƒ -> ExtractMethod ํšจ๊ณผ โ€ข ์ƒˆ๋กœ์šด ํด๋ž˜์Šค์™€ ์ถ”์ƒํ™” ๋“ค์–ด๋‚จ โ€ข ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„ โ€ข ์ค‘๋ณต ๋…ธ์ถœ ๊ธˆ๊ธฐ ๊ธด ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ฐ€์žฅ ์ข‹์€ ํ‘œํ˜„ ๋ฐฉ๋ฒ•์ผ ๊ฒฝ์šฐ ๋ฆฌํŒฉํ† ๋ง ๊ธˆ์ง€
  • 32. ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ƒ„์ƒˆ : ๊ฑฐ๋Œ€ํ•œ ํด๋ž˜์Šค ํ•ญ๋ชฉ ์„ค๋ช… ์ง•ํ›„ โ€ข ๋งŽ์€ ์ˆ˜์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ โ€ข ๋งŽ์€ ์ˆ˜์˜ ๋ฉ”์†Œ๋“œ โ€ข ๋งŽ์€ ์ˆ˜์˜ ์ค„ ์›์ธ ํ•ด์•ผ ํ•  ์ผ โ€ข ์ฑ…์ž„์˜ ์ผ๋ถ€๋ฅผ ๋ถ„๋ฆฌํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด -> Extract Class โ€ข ์ƒˆ๋กœ์šด ํ•˜์œ„ ํด๋ž˜์Šคํ˜•ํƒœ๋กœ ๋ฝ‘์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด -> Extract Subclass โ€ข ๊ธฐ๋Šฅ์˜ ์ผ๋ถ€๋ฅผ ๋”ฐ๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด -> Extract Interface ํšจ๊ณผ โ€ข ์ƒˆ๋กœ์šด ํด๋ž˜์Šค์™€ ์ถ”์ƒํ™” ๋“ค์–ด๋‚จ โ€ข ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„ โ€ข ์ค‘๋ณต ๋…ธ์ถœ ๊ธˆ๊ธฐ
  • 33. Refactoring ๊ธฐ๋ฒ• : Extract Class ๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์„ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ โ†’ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€๋ จ ์žˆ๋Š” ํ•„๋“œ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋กœ ์˜ฎ๊ฒจ๋ผ ๏ฝ ๊ฐ™์ด ๋ณ€ํ•˜๊ฑฐ๋‚˜, ์„œ๋กœ ์˜์กด์ ์ธ ๋ฐ์ดํ„ฐ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด ์žˆ๋‹ค๋ฉด, ๏ฝ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๋ณ„๋„์˜ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌ! 33 Confidential 12/13/2011
  • 34. Refactoring ๊ธฐ๋ฒ• : Extract Class โ€“ ํ›„๋ณด ์ •ํ•˜๊ธฐ 34 Confidential 12/13/2011
  • 35. Refactoring ๊ธฐ๋ฒ• : Extract Subclass ์–ด๋–ค ํด๋ž˜์Šค๊ฐ€ ์ผ๋ถ€ ์ธ์Šคํ„ด์Šค์— ์˜ํ•ด์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด โ†’ ๊ธฐ๋Šฅ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๋‹ด๋‹นํ•˜๋Š” ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ผ JobItem +getTotalPrice() JobItem +getUnitPrice() +getTotalPrice() +getUnitPrice() +getEmployee() LaborItem +getUnitPrice() +getEmployee() ๏ฝ Extract Class์™€ Extract Subclass ์˜ ์„ ํƒ ๏ฝ Extract Subclass๋Š” ํ•œ๊ฐ€์ง€ ๊ด€์ ์˜ ๋‹ค์–‘์„ฑ(variation)๋งŒ์„ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๏ฝ ์‚ฌ๋žŒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๊ฐ€๊ฒฉ๋Œ€๋งŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๋‹ค. ๏ฝ Extract Class๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ด€์ ์˜ ๋‹ค์–‘์„ฑ(variation)์„ ์ˆ˜์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ๏ฝ ์‹œ๊ฐ„๋Œ€, ์ง€์—ญ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๊ฐ€๊ฒฉ๋Œ€๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. 35 Confidential 12/13/2011
  • 36. Refactoring ๊ธฐ๋ฒ• : Extract Interface ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•œ ํด๋ž˜์Šค ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋™์ผํ•œ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜, ๋‘ ํด๋ž˜์Šค๊ฐ€ ๊ณตํ†ต๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด โ†’ ๊ทธ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฝ‘์•„๋ผ <<interface>> Billable +getRate() Employee +hasSpecialSkill() +getRate() +hasSpecialSkill() +getName() Employee +getDepartment() +getRate() +hasSpecialSkill() +getName() +getDepartment() ๏ฝ ํ•œ ๊ทธ๋ฃน์˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋‹จ์ง€ ์–ด๋–ค ํด๋ž˜์Šค์˜ ํŠน์ • ๋ถ€๋ถ„์ง‘ ํ•ฉ๋งŒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๏ฝ ์ฑ…์ž„์ด ์–ด๋–ป๊ฒŒ ๋‚˜๋‰˜์–ด ์ง€๋Š”์ง€ ๋ช…ํ™•ํ•ด์ง ๏ฝ Extract Superclass์™€์˜ ์ฐจ์ด์  ๏ฝ Extract Interface๋Š” ๊ณตํ†ต๋œ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ณตํ†ต๋œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ถ”์ถœ๋œ๋‹ค. 36 Confidential 12/13/2011
  • 37. ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ƒ„์ƒˆ : ๊ธด ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฆฌ์ŠคํŠธ - ๊ฐœ์š” ํ•ญ๋ชฉ ์„ค๋ช… ์ง•ํ›„ ๋งค์†Œ๋“œ์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•œ ๋‘ ๊ฐœ ๋ณด๋‹ค ๋งŽ๋‹ค ์›์ธ โ€ข ๊ฐ์ฒด๊ฐ„์˜ Coupling์„ ์ค„์ด๋ ค๋Š” ์‹œ๋„์— ์˜ํ•ด ์ฃผ๋กœ ๋‚˜ํƒ€๋‚จ. ํ•ด์•ผ ํ•  ์ผ โ€ข ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด -> Replace Parameter with Method โ€ข ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์ด ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ๋„˜์–ด์˜จ๋‹ค๋ฉด -> Preserve Whole Object ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋…ผ๋ฆฌ์  ๊ฐ์ฒด๋กœ ๋ถ€ํ„ฐ ์–ป์–ด์™€์•ผ ํ•œ๋‹ค๋ฉด -> Introduce Parameter Object ํšจ๊ณผ โ€ข ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„ โ€ข ์ค‘๋ณต ๋…ธ์ถœ โ€ข ํฌ๊ธฐ ๊ฐ์†Œ ๊ธˆ๊ธฐ ๋‘ ํด๋ž˜์Šค ๊ฐ„์˜ Coupling์„ ์ค„์ผ ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฆฌ์ŠคํŠธ๋“ค์ด ์˜๋ฏธ์žˆ๋Š” ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์ด์ง€ ์•Š์„ ๋–„
  • 38. Refactoring ๊ธฐ๋ฒ• : Replace Parameter with Method ๊ฐ์ฒด๊ฐ€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ, ๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธฐ๊ณ  ์žˆ๋‹ค. ์ˆ˜์‹ ์ž ๋˜ํ•œ ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด , โ†’ ๊ทธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ˆ˜์‹ ์ž๊ฐ€ ๊ทธ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํ•˜๋ผ Int basePrice = quantity * itemPrice; int basePrice = quantity * itemPrice; discountLevel = getDiscountLevel(); double finalPrice = getDiscountedPrice(basePrice); double finalPrice = getDiscountedPrice(basePrice, discountLevel);
  • 39. Refactoring ๊ธฐ๋ฒ• : Preserve Whole Object ์–ด๋–ค ๊ฐ์ฒด์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ์–ป์€ ๋‹ค์Œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธฐ๊ณ  ์žˆ๋‹ค๋ฉด โ†’ ๋Œ€์‹  ๊ทธ ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ๋ผ Int low = daysTempRange().getLow(); Int high = daysTempRange().getHigh(); withinPlan = plan.withinRange(daysTempRange()); withinPlan = plain.withinRange(low, high) ๏ฝ ํ•œ ๊ฐ์ฒด์—์„œ ์–ป์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์ค„ ๋•Œ ๋ฐœ์ƒ ๏ฝ ๊ฐ์ฒด์— ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ ํ˜ธ์ถœ๋˜๋Š” ๋ชจ๋“  ๊ณณ์„ ์ฐพ์•„์„œ ๊ณ ์ณ์•ผ ํ•˜๋Š” ์–ด๋ ค์›€ ๋ฐœ์ƒ ๏ฝ ๋˜ํ•œ, ํ˜ธ์ถœ๋œ ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ๋Š” ๊ฐ์ฒด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต์ฝ”๋“œ ๋ฐœ์ƒ์„ ์กฐ์žฅํ•จ ๏ฝ ํ•˜์ง€๋งŒ, ์ƒˆ๋กœ์šด ์ข…์†๊ด€๊ณ„๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋จ ๏ฝ ์ข…์†์„ฑ ๊ด€์ ์œผ๋กœ ๋ถ„์„ํ•ด์•ผ ํ•จ
  • 40. Refactoring ๊ธฐ๋ฒ• : Introduce Parameter Object ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ชฐ๋ ค๋‹ค๋‹ˆ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด โ†’ ๊ทธ๊ฒƒ๋“ค์„ ๊ฐ์ฒด๋กœ ๋ฐ”๊พธ์–ด๋ผ ๏ฝ ๊ฐ™์ด ๋„˜๊ฒจ์ง€๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋Š” ํŠน๋ณ„ํ•œ ๊ทธ๋ฃน์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•ด ๏ฝ -> ๋ฐ์ดํ„ฐ ๋ฉ์–ด๋ฆฌ ๏ฝ -> ๊ฐ์ฒดํ˜•ํƒœ๋กœ ๋ฌถ์ผ ์ˆ˜ ์žˆ์Œ ๏ฝ ๋ถ€๊ฐ€ ํšจ์šฉ ๏ฝ ์ƒˆ๋กœ ์ƒ๊ธด ๊ฐ์ฒด์— ๋“ค์–ด๊ฐ€์•ผ ํ•  ๋ฉ”์†Œ๋“œ๊ฐ€ ์‰ฝ๊ฒŒ ๋ˆˆ์— ๋” ๏ฝ ์ด์— ๋”ฐ๋ผ, ์ค‘๋ณต์„ ํšจ๊ณผ์ ์œผ๋กœ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Œ
  • 41. ์ด๋ฆ„ 41 Confidential 12/13/2011
  • 42. ์ด๋ฆ„ : ๊ฐœ์š” ๏ฝ ์ข‹์€ ์ด๋ฆ„์˜ ๊ธฐ๋Šฅ ๏ฝ ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ๋…ผ์˜์˜ ๊ทผ๊ฐ„ ์–ดํœ˜ ์ œ๊ณต ๏ฝ ์˜๋„ ๋ช…ํ™•ํ™” ๏ฝ ์‹œ์Šคํ…œ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ์ง€์— ๋Œ€ํ•œ ๋ฏธ๋ฌ˜ํ•œ ๋ถ€๋ถ„ ์„ค๋ช… ๏ฝ ์ฒด๊ณ„์ ์ธ ์ด๋ฆ„์€ ์„œ๋กœ ์ƒ์Šน์ž‘์šฉ ์ผ์œผํ‚ด ๏ฝ ์ข‹์€ ์ด๋ฆ„์„ ์œ„ํ•œ ๊ฐ€์ด๋“œ ๋ผ์ธ ๏ฝ ์˜์‚ฌ์†Œํ†ต์„ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐ€์น˜๋กœ ์‚ผ๋Š”๋‹ค. ๏ฝ ์กฐ์ž‘ ๋ฉ”์†Œ๋“œ : ๋™์‚ฌํ˜•, ์ ‘๊ทผ ๋ฉ”์†Œ๋“œ : ๋ช…์‚ฌ, ํ˜•์šฉ์‚ฌ ๏ฝ ๋น„์Šทํ•œ ๊ฒƒ๋“ค์—๋Š” ๊ฐ™์€ ๋‹จ์–ด ์‚ฌ์šฉ, ์„œ๋กœ ๋‹ค๋ฅธ๊ฒƒ ๋“ค์—๋Š” ๋‹ค๋ฅธ ๋‹จ์–ด ์‚ฌ์šฉ ๏ฝ ํ•œ ๋‹จ์–ด๋กœ ๋œ ์ด๋ฆ„ ์„ ํ˜ธ ๏ฝ ๋‹ค๋ฃจ๋Š” ๋ƒ„์ƒˆ ๏ฝ ํƒ€์ž…์ด ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” ์ด๋ฆ„(Type Embedded in Name) ๏ฝ ์˜์‚ฌ์†Œํ†ต์„ ๋ฐฉํ•ดํ•˜๋Š” ์ด๋ฆ„(Uncommunicative Name) ๏ฝ ์ผ๊ด€์„ฑ ์—†๋Š” ์ด๋ฆ„(Inconsistent Name)
  • 43. ์ด๋ฆ„ : ํƒ€์ž…์ด ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” ์ด๋ฆ„ ํ•ญ๋ชฉ ์„ค๋ช… ์ง•ํ›„ ์ด๋ฆ„์ด ๋‹จ์–ด์™€ ์ธ์ˆ˜์˜ ํƒ€์ž…์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๋ณตํ•ฉ์–ด ex) addCourse(Course c) ๊ฐ์ฒด์˜ ํƒ€์ž…์ด ์ธ์ฝ”๋”ฉ๋œ ์ด๋ฆ„์ด ํ—๊ฐ€๋ฆฌ์•ˆ ํ‘œ๊ธฐ๋ฒ• ex) iCount ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค ์›์ธ โ€ข ์ด๋ฆ„์— ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋” ์˜์‚ฌ์†Œํ†ต์— ์ข‹์€ ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ -> ํ•˜์ง€๋งŒ, ์ด๋ฆ„๊ณผ ์ธ์ˆ˜์˜ ํƒ€์ž…์ด ์ค‘๋ณต๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ โ€ข ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์—์„œ์˜ ํ—๊ฐ€๋ฆฌ์•ˆ ํ‘œ๊ธฐ๋ฒ• ์‚ฌ์šฉ -> ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์—์„œ๋Š” ํƒ€์ž…์ด ๋ถˆํ•„์š”ํ•จ ํ•ด์•ผ ํ•  ์ผ โ€ข ๋ถ€์ ์ ˆํ•œ ์ด๋ฆ„์— ๋Œ€ํ•ด์„œ -> Rename Method, Rename Field, Rename Constant ํšจ๊ณผ โ€ข ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„ โ€ข ์ค‘๋ณต ์ฐพ๊ธฐ ์‰ฌ์›Œ์ง ๊ธˆ๊ธฐ โ€ข ํŒ€ ๋‚ด๋ถ€์— ํ•ด๋‹น ์ฝ”๋”ฉํ‘œ์ค€์ด ์ž๋ฆฌ ์žกํ˜€ ์žˆ์„ ๊ฒฝ์šฐ, ๊ฐ€๋…์„ฑ์— ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‘”๋‹ค.
  • 44. ์ด๋ฆ„ : ์˜์‚ฌ์†Œํ†ต์„ ๋ฐฉํ•ดํ•˜๋Š” ์ด๋ฆ„ ํ•ญ๋ชฉ ์„ค๋ช… ์ง•ํ›„ โ€ข ์ง€๋‚˜์น˜๊ฒŒ ์งง์€ ์ด๋ฆ„ โ€ข ๋ชจ์Œ์ด ์ƒ๋žต๋œ ์ด๋ฆ„ โ€ข ๋ฒˆํ˜ธ๋กœ ๊ตฌ๋ณ„๋˜๋Š” ๋ณ€์ˆ˜ โ€ข ์ด์ƒํ•œ ์•ฝ์–ด โ€ข ์˜คํ•ดํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์ด๋ฆ„ ์›์ธ ํ•ด์•ผ ํ•  ์ผ โ€ข Rename Method, Rename Field, Rename Constant ํšจ๊ณผ โ€ข ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„ ๊ธˆ๊ธฐ * ๋ฒ”์œ„๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž‘์€ ๊ณณ์—์„œ๋Š” ์งง์€ ์ด๋ฆ„์ด๋‚˜, ๋ฒˆํ˜ธ๋กœ ๊ตฌ๋ณ„๋˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ์˜๋„๋ฅผ ๋” ์ž˜ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 45. ์ด๋ฆ„ : ์ผ๊ด€์„ฑ ์—†๋Š” ์ด๋ฆ„ ํ•ญ๋ชฉ ์„ค๋ช… ์ง•ํ›„ โ€ข ๊ฐ™์€ ๊ฒƒ์— ๋Œ€ํ•ด ์—ฌ๊ธฐ์ €๊ธฐ์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค. Ex) add(), store(), put(), place(), register() ๋“ฑ ์›์ธ โ€ข ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๊ธฐ์— ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ํ•ด์•ผ ํ•  ์ผ โ€ข ๊ฐ€์žฅ ์ข‹์€ ์ด๋ฆ„์„ ๊ณจ๋ผ ํ•ด๋‹น ์ด๋ฆ„์œผ๋กœ ๋‚˜๋จธ์ง€ ์ด๋ฆ„๋“ค์„ ์ˆ˜์ • -> Rename Method, Rename Field, Rename Constant ํšจ๊ณผ โ€ข ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„ โ€ข ์ค‘๋ณต ๋…ธ์ถœ ๊ธˆ๊ธฐ โ€ข ๋ฒ”์œ„๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž‘์€ ๊ณณ์—์„œ๋Š” ์งง์€ ์ด๋ฆ„์ด๋‚˜, ๋ฒˆํ˜ธ๋กœ ๊ตฌ๋ณ„๋˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ์˜๋„๋ฅผ ๋” ์ž˜ ์ „ ๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 46. ์ข‹์€ ์ด๋ฆ„์„ ์ง“๊ธฐ ์œ„ํ•œ ๊ทœ์น™ ์˜๋„๋ฅผ ๋ถ„๋ช…ํžˆ ๋ฐํ˜€๋ผ ๊ทธ๋ฆ‡๋œ ์ •๋ณด๋ฅผ ํ”ผํ•˜๋ผ ์˜๋ฏธ ์žˆ๊ฒŒ ๊ตฌ๋ถ„ํ•˜๋ผ ๋ฐœ์Œํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผ ์ธ์ฝ”๋”ฉ์„ ํ”ผํ•˜๋ผ ์ž์‹ ์˜ ๊ธฐ์–ต๋ ฅ์„ ์ž๋ž‘ํ•˜์ง€ ๋งˆ๋ผ 46 Confidential 12/13/2011
  • 48. ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ : ์ฃฝ์€ ์ฝ”๋“œ & ์ถ”์ธก ์„ฑ ์ผ๋ฐ˜ํ™” ํ•ญ๋ชฉ ์ฃฝ์€ ์ฝ”๋“œ ์ถ”์ธก ์„ฑ ์ผ๋ฐ˜ํ™” ์ง•ํ›„ โ€ข ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ํ•„๋“œ, ์ฝ”๋“œ์˜ ์ผ๋ถ€๋ถ„, ๋ฉ”์„œ๋“œ โ€ข ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ, ํ•„๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋“ฑ ํ˜น์€ ํด๋ž˜์Šค๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ์ œ์™ธํ•œ ์–ด๋Š๊ณณ์—์„œ ์ด ์žˆ๋‹ค. ๋„ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. โ€ข ์ฝ”๋“œ๊ฐ€ ํ˜„์žฌ ๊ตฌํ˜„๋œ ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•ด ํ•„์š” ์ด์ƒ์œผ ๋กœ ๋ณต์žกํ•˜๋‹ค ์›์ธ โ€ข ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€ํ–ˆ๋‹ค. โ€ข ์ผ๋ฐ˜์„ฑ์ด๋‚˜ ์™„๊ฒฐ์„ฑ์„ ์œ„ํ•ด ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ โ€ข ์ƒˆ๋กœ์šด ์ ‘๊ทผ๋ฐฉ์‹ ๋„์ž… ํ›„ ์ด์ „์ฝ”๋“œ ์ •๋ฆฌํ•˜์ง€ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ๋ฐœ์ƒ ์•Š์Œ. โ€ข ๋ณต์žกํ•œ ๋กœ์ง์ฝ”๋“œ์— ์˜ํ•ด ์‹ค์ œ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š ๋Š” ์ฝ”๋“œ ๋ฐœ์ƒ ํ•ด์•ผ ํ•  ์ผ โ€ข ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ ๋ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์‚ญ์ œ โ€ข ๊ธฐ๋Šฅ์„ ๋ถ€๋ชจ๋‚˜ ์ž์‹ ํด๋ž˜์Šค๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค -> Collapse Hierarchy โ€ข ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœ์ž๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค -> Inline Class โ€ข ํ•„์š”์—†๋Š” ๋ฉ”์„œ๋“œ -> Inline Method โ€ข ํ•„์š”์—†๋Š” ํ•„๋“œ -> ์ œ๊ฑฐ โ€ข ํ•„์š”์—†๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ -> Remove Parameter ํšจ๊ณผ โ€ข ์ฝ”๋“œ ํฌ๊ธฐ ๊ฐ„์†Œํ™”, ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„, ๋‹จ์ˆœ์„ฑ ํ–ฅ์ƒ ๊ธˆ๊ธฐ โ€ข ํ”„๋ ˆ์ž„์›Œํฌ ๋“ฑ์„ ๊ฐœ๋ฐœํ•œ๋‹ค๋ฉด, ์ฃฝ์€ ์ฝ”๋“œ๋กœ ๋ณด์ด๋Š” ์กด์žฌํ•  ๊ฒƒ์ด์ง€๋งŒ ์‹ค์ œ๋กœ ์ฃฝ์€ ์ฝ”๋“œ๋Š” ์•„๋‹ˆ๋‹ค. 48 Confidential 12/13/2011
  • 49. Refactoring ๊ธฐ๋ฒ• : Inline Class & Collapse Hierarchy * Inline Class ํด๋ž˜์Šค๊ฐ€ ๋ณ„๋‹ค๋ฅธ ์ผ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด โ†’ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ์˜ฎ๊ธฐ๊ณ  ์‚ญ์ œํ•œ๋‹ค. * Collapse Hierarchy ์ˆ˜ํผํด๋ž˜์Šค์™€ ์„œ๋ธŒํด๋ž˜์Šค๊ฐ€ ๋ณ„๋กœ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค๋ฉด โ†’ ๊ทธ๊ฒƒ๋“ค์„ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ๋ผ LoginContext LoginModule +authenticate() Collapse Hierarchy IDPasswordLoginModule KerberosLoginModule x x FingerPrintLoginModule +authenticate() +authenticate() +authenticate() 49 Confidential 12/13/2011
  • 50. Refactoring ๊ธฐ๋ฒ• : Inline Method ๋ฉ”์†Œ๋“œ์˜ ๋‚ด์šฉ์ด ๊ทธ ์ด๋ฆ„๋งŒํผ ๋ช…ํ™•ํ• ๋•Œ โ†’ ๋ฉ”์†Œ๋“œ์˜ ๋‚ด์šฉ์„ ํ˜ธ์ถœ์ž๋กœ ์˜ฎ๊ธฐ๊ณ  ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค. int getRating() { int getRating() { return (moreThanFiveLateDeliveries()) ? 2 : 1; return (_numberOfLateDeliveries > 5) ? 2 : 1; } } boolean moreThanFiveLateDeliveries() { return _numberOfLateDeliveries > 5; } ๏ฝ ๊ณผ๋„ํ•œ Indirection ์‚ฌ์šฉ ์‹œ ์ ์šฉ ๏ฝ ๋ฉ”์†Œ๋“œ์˜ ๋‚ด์šฉ์ด ์ด๋ฆ„๋งŒํผ์ด๋‚˜ ๋ช…ํ™•ํ•  ๋•Œ ๏ฝ ์ž˜๋ชป Refactoring๋œ ์ฝ”๋“œ ๏ฝ ๋ฉ”์†Œ๋“œ๋“ค์˜ ๋‚ด์šฉ์„ ํ•˜๋‚˜์˜ ํฐ ๋ฉ”์†Œ๋“œ์— ํฌํ•จํ•œ ๋‹ค์Œ ๋‹ค์‹œ Refactoring 50 Confidential 12/13/2011
  • 51. ์ค‘๋ณต 51 Confidential 12/13/2011
  • 52. ์ค‘๋ณต : ๊ฐœ์š” ๏ฝ ์ค‘๋ณต์€ ์žฌ๋‚œ์˜ ๊ตฌ๋ ํ……์ด ๏ฝ ์ค‘๋ณต์ด ์•ผ๊ธฐ์‹œํ‚ค๋Š” ๋ฌธ์ œ ๏ฝ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ์ฝ”๋“œ๊ฐ€ ๋” ๋งŽ์•„์ง„๋‹ค. ๏ฝ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ์†์— ํŒŒ๋ฌปํ˜€ ์žˆ๋‹ค. ๏ฝ ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅธ ์ฝ”๋“œ๋กœ ์ธํ•ด ์œ ์‚ฌ์„ฑ ํŒŒ์•…์ด ํž˜๋“ค๊ฒŒ ๋œ๋‹ค. ๏ฝ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋ฐ ๋ฒ„๊ทธ ์ˆ˜์ •์ด ๋ˆ„๋ฝ๋  ์—ฌ์ง€๊ฐ€ ํฌ๋‹ค. ๏ฝ ๋‹ค๋ฃจ๋Š” ๋ƒ„์ƒˆ ๏ฝ ๋งค์ง๋„˜๋ฒ„(Magic Number) ๏ฝ ์ค‘๋ณต๋œ ์ฝ”๋“œ(Duplicated Code) ๏ฝ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–๋Š” ๋Œ€์ฒด ํด๋ž˜์Šค(Alternative Classes with Different Interfaces)
  • 53. ์ค‘๋ณต : ๋งค์ง๋„˜๋ฒ„ ํ•ญ๋ชฉ ์„ค๋ช… ์ง•ํ›„ โ€ข ์ฝ”๋“œ ์ค‘๊ฐ„์— ์ƒ์ˆ˜๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค. ์›์ธ โ€ข ๋ˆ„๊ตฐ๊ฐ€ ํ•„์š”์— ์˜ํ•ด ์ƒ์ˆ˜๋ฅผ ์ฝ”๋“œ์— ์‚ฝ์ž… ํ•ด์•ผ ํ•  ์ผ โ€ข Replace Magic Number with Symbolic Constant โ€ข ๊ฐ’์ด ๋ฌธ์ž์—ด์ผ ๊ฒฝ์šฐ ๊ตญ์ œํ™”๋ฅผ ์œ„ํ•ด ๋งคํ•‘ ๋„๊ตฌ ํ™œ์šฉ ํšจ๊ณผ โ€ข ์ค‘๋ณต ์ถ•์†Œ โ€ข ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„ ๊ธˆ๊ธฐ โ€ข ํ…Œ์ŠคํŠธ์ฝ”๋“œ์—์„œ๋Š” ํ•„์š”ํ•œ ๊ฐ’์„ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ๋•Œ๊ฐ€ ๋” ์ฝ๊ธฐ ํŽธํ•œ ๊ฒฝ์šฐ ์žˆ์Œ โ€ข ํ•˜์ง€๋งŒ, ์ƒ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ถ€ํ„ฐ ์œ ๋„๋œ ๊ฐ’์ด๋ผ๋ฉด ๊ธฐํ˜ธ์ƒ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋นผ๋‚ผ ํ•„์š” ์žˆ์Œ
  • 54. ์ค‘๋ณต : ๋งค์ง๋„˜๋ฒ„ public void analyze(File file) throws FileNotFoundException { private static final int INDEX_TYPE = 0; BufferedReader reader = new BufferedReader(new FileReader(file)); private static final int INDEX_TIME = 1; private static final int INDEX_URL = 2; try { private static final int INDEX_IPADRESS = 3; String aLine = reader.readLine(); public void analyze(File file) throws FileNotFoundException { while (aLine != null) { BufferedReader reader = new BufferedReader(new FileReader(file)); // type, time, id, ip address String[] record = aLine.split(SEPERATOR); try { String aLine = reader.readLine(); AccessLog aLog = new AccessLog(); aLog.setType(record[0]); while (aLine != null) { aLog.setTime(record[1]); // type, time, id, ip address aLog.setUrl(record[2]); String[] record = aLine.split(SEPERATOR); aLog.setIpAddress(record[3]); Replace Magic Number with Symbolic Constant AccessLog aLog = new AccessLog(); aLine = reader.readLine(); aLog.setType(record[INDEX_TYPE]); } aLog.setTime(record[INDEX_TIME]); } catch (IOException e) { aLog.setUrl(record[INDEX_URL]); e.printStackTrace(); aLog.setIpAddress(record[INDEX_IPADRESS]); } finally { // .. aLine = reader.readLine(); } } } } catch (IOException e) { e.printStackTrace(); } finally { // .. } } โ†’ ์ค‘๋ณต์ถ•์†Œ, ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„ 54 Confidential 12/13/2011
  • 55. ์ค‘๋ณต : ์ค‘๋ณต๋œ ์ฝ”๋“œ ํ•ญ๋ชฉ ์„ค๋ช… ์ง•ํ›„ โ€ข ๋‘ ์ฝ”๋“œ๊ฐ€ ๊ฑฐ์˜ ๋™์ผํ•ด ๋ณด์ธ๋‹ค. โ€ข ๋‘ ์ฝ”๋“œ์˜ ๊ธฐ๋Šฅ์ด ๊ฑฐ์˜ ๋™์ผํ•˜๋‹ค. ์›์ธ โ€ข ๊ฐœ๋ฐœ์ž๋“ค์ด ์„œ๋กœ ๋‹ค๋ฅธ๋ถ€๋ถ„์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์—…ํ•จ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒ โ€ข ์ค‘๋ณต์„ ์ œ๊ฑฐํ•  ์ •๋„๋กœ ๋ถ€์ง€๋Ÿฐํ•˜์ง€ ๋ชปํ•จ โ€ข ๋‹ค๋ฅธ ๋ƒ„์ƒˆ๊ฐ€ ์ค‘๋ณต์„ ๊ฐ€๋ฆฌ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ โ€ข ์˜๋„์ ์ธ Copy & Paste ํ•ด์•ผ ํ•  ์ผ โ€ข ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ ๋˜๋Š” ํด๋ž˜์Šค์—์„œ ์ค‘๋ณต -> Extract Method โ€ข ๋‘ ํ˜•์ œํด๋ž˜์Šค์— ์ค‘๋ณต -> Extract Method -> Pull Up Field or Pull Up Method -> Form Template Method โ€ข ์„œ๋กœ ๊ด€๋ จ ์—†๋Š” ๋‘ ํด๋ž˜์Šค์— ์ค‘๋ณต -> Extract Class โ€ข ๋ฌผ๋ฆฌ์ ์œผ๋ก  ๋™์ผํ•˜์ง€ ์•Š์ง€๋งŒ, ๊ฐ™์€ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰ -> Substitute Algorithm ํšจ๊ณผ โ€ข ์ค‘๋ณต ์ค„์ž„ โ€ข ๋” ๋‚˜์€ ์ถ”์ƒํ™” ๋ฐ ๋” ์œ ์—ฐํ•œ ์ฝ”๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๊ธˆ๊ธฐ
  • 56. ์ค‘๋ณต : ์ค‘๋ณต๋œ ์ฝ”๋“œ ์‹ค์Šต 56 Confidential 12/13/2011
  • 57. ์ค‘๋ณต : ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–๋Š” ๋Œ€์ฒด ํด๋ž˜์Šค ํ•ญ๋ชฉ ์„ค๋ช… ์ง•ํ›„ โ€ข ๊ฐ™์€ ์ผ์„ ํ•˜๋Š” ๋‘ ํด๋ž˜์Šค์— ์‚ฌ์šฉ๋œ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ์„œ๋กœ ๋‹ค๋ฆ„ ์›์ธ โ€ข ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋น„์Šทํ•œ ์ƒํ™ฉ์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ๋น„์Šทํ•œ ์ผ์„ ํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•จ ํ•ด์•ผ ํ•  ์ผ โ€ข ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํด๋ž˜์Šค๋“ค ์กฐ์œจ -> Rename Method ์ด์šฉ ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ์œ ์‚ฌํ•˜๊ฒŒ ๋งŒ๋“ฌ -> Move Method, Add Parameter, Parameterize Method ์ด์šฉ ํ”„๋กœํ† ์ฝœ ์œ ์‚ฌํ•˜๊ฒŒ ๋งŒ๋“ฌ -> Extract Superclass -> ๋‚˜๋จธ์ง€ ํด๋ž˜์Šค ์‚ญ์ œ ํšจ๊ณผ โ€ข ์ค‘๋ณต ์ถ•์†Œ ๊ธˆ๊ธฐ โ€ข ๋‘ ํด๋ž˜์Šค๊ฐ€ ๊ฐ๊ฐ ๋ณ„๊ฐœ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์†ํ•ด ์žˆ์„ ๊ฒฝ์šฐ.
  • 58. ์กฐ๊ฑด๋กœ์ง 58 Confidential 12/13/2011
  • 59. ์กฐ๊ฑด๋กœ์ง : ๊ฐœ์š” ๏ฝ ์‰ฝ๊ฒŒ ๋ฐœ์ƒ๋  ์—ฌ์ง€๊ฐ€ ํผ ๏ฝ ์กฐ๊ฑด๋ฌธ์ด ๋ณต์žกํ•ด ์ง€๋ฉด? ๏ฝ ๋‹ค์–‘ํ•œ ๊ฒฝ๋กœ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•จ ๏ฝ ๋น ์ง€๋Š” ์กฐ๊ฑด์ด ๋ฐœ์ƒํ•  ์—ฌ์ง€๊ฐ€ ํผ ๏ฝ ์กฐ๊ฑด ๋ฌธ์„ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด ํŠน์ˆ˜ ์กฐ๊ฑด๋ฌธ์„ ๋งŒ๋“ค๊ธฐ ์‰ฌ์›€ ๏ฝ ์กฐ๊ฑด๋กœ์ง์€ ๊ฐ์ฒด์ง€ํ–ฅ์  ์ ‘๊ทผ๋ฐฉ๋ฒ•์„ ์ถฉ๋ถ„ํžˆ ๊ณ ๋ คํ•˜์ง€ ๋ชปํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Œ ๏ฝ ๋‹ค๋ฃจ๋Š” ๋ƒ„์ƒˆ ๏ฝ ๋ณต์žกํ•œ Boolean ํ‘œํ˜„์‹(Complicated Boolean Expression) ๏ฝ ๊ฐ€์žฅ๋œ ์ƒ์†(Simulated Inheritance) 59 Confidential 12/13/2011
  • 60. ์กฐ๊ฑด๋กœ์ง : ๋ณต์žกํ•œ Boolean ํ‘œํ˜„์‹ ์ ์ˆ˜, ๊ธ‰์—ฌ, ๊ณต์ธ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋Œ€์ถœ ์Šน์ธ ์—ฌ๋ถ€๋ฅผ ๋ฆฌํ„ด ์›๋ณธ์ฝ”๋“œ) public boolean isAcceptable1(int score, int income, boolean authorized) { if (!((score > 700) || ((income >= 40000) && (income <= 100000) && authorized && (score > 500)) || (income > 100000)) ) return false; else return true; } DeMorganโ€™s Law ์ˆ˜์ •์ฝ”๋“œ) public boolean isAcceptable2(int score, int income, boolean authorized) { if (((score <= 700) && ((income < 40000) || (income > 100000) || !authorized || (score <= 500)) && (income <= 100000)) ) return false; else return true; } 60 Confidential 12/13/2011
  • 61. Refactoring ๊ธฐ๋ฒ• : Introduce Explaining Variable ์ ์ˆ˜, ๊ธ‰์—ฌ, ๊ณต์ธ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋Œ€์ถœ ์Šน์ธ ์—ฌ๋ถ€๋ฅผ ๋ฆฌํ„ด ์›๋ณธ์ฝ”๋“œ) public boolean isAcceptable1(int score, int income, boolean authorized) { if (!((score > 700) || ((income >= 40000) && (income <= 100000) && authorized && (score > 500)) || (income > 100000)) ) return false; else return true; } Introduce Explaining Variable ์ˆ˜์ •์ฝ”๋“œ) public boolean isAcceptable3(int score, int income, boolean authorized) { boolean hasMidRangeIncome = (income >= 40000) && (income <= 100000); boolean hasHighIncome = income > 100000;; boolean hasHighScore = score > 700; if (!( hasHighScore || (hasMidRangeIncome && authorized && (score > 500)) || hasHighIncome) ) return false; else return true; } 61 Confidential 12/13/2011
  • 62. Refactoring ๊ธฐ๋ฒ• : Introduce Explaining Variable & DeMorganโ€™s Law Introduce Explaining Variable) public boolean isAcceptable3(int score, int income, boolean authorized) { boolean hasMidRangeIncome = (income >= 40000) && (income <= 100000); boolean hasHighIncome = income > 100000;; boolean hasHighScore = score > 700; if (!( hasHighScore || (hasMidRangeIncome && authorized && (score > 500)) || hasHighIncome) ) return false; else return true; } Introduce Explaining Variable ์ˆ˜์ •์ฝ”๋“œ) & DeMorganโ€™s Law public boolean isAcceptable4(int score, int income, boolean authorized) { boolean hasMidRangeIncome = (income >= 40000) && (income <= 100000); boolean hasHighIncome = income > 100000;; boolean hasHighScore = score > 700; if (!hasHighScore && (!hasMidRangeIncome || !authorized || !(score > 500)) && !hasHighIncome) return false; else return true; } 62 Confidential 12/13/2011
  • 63. Refactoring ๊ธฐ๋ฒ• : Decompose Conditional ์›๋ณธ์ฝ”๋“œ) public boolean isAcceptable1(int score, int income, boolean authorized) { if (!((score > 700) || ((income >= 40000) && (income <= 100000) && authorized && (score > 500)) || (income > 100000)) ) return false; else return true; } Decompose Conditional ์ˆ˜์ •์ฝ”๋“œ) public boolean isAcceptable5(int score, int income, boolean authorized) { if (!(isHighScore(score) || ( isMidRangeIncome(income) && authorized && isMidScore(score)) || isHighIncome(income)) ) return false; else return true; } 63 Confidential 12/13/2011
  • 64. Refactoring ๊ธฐ๋ฒ• : ์กฐ๊ฑด๋ฌธ ์น˜ํ™˜ Decompose Conditional) public boolean isAcceptable5(int score, int income, boolean authorized) { if (!(isHighScore(score) || ( isMidRangeIncome(income) && authorized && isMidScore(score)) || isHighIncome(income)) ) return false; else return true; } ์กฐ๊ฑด๋ฌธ ์น˜ํ™˜ ์กฐ๊ฑด๋ฌธ ์น˜ํ™˜) public boolean isAcceptable6(int score, int income, boolean authorized) { if (isHighScore(score) || ( isMidRangeIncome(income) && authorized && isMidScore(score)) || isHighIncome(income) ) return true; else return false; } 64 Confidential 12/13/2011
  • 65. Refactoring ๊ธฐ๋ฒ• : Consolidate Conditional Expression ์กฐ๊ฑด๋ฌธ ์น˜ํ™˜) public boolean isAcceptable1(int score, int income, boolean authorized) { if (!((score > 700) public|| ((income >= 40000) && (income <= 100000) &&boolean authorized) boolean isAcceptable6(int score, int income, authorized && (score > 500)) { || (income > 100000)) ) ifreturn false; (isHighScore(score) else|| ( isMidRangeIncome(income) && authorized && isMidScore(score)) || isHighIncome(income) return true; } ) return true; else return false; } Consolidate Conditional Expression Consolidate Conditional Expression) public boolean isAcceptable8(int score, int income, boolean authorized) { if (isHighScore(score) || isHighIncome(income)) // return true; if (isMidRangeIncome(income) && authorized && isMidScore(score)) return true; else Refactoring์„ ํ•จ์œผ๋กœ์จ return false; } - ์กฐ๊ฑด์˜ ์žฌ์‚ฌ์šฉ์œผ๋กœ ์ค‘๋ณต ์ถ•์†Œ - ์กฐ๊ฑด๋กœ์ง ๋ช…ํ™•ํ™”๋กœ ์˜์‚ฌ์†Œํ†ต ์ฆ์ง„ - ์„ฑ๋Šฅ ํ–ฅ์ƒ์˜ ํฌ์ธํŠธ๋ฅผ ์ฐพ๊ธฐ ์‰ฌ์›Œ์ง 65 Confidential 12/13/2011
  • 66. ๋ณต์žกํ•œ Boolean ํ‘œํ˜„์‹ ์‹ค์Šต 66 Confidential 12/13/2011
  • 67. ์กฐ๊ฑด๋กœ์ง : ๊ฐ€์žฅ๋œ ์ƒ์†๋ฌธ ํ•ด์•ผ ํ•  ์ผ public class Employee { private int type; private static final int ENGINEER = 0; ๏ฝ 1๋‹จ๊ณ„ private static final int SALESMAN = 1; private static final int MANAGER = 2; ๏ฝ public Employee(int type) { this.type = type; ๏ฝ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ์ดํ›„ Type } ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ Replace Type Code with public int calculatePayment() { switch (type) { ๏‚จ case ENGINEER: return monthlySalary; State/Strategy ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ case SALESMAN: return monthlySalary + commission; ๏ฝ case MANAGER: return monthlySalary + bonus; ๏‚จ Replace Type Code with default: throw new RuntimeException("Incorrect Employee"); Subclass }} public String getJobTitle() { ๏ฝ 2๋‹จ๊ณ„ switch (type) { case ENGINEER: ๏ฝ Replace Conditional with return "Engineer"; case SALESMAN: Class return "Salesman"; case MANAGER: return "Manager"; default: throw new RuntimeException("Incorrect Employee"); } }} 67 Confidential 12/13/2011
  • 68. ๋ณต์žกํ•œ Boolean ํ‘œํ˜„์‹ ์‹ค์Šต 68 Confidential 12/13/2011
  • 70. ๋ฐ์ดํ„ฐ 70 Confidential 12/13/2011
  • 71. ๋ฐ์ดํ„ฐ : ๊ฐœ์š” ๋ฐฐ์†ก ์‹œ์Šคํ…œ์˜ Book ํด๋ž˜์Šค ์‡ผํ•‘๋ชฐ ์‹œ์Šคํ…œ์˜ Book ํด๋ž˜์Šค height title genre category width author weight price getDiscount() getRequiredDeliveryRoom() content Book ๏ฝ ๋ฐ์ดํ„ฐ๋Š” ์˜์‚ฌ์†Œํ†ต์˜ ๊ธฐ์ ์ด ๋จ ๏ฝ ๋ˆ„๋ฝ๋œ ํด๋ž˜์Šค, ์ž˜ ๋ชป ๋งŒ๋“ค์–ด์ง„ ํด๋ž˜์Šค์˜ ์ง•ํ›„ ๏ฝ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ์กฐ์งํ™” ๋˜์–ด ์žˆ์œผ๋ฉด, ๊ทธ ์•ˆ์— ์†ํ•ด์žˆ๋Š” ํ–‰์œ„๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Œ 71 Confidential 12/13/2011
  • 72. ๋ฐ์ดํ„ฐ : ๊ธฐ๋ณธ ํƒ€์ž…์— ๋Œ€ํ•œ ๊ฐ•๋ฐ•๊ด€๋… ๏ฝ ์ง•ํ›„ ๏ฝ ๊ธฐ๋ณธํƒ€์ž… ๋˜๋Š” ๊ธฐ๋ณธ ํƒ€์ž…์— ๊ฐ€๊นŒ์šด ํƒ€์ž…์˜ ์‚ฌ์šฉ ๏ฝ ์ž‘์€ ์ •์ˆ˜๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ์—ด๊ฑฐํ˜• ๋ฐ ์ƒ์ˆ˜ ๏ฝ ํ•„๋“œ๋ช…์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด ์ƒ์ˆ˜ ๏ฝ ์›์ธ ๏ฝ ๋ˆ„๋ฝ๋œ ํด๋ž˜์Šค ->Replace Data Value with Object ๏ฝ ๊ฐ€์žฅ๋œ ํƒ€์ž… -> ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด: Replace Type Code with Class ๏ฝ ๊ฐ€์žฅ๋œ ํ•„๋“œ์ ‘๊ทผ์ž : Replace Array with Object 72 Confidential 12/13/2011
  • 73. Refactoring ๊ธฐ๋ฒ• : Replace Data with Object User +firstName: String +lastName: String Order Customer Replace Data with +orderNumber: String Object Order +firstName: String +customeFirstNamer: String 1 1 +lastName: String +customerLastName: String +orderNumber +price: float +addressState: String Address +addressCity: String +state +addressStreet: String +city +addressZipCode1: String +zipCode1 +addressZipCode 2: String 1 1 +zipCode2 +telAreaCode: String +telNumber: String +getDeliveryCost() home Contact office +areaCode +number 73 Confidential 12/13/2011
  • 74. Refactoring ๊ธฐ๋ฒ• : Replace Array with Object ๋ฐฐ์—ด์˜ ์š”์†Œ๋“ค์ด ์„œ๋กœ ๋‹ค๋ฅธ ๋œป์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด โ†’ ๋ฐฐ์—ด์„ ๊ฐ๊ฐ์˜ ์š”์†Œ์— ๋Œ€ํ•œ ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋กœ ๋ฐ”๊ฟ”๋ผ String[] row = new String[3]; Performance row = new Performance(); row [0] = "Liverpool"; row.setName("Liverpool"); row [1] = "15"; row.setWins("15"); ๏ฝ ๋ฐฐ์—ด์€ ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š” ๋น„์Šทํ•œ ๊ฐ์ฒด๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ๋ชจ์—ฌ ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ๋งŒ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•จ 74 Confidential 12/13/2011
  • 75. ๋ฐ์ดํ„ฐ : ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค ๏ฝ public field ๋˜๋Š” ๋‹จ์ˆœ getter/setter๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Œ ๏ฝ ์›์ธ ๏ฝ ๋ฐ์ดํ„ฐ ๋ฉ์–ด๋ฆฌ๋ฅผ ํด๋ž˜์Šค๋กœ ์ถ”์ถœํ•˜๋Š” ๊ณผ์ •์—์„œ ์ƒ๊น€ ๏ฝ ํ•ด์•ผ ํ•  ์ผ ๏ฝ 1๋‹จ๊ณ„-๊ธฐ๋ณธ ํ•„๋“œ ์บก์Šํ™” : Encapsulate Field ๏ฝ 2๋‹จ๊ณ„-๋ถˆํ•„์š”ํ•œ ์„ธํŒ…๋ฉ”์†Œ๋“œ ์ œ๊ฑฐ : Remove Setting Method ๏ฝ 3๋‹จ๊ณ„-Collection ํ•„๋“œ ์บก์Šํ™” : Encapsulate Collection ๏ฝ 4๋‹จ๊ณ„-ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ ๊ด€๋ จ ๋กœ์ง ์ด๋™ : Extract Method and Move Method ๏ฝ 5๋‹จ๊ณ„-์ค‘๋ณต์ •๋ฆฌ ๏ฝ ์ฃผ์˜์  ๏ฝ ์ž์ฃผ ์ ‘๊ทผ๋˜๋Š” ํ•„๋“œ์˜ ๊ฒฝ์šฐ, ์„ฑ๋Šฅ์ƒ ๋ฌธ์ œ ์ด์œ  ๋•Œ๋ฌธ์—, public ํ•„๋“œ๋กœ ๋‚จ๊ฒจ ์งˆ ๊ฒฝ์šฐ ์žˆ์Œ ๏ฝ ๋ฆฌํ”Œ๋ ‰์…˜ ๋˜๋Š”, getter/setter ๋ฉ”์„œ๋“œ์— ์˜์กด 75 Confidential 12/13/2011
  • 76. Refactoring ๊ธฐ๋ฒ• : Encapsulate Collection Collection์„ get/setํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด โ†’ ๊ทธ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ฝ๊ธฐ์ „์šฉ ๋ทฐ(read-only view)๋ฅผ ๋ฆฌํ„ดํ•˜๋„๋ก ๋งŒ๋“ค๊ณ , add/remove ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋ผ ๏ฝ ์œ„ํ—˜ ๏ฝ Collection์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์†Œ๋“œ(get) ๏ฝ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ๋ฆฌํ„ด๋ฐ›์€ Collection์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ ๋‹ค. ๏ฝ Collection์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š” ๋ฉ”์†Œ๋“œ(set) ๏ฝ Collection์„ ๋„˜๊ฒจ์ค€ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ Collection์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. 76 Confidential 12/13/2011
  • 77. Encapsulate Collection ์‹ค์Šต 77 Confidential 12/13/2011
  • 78. ์ƒ์† 78 Confidential 12/13/2011
  • 79. ์ƒ์† : ๊ฑฐ๋ถ€๋œ ์œ ์‚ฐ ํ•ญ๋ชฉ ์„ค๋ช… ์ง•ํ›„ โ€ข ํ•˜์œ„ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†ํ•œ ๋ฉ”์†Œ๋“œ์—์„œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค.(๋ช…์‹œ์  ๊ฑฐ๋ถ€) โ€ข ํ•˜์œ„ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†ํ•œ ๋ฉ”์†Œ๋“œ์—์„œ ์•„๋ฌด์ผ๋„ ์•ˆํ•œ๋‹ค.(์•”์‹œ์  ๊ฑฐ๋ถ€) โ€ข ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•˜์œ„ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค. โ€ข ์ƒ์†๊ตฌ์กฐ๊ฐ€ ์ ์ ˆํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค์™€ Is-A ๊ด€๊ณ„๊ฐ€ ์•„๋‹ˆ๋‹ค ์›์ธ โ€ข ๊ตฌํ˜„์ƒ์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด์„œ๋งŒ ์ƒ์†์„ ์‚ฌ์šฉ ํ•ด์•ผ ํ•  ์ผ โ€ข ํ˜ผ๋™๋˜์ง€ ์•Š์œผ๋ฉด ๊ทธ๋Œ€๋กœ ๋†”๋‘˜ ์ˆ˜ ์žˆ์Œ โ€ข ์ƒ์†๊ด€๊ณ„ ์œ ์ง€ํ•  ํ•„์š” ์—†์œผ๋ฉด, Replace Inheritance with Delegation ์ ์šฉ โ€ข ์ƒ์†๊ตฌ์กฐ ์žฌ ์กฐ์ • Extract Subclass, Push Down Field, Push Down Method ํšจ๊ณผ ๊ธˆ๊ธฐ โ€ข ๋•Œ๋•Œ๋กœ, ๊ฑฐ๋ถ€๋œ ์œ ์‚ฐ์€ ์ƒˆ๋กœ์šด ํƒ€์ž…์˜ ํญ์ฃผ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์˜๋„์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜๋„ ์žˆ๋‹ค. -> Java ์˜ ์ฝ๊ธฐ์ „์šฉ Collection 79 Confidential 12/13/2011
  • 80. ์ƒ์† : ๊ฑฐ๋ถ€๋œ ์œ ์‚ฐ Drawable Drawable +draw() Line ์ถ”๊ฐ€ +draw() Exception +getArea() +getArea() ๋ฐœ์ƒ์‹œํ‚ค๊ฑฐ๋‚˜, 0์„ ๋ฆฌํ„ด Rectangle Circle Rectangle Circle Line +getArea() ์ƒ์†๊ตฌ์กฐ ์žฌ์กฐ์ • Drawable +draw() Shape Line +getArea() +getLength() Rectangle Circle 80 Confidential 12/13/2011
  • 81. Liskov Substitution Principle(LSP) โ€œFunctions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.โ€ ๊ณ ์œ  ํŠน์„ฑ์„ ๊ณ ๋ คํ•˜๋ฉด, Square๋Š” Rectangle์˜ ์ผ๋ถ€์ž„์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์—†์–ด ๋ณด์ธ๋‹ค. -> ํ•˜์ง€๋งŒ, ํ–‰์œ„๋ฅผ ๊ณ ๋ คํ•˜๋ฉด LSP์— ์œ„๋ฐฐ๋œ๋‹ค. Shape Rectangle.setWidth() ์™€ Square.setWidth()๊ฐ€ ํ•˜๋Š” ์ผ์€ ๋‹ค๋ฅผ ๊ฒƒ์ด๋‹ค. +getArea() Shape Rectangle Circle +getArea() ์ƒ์†๊ตฌ์กฐ ์žฌ์กฐ์ • +width +height +setWidth() +setHeight() +getWidth() Square Rectangle Circle +getHeight() +width +width +height +height +setLength() +setWidth() +setHeight() Square +getWidth() +getHeight() โ€œOOD์—์„œ IS-A๊ด€๊ณ„๋Š” ์™ธ์ ์œผ๋กœ ๋ณด์—ฌ์ง€๋Š” ํ–‰์œ„์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋„์ถœํ•˜์—ฌ์•ผ ํ•œ๋‹ค.โ€ 81 Confidential 12/13/2011
  • 82. Refactoring ๊ธฐ๋ฒ• : Replace Inheritance with Delegation ์„œ๋ธŒํด๋ž˜์Šค๊ฐ€ ์ˆ˜ํผํด๋ž˜์Šค ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ผ๋ถ€๋ถ„๋งŒ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒฝ์šฐ โ†’ ์ˆ˜ํผํด๋ž˜์Šค๋ฅผ ์œ„ํ•œ ํ•„๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฉ”์†Œ๋“œ๋“ค์ด ์ˆ˜ํผํด๋ž˜์Šค์— ์œ„์ž„ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•œ ํ›„ ์ƒ์† ๊ด€๊ณ„๋ฅผ ์ œ๊ฑฐ 82 Confidential 12/13/2011
  • 83. ์ƒ์† : ๋ถ€์ ์ ˆํ•œ ์นœ๋ฐ€(ํ•˜์œ„ ํด๋ž˜์Šค ํ˜•ํƒœ) ํ•ญ๋ชฉ ์„ค๋ช… ์ง•ํ›„ โ€ข ์–ด๋–ค ํด๋ž˜์Šค์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋‚ด์ ์ธ ๋ถ€๋ถ„(private์ด์–ด์•ผ๋งŒ ํ•˜๋Š”)์— ์ ‘๊ทผํ•œ๋‹ค. ์›์ธ โ€ข ๋ถ€๋ชจํด๋ž˜์Šค์™€ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”์ด์ƒ์œผ๋กœ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋‹ค. ํ•ด์•ผ ํ•  ์ผ โ€ข ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ œ์–ด๋˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ถ€๋ชจํด๋ž˜์Šค์˜ ํ•„๋“œ์— ์ ‘๊ทผ -> Self Encapsulate Field โ€ข ๋ถ€๋ชจํด๋ž˜์Šค๊ฐ€ ์ž์‹ ํด๋ž˜์Šค๋“ค์ด ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •์˜ ๊ฐ€๋Šฅ -> Form Template Method โ€ข ๊ฒฐํ•ฉ๋„๋ฅผ ๋”์šฑ ์ค„์ผ ํ•„์š” -> Replace Inheritance with Delegation ํšจ๊ณผ ๊ธˆ๊ธฐ 83 Confidential 12/13/2011
  • 84. Refactoring ๊ธฐ๋ฒ• : Form Template Method ๊ฐ๊ฐ์˜ ์„œ๋ธŒํด๋ž˜์Šค์—, ๋™์ผํ•œ ์ˆœ์„œ๋กœ ๋น„์Šทํ•œ ๋‹จ๊ณ„๋ฅผ ํ–‰ํ•˜์ง€๋งŒ, ๋‹จ๊ณ„๊ฐ€ ์™„์ „ํžˆ ๊ฐ™์ง€๋Š” ์•Š์€ ๋‘ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด, โ†’ ๊ทธ ๋‹จ๊ณ„๋ฅผ ๋™์ผํ•œ ์‹œ๊ทธ๋„ˆ์ฒ˜๋ฅผ ๊ฐ€์ง„ ๋ฉ”์†Œ๋“œ๋กœ ๋งŒ๋“ค์–ด๋ผ, ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์›๋ž˜์˜ ๋‘ ๋ฉ”์†Œ๋“œ๋Š” ์„œ๋กœ ๊ฐ™์•„์ง€๋ฏ€๋กœ, ์ˆ˜ํผํด๋ž˜์Šค๋กœ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค. 84 Confidential 12/13/2011
  • 85. ์ƒ์† : ๊ฒŒ์œผ๋ฅธ ํด๋ž˜์Šค ํ•ญ๋ชฉ ์„ค๋ช… ์ง•ํ›„ โ€ข ํด๋ž˜์Šค๊ฐ€ ๋งŽ์€ ์ผ์„ ํ•˜์ง€ ์•Š๊ณ , ๋Œ€๋ถ€๋ถ„ Delegationํ•œ๋‹ค. ์›์ธ โ€ข ๋ถ€๋ชจํด๋ž˜์Šค์™€ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”์ด์ƒ์œผ๋กœ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋‹ค. ํ•ด์•ผ ํ•  ์ผ โ€ข ๋ถ€๋ชจํด๋ž˜์Šค๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋ฉด -> Collapse Hierarchy โ€ข ๊ทธ ์ด์™ธ -> Inline Class ํšจ๊ณผ ๊ธˆ๊ธฐ โ€ข ๋•Œ๋กœ๋Š” ์˜๋„๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ ๊ฒŒ์œผ๋ฅธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค. 85 Confidential 12/13/2011
  • 86. ์ฑ…์ž„ 86 Confidential 12/13/2011
  • 87. ์ฑ…์ž„ : ๊ฐœ์š” ๏ฝ ๋‹ค๋ฃจ๋Š” ๋ƒ„์ƒˆ ๏ฝ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š•์‹ฌ ๏ฝ ๋ถ€์ ์ ˆํ•œ ์นœ๋ฐ€ ๏ฝ ๋ฉ”์‹œ์ง€ ์ฒด์ธ ๏ฝ ๋ฏธ๋“ค๋งจ 87 Confidential 12/13/2011
  • 88. ์ฑ…์ž„ : ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š•์‹ฌ & ๋ถ€์ ์ ˆํ•œ ์นœ๋ฐ€ Class A Class B Class A Class B .. .. .. attributeA amethod() getX() amethod() bmethod() getY() bmethod() amethod() ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š•์‹ฌ ๋ถ€์ ์ ˆํ•œ ์นœ๋ฐ€ ํŠน์ • ํด๋ž˜์Šค ๋‚ด์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋™์ž‘์„ ์œ„ํ•ด ๋‹ค๋ฅธ ํด ํŠน์ • ํด๋ž˜์Šค์—์„œ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ private ๋ฉค๋ฒ„๋ฅผ ์ ‘๊ทผ ์ง•ํ›„ ๋ž˜์Šค์— ์žˆ๋Š” ์ •๋ณด๋ฅผ ๋งŽ์ด ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ ํ•œ๋‹ค. ๋‘ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ํด๋ž˜์Šค๊ฐ€ ์—‰์ผœ ์žˆ๋‹ค๋ฉด - Move Method ์ค‘์žฌํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—‰์ผœ์žˆ๋‹ค๋ฉด ํ•ด๊ฒฐ์ฑ… Move Method - Extract Hierarchy-> Hide Delegate ํด๋ž˜์Šค๋“ค์ด ์„œ๋กœ ๊ฐ€๋ฅดํ‚ค๊ณ  ์žˆ๋‹ค๋ฉด - Change Bidirectional Reference to Unidirectional 88 Confidential 12/13/2011
  • 89. Refactoring ๊ธฐ๋ฒ• : Hide Delegate ์–ด๋–ค ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์œ„์ž„ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ, โ†’ ์„œ๋ฒ„์— ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋Œ€๋ฆฌ๊ฐ์ฒด (Delegate)๋ฅผ ์ˆจ๊ฒจ๋ผ ๏ฝ ์ง๊ต์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค. ๏ฝ Client ํด๋ž˜์Šค๊ฐ€ ๋” ์ด์ƒ Department์˜ ๋ณ€ํ™”์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ๊ฐ– ์ง€ ์•Š๋Š”๋‹ค. ๏ฝ Law of Demeter๋ฅผ ๋”ฐ๋ฅธ๋‹ค. ๏ฝ ๋ถ€์ž‘์šฉ : ๊ฒŒ์œผ๋ฅธ ํด๋ž˜์Šค๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. 89 Confidential 12/13/2011
  • 90. Refactoring ๊ธฐ๋ฒ• : Change Bidirectional Association to Unidirectional ์„œ๋กœ ๋งํฌ๋ฅผ ๊ฐ€์ง€๋Š” ๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค์—์„œ ํ•œ์ชฝ์ด ๋‹ค๋ฅธ์ชฝ์„ ๋” ์ด์ƒ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์„๋•Œ โ†’ ๋ถˆํ•„์š”ํ•œ ๋งํฌ๋ฅผ ์ œ๊ฑฐํ•˜๋ผ. ๏ฝ Bidirectional Association์€ ์‚ฌ์šฉํ•˜๋Š” ์ธก๋ฉด์—์„  ํŽธํ•˜๋‹ค. ๏ฝ ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ„ํ—˜์„ ์ง€๋‹˜ ๏ฝ ๋ณต์žก์„ฑ ์ฆ๊ฐ€ -> ๋ฒ„๊ทธ๋ฐœ์ƒ์˜ ์›์ฒœ ๏ฝ Zombie ๊ฐ์ฒด ์ƒ์„ฑ ์‹ค์ˆ˜ ๏ฝ ์ž์—ฐ์ ์œผ๋กœ Cluster๊ฒฐ์„ฑ -> Coupling ์ฆ๊ฐ€ 90 Confidential 12/13/2011
  • 91. ์ฑ…์ž„ : ๋ฉ”์‹œ์ง€ ์ฒด์ธ & ๋ฏธ๋“ค๋งจ Remove Middleman Hide Delegate ๋ฉ”์‹œ์ง€ ์ฒด์ธ ๋ฏธ๋“ค๋งจ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒจํ„ด์ด ๋‚˜ํƒ€๋‚œ๋‹ค. ์–ด๋–ค ํด๋ž˜์Šค์— ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฉ”์„œ๋“œ์—์„œ ๋‹ค๋ฅธ ๊ฐ์ฒด ์ง•ํ›„ person.getDepartment().getManager() ์— ์žˆ๋Š” ๋™์ผํ•œ ๋ฉ”์„œ๋“œ๋‚˜ ์œ ์‚ฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค ๏‚ง Delegate ๊ฐ์ฒด์— ์ƒˆ๋กœ์šด Feature๊ฐ€ ์ƒ๊ฒจ๋„ ๏‚ง ๊ฐ์ฒด๋“ค๊ฐ„์˜ ์ปคํ”Œ๋ง์ด ๊ฐ์†Œํ•œ๋‹ค. ์žฅ์  Server๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์ด ํ•„์š”์—†๋‹ค. ๏‚ง ์ƒ์„ฑํ•ด์•ผ ํ•  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์ข€ ๋” ์ ๋‹ค. ๏‚ง ๊ฐ์ฒด๋“ค๊ฐ„์˜ ์ปคํ”Œ๋ง์ด ์ฆ๊ฐ€ํ•œ๋‹ค. ๏‚ง Delegate ๊ฐ์ฒด์— ์ƒˆ๋กœ์šด Feature๊ฐ€ ์ƒ๊ธฐ๋ฉด Server ๋‹จ์  ๏‚ง ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•  ์ผ€์ด์Šค๊ฐ€ ์ข€ ๋” ๋งŽ๋‹ค. ๊ฐ์ฒด์—๋„ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค. Hide Delegate๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด์™€ Remove Middleman ์„ ํ†ตํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง์ ‘ ํ•ด๊ฒฐ์ฑ… ์ข…์†์ ์ด๊ฒŒ ๋งŒ๋“ฌ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•จ โ˜ž ์ •๋‹ต์€ ์—†๋‹ค! ์ฝ”๋“œ์˜ ์ง„ํ™”์— ๋”ฐ๋ผ, ์ƒํ™ฉ์— ์ ํ•ฉํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž. 91 Confidential 12/13/2011
  • 93. ๋ณ€๊ฒฝ ์ˆ˜์šฉํ•˜๊ธฐ : ๊ฐœ์š” ๏ฝ ๋‹ค๋ฃจ๋Š” ๋ƒ„์ƒˆ ๏ฝ ์—ฌ๋Ÿฌ ์›์ธ์— ์˜ํ•œ ๋ณ€๊ฒฝ(Divergent Change) ๏ฝ ํ‰ํ–‰์ƒ์†๊ณ„์ธต๊ตฌ์กฐ(Parallel Inheritance Hierarchies) ๏ฝ ์กฐํ•ฉ์  ํญ๋ฐœ(Combinational Explosion) ๏ฝ ์‚ฐํƒ„์ด ์ˆ˜์ˆ (Shotgun Surgery) 93 Confidential 12/13/2011
  • 94. ๋ณ€๊ฒฝ ์ˆ˜์šฉํ•˜๊ธฐ : ์—ฌ๋Ÿฌ ์›์ธ์— ์˜ํ•œ ๋ณ€๊ฒฝ(Divergent Change) Shape Shape ShapWriter +draw() ๊ธฐ๋ณธ ์„  ๋‘๊ป˜๋ฅผ +draw() +persist() +persist() โ€˜5pxโ€™๋กœ ํ–ˆ์œผ๋ฉด.. Binaryํ˜•ํƒœ ๋ฟ ์•„๋‹ˆ๋ผ, XMLํ˜•ํƒœ๋กœ๋„ ์ €์žฅ์ด ๋˜์—ˆ์œผ๋ฉด.. Rectangle Circle Triangle RectangleWriter CircleWriter TriangleWriter Rectangle Circle Triangle +draw() +draw() +draw() +persistence() +persistence() +persistence() +draw() V +draw() V +draw()V +persist() V +persist() V +persist() V ๏ฝ ์ง•ํ›„ ๏ฝ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ์ด์œ ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. ๏ฝ ์›์ธ ๏ฝ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ๋‘ ๊ฐ€์ง€ ์ด์ƒ์˜ ์ฑ…์ž„์„ ๊ฐ–๋Š”๋‹ค. ๏ฝ ํ•ด์•ผ ํ•  ์ผ ๏ฝ Extract Class๋ฅผ ํ†ตํ•ด ์ฑ…์ž„์„ ๋ณ„๋„์˜ Class๋กœ ๋ฝ‘์•„๋‚ธ๋‹ค. 94 Confidential 12/13/2011
  • 95. ๋ณ€๊ฒฝ ์ˆ˜์šฉํ•˜๊ธฐ : ์—ฌ๋Ÿฌ ์›์ธ์— ์˜ํ•œ ๋ณ€๊ฒฝ ์‹๋ณ„๋ฒ• ๏ฝ ์ง๊ด€์ ์œผ๋กœ ๏ฝ SRP Test ๏ฝ Method๋ฅผ Uses๊ด€๊ณ„๋กœ ๊ทธ๋ฃนํ™” ๋˜๋Š”, Used๊ด€๊ณ„๋กœ ๊ทธ๋ฃนํ™” ๏ฝ ํ˜•์ƒ๊ด€๋ฆฌ History ๋ถ„์„ ๏ฝ ๊ฐ™์ด ๋ณ€๊ฒฝ๋˜๋Š” ํด๋ž˜์Šค ๋˜๋Š” ๋ฉ”์„œ๋“œ์˜ ๊ทธ๋ฃน์ด ์ƒ์ดํ•˜๋‹ค๋ฉด? 95 Confidential 12/13/2011
  • 96. ๋ณ€๊ฒฝ ์ˆ˜์šฉํ•˜๊ธฐ : ํ‰ํ–‰์ƒ์†๊ณ„์ธต๊ตฌ์กฐ Shape ShapWriter +draw() +persist() Rectangle Circle Triangle RectangleWriter CircleWriter TriangleWriter +draw() +draw() +draw() +persistence() +persistence() +persistence() ๏ฝ ์ง•ํ›„ ๏ฝ ์–ด๋–ค ๊ณ„์ธต๊ตฌ์กฐ์˜ ํ•˜์œ„ํด๋ž˜์Šค ์ƒ์„ฑ -> ๋˜ ๋‹ค๋ฅธ ๊ณ„์ธต๊ตฌ์กฐ์˜ ํ•˜์œ„ํด๋ž˜์Šค ์ƒ์„ฑํ•„์š” ๏ฝ ์›์ธ ๏ฝ ํŽธ์˜์ƒ ๋™์ผํ•œ ๊ณ„์ธต๊ตฌ์กฐ๊ฐ€ ์ƒ์„ฑ๋จ ๏ฝ ๋Œ€๋ถ€๋ถ„ ์ง์„ ์ด๋ฃจ๋Š” ํด๋ž˜์Šค๋Š” ๋™์ผํ•œ ๊ฒฐ์ •์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์ธก๋ฉด์„ ํ‘œํ˜„ํ•œ๋‹ค. ๏ฝ ํ•ด์•ผ ํ•  ์ผ ๏ฝ Move Method, Move Field๋ฅผ ํ•œ์ชฝ ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ์ œ๊ฑฐ 96 Confidential 12/13/2011
  • 97. ๋ณ€๊ฒฝ ์ˆ˜์šฉํ•˜๊ธฐ : ์กฐํ•ฉ์  ํญ๋ฐœ ShapeWriter Triangle +persist() ์ถ”๊ฐ€? DB ์ถ”๊ฐ€? Rectangle Circle +draw() +draw() RectangleExcelWriter RectangleXmlWriter RectangleExcelWriter RectangleXmlWriter ๏ฝ ์ง•ํ›„ ๏ฝ ์ƒˆ๋กœ์šด ํ•˜์œ„ํด๋ž˜์Šค ์ถ”๊ฐ€๋ฅผ ์œ„ํ•ด์„œ ๊ฐ™์€ ๊ณ„์ธต๊ตฌ์กฐ์˜ ์—ฌ๊ธฐ์ €๊ธฐ ๋‹ค์ˆ˜์˜ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ ๏ฝ ์›์ธ ๏ฝ ๋‘ ๊ฐœ ์ด์ƒ์˜ ๊ด€์ (or Concern)์ด ํ•˜๋‚˜์˜ ๊ณ„์ธต๊ตฌ์กฐ๋กœ ๋ชจ๋ธ๋ง ๋˜์–ด ์žˆ๋‹ค. ๏ฝ ํ•ด์•ผ ํ•  ์ผ ๏ฝ Replace Inheritance with Delegation ๏ฝ Tease Apart Inheritance 97 Confidential 12/13/2011
  • 98. Refactoring ๊ธฐ๋ฒ• : Tease Apart Inheritance ๋‘ ๊ฐ€์ง€ ์ž‘์—…์„ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ์ƒ์† ๊ตฌ์กฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ โ†’ ๋‘ ๊ฐœ์˜ ์ƒ์†๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค๊ณ , ํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ํ•˜๋‚˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์œ„์ž„ํ•˜๋ผ. ๏ฝ ์–ด๋–ค ์ž‘์—…์ด ๋” ์ค‘์š”ํ•œ์ง€๋ฅผ ๋”ฐ์ ธ์„œ, ์ค‘์š”ํ•œ ์ž‘์—…์„ ๋‚จ ๊ธฐ๊ณ  ๋‚˜๋จธ์ง€ ์ž‘์—…์„ ์ƒˆ๋กœ์šด ์ƒ์†๊ตฌ์กฐ๋กœ ์˜ฎ๊ธด๋‹ค. 98 Confidential 12/13/2011
  • 99. ๋ณ€๊ฒฝ ์ˆ˜์šฉํ•˜๊ธฐ : ์‚ฐํƒ„์ด ์ˆ˜์ˆ (Shotgun Surgery) ๏ฝ ์ง•ํ›„ ๏ฝ ๊ฐ„๋‹จํ•œ ๋ณ€๊ฒฝ์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค. ๏ฝ ์›์ธ ๏ฝ ํ•˜๋‚˜์˜ ์ฑ…์ž„์ด ์—ฌ๋Ÿฌ ๊ตฐ๋ฐ ๋ถ„์‚ฐ๋˜์–ด ์žˆ๋‹ค. ๏ฝ ์ฑ…์ž„ ์ „์ฒด๋ฅผ ๋‹ด๋‹นํ•  ํด๋ž˜์Šค๊ฐ€ ๋ˆ„๋ฝ๋˜์–ด ์žˆ๋‹ค. ๏ฝ ํ•ด์•ผ ํ•  ์ผ ๏ฝ ์ฑ…์ž„์„ ๋‹ด๋‹นํ•  ํด๋ž˜์Šค ์ƒ์„ฑ ๏ฝ Move Method, Move Field๋ฅผ ํ†ตํ•ด ๊ด€๋ จ ๋ฉ”์†Œ๋“œ & ํ•„๋“œ ์ด๋™ ๏ฝ ์˜ˆ ๏ฝ ๊ตฌ์„ฑ์ •๋ณด ๏ฝ ๋กœ๊น…์ •๋ณด ๏ฝ Persistence ๊ด€๋ จ ์ •๋ณด 99 Confidential 12/13/2011
  • 101. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋ž˜์Šค : ๊ฐœ์š” ๏ฝ ์ง•ํ›„ ๏ฝ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์—†๋‹ค. ๏ฝ ํ•ด์•ผ ํ•  ์ผ ๏ฝ ํ•œ ๋‘๊ฐœ์˜ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ ํ•„์š” ๏ฝ Introduce Foreign Method ๏ฝ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฉ”์„œ๋“œ ํ•„์š” ๏ฝ Introduce Local Extension ๏ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ ˆ์ด์–ด ์ถ”๊ฐ€ [Introduce Local Extension] 101 Confidential 12/13/2011