YesCoding

Go to English
search:

[Refactoring 2판] Chapter 6-5 ν•¨μˆ˜ μ„ μ–Έ λ°”κΎΈκΈ° (Change Function Declaration)

thumbnail_refactor

λ¦¬νŒ©ν„°λ§ 2νŒμ„ 보고 μ •λ¦¬ν•œ κΈ€λ‘œ, μƒλž΅λœ 뢀뢄이 μžˆκ±°λ‚˜ 잘λͺ» μ΄ν•΄ν•œ 뢀뢄이 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

κ°œλ…κ³Ό 원칙

ν•¨μˆ˜ μ„ μ–Έ λ°”κΎΈκΈ°λŠ” 크게 두 가지 원칙을 가진닀. 1) ν•¨μˆ˜λͺ…을 ν•¨μˆ˜μ˜ 역할을 잘 λ“œλŸ¬λ‚΄λ„λ‘ λͺ…ν™•νžˆ ν•˜λŠ”κ²ƒ, 2) λ§€κ°œλ³€μˆ˜λ₯Ό μ •λ¦¬ν•˜λŠ” 것 이닀.

λ°°κ²½: μ™œ ν•¨μˆ˜ μ„ μ–Έ λ°”κΎΈκΈ°κ°€ ν•„μš”ν•œκ°€?

ν•¨μˆ˜ 선언문을 λͺ…ν™•νžˆ λ‹€λ“¬λŠ” 것이 μ™œ ν•„μš”ν• κΉŒ? μ–΄λ–€ ν•¨μˆ˜μ˜ 선언이 λͺ…ν™•ν•˜λ‹€κ³  ν•  수 μžˆμ„κΉŒ?

λ‚΄κ°€ μ΄ν•΄ν•œ λ°”λ‘œλŠ”

첫째, ν•¨μˆ˜ μ΄λ¦„λ§Œ 봐도 ν•΄λ‹Ή ν•¨μˆ˜κ°€ μ–΄λ–€ 일을 ν•˜λŠ” 지 κ·Έ 역할을 λŒ€λΆ€λΆ„ μ•Œ 수 μžˆμ–΄μ•Ό ν•œλ‹€.

λ‘˜μ§Έ, ν•¨μˆ˜ μ•ˆμ—μ„œ μ‹€ν–‰ν•˜λŠ” μ½”λ“œκ°€ ν•¨μˆ˜ λ°”κΉ₯ λ³€μˆ˜μ— κ°œλ°œμžκ°€ μ˜λ„ν•˜μ§€ μ•Šμ€ 영ν–₯을 λ―Έμ³μ„œλŠ” μ•ˆλœλ‹€λŠ” 것이닀.

ν•¨μˆ˜μ˜ 선언이 λͺ…ν™•ν•΄μ•Ό μ½”λ“œμ˜ 가독성이 μ’‹μ•„μ Έ μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μ›Œμ§€κ³ , μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλ₯Ό μ΅œμ†Œν™”ν•¨μœΌλ‘œμ¨ μ½”λ“œ 퀄리티가 쒋아진닀.

κΈ°μ‘΄ μ½”λ“œλ₯Ό 읽닀가 μ–΄λ–€ ν•¨μˆ˜μ˜ μ΄λ¦„λ§Œ λ΄μ„œ ν•΄λ‹Ή ν•¨μˆ˜κ°€ μ–΄λ–€ 역할을 ν•˜λŠ”μ§€ 도톡 λͺ¨λ₯΄κ² λ‹€λ˜κ°€, ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜λ‘œ λ„˜κ²¨μ§€λŠ” μΈμžκ°’μ΄ ν•„μš” μ΄μƒμœΌλ‘œ 큰 λ¬Έλ§₯s(context)을 κ°€μ Έ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλ₯Ό μ•ΌκΈ°ν•  κ°€λŠ₯성이 μžˆλ‹€λ˜μ§€ λ“±μ˜ bad smell 을 풍기면, ν•¨μˆ˜ μ„ μ–Έ λ°”κΎΈκΈ° 둜 λ¦¬νŒ©ν† λ§μ„ μ§„ν–‰ν•˜μž. πŸ› 

λ§€κ°œλ³€μˆ˜ μˆ˜μ •ν•˜λŠ” μ˜ˆμ‹œ) μ „ν™”λ²ˆν˜Έ formatting ν•˜λŠ” ν•¨μˆ˜

λ¦¬νŒ©ν† λ§ μ „

const formatPhoneNumber = (user) => { let cleaned = ('' + user.str).replace(/\D/g, ''); let match = cleaned.match(/^(\d{3})(\d{3})(\d{4})$/); if (match) { return '(' + match[1] + ') ' + match[2] + '-' + match[3] }; return null };

μœ„ μ½”λ“œλ₯Ό 보면, user 객체λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ„˜κ²¨μ€ŒμœΌλ‘œμ¨ formatPhoneNumber ν•¨μˆ˜μ˜ λ¬Έλ§₯은 user 와 κ²°ν•© (coupling) λ˜μ–΄ 버렸닀. λ§Œμ•½ user 의 μ „ν™”λ²ˆν˜Έκ°€ μ•„λ‹ˆλΌ νšŒμ‚¬ μ „ν™”λ²ˆν˜Έλ₯Ό ν¬λ§·νŒ… ν•˜κ³  싢은 κ²½μš°μ—λŠ” κ·Έλ₯Ό μœ„ν•œ ν•¨μˆ˜λ₯Ό λ”°λ‘œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. 이런 κ²½μš°κ°€ λ§€κ°œλ³€μˆ˜ μˆ˜μ •μ΄ ν•„μš”ν•œ 상황이닀.

λ¦¬νŒ©ν† λ§ ν›„

const formatPhoneNumber = (str) => { let cleaned = ('' + str).replace(/\D/g, ''); let match = cleaned.match(/^(\d{3})(\d{3})(\d{4})$/); if (match) { return '(' + match[1] + ') ' + match[2] + '-' + match[3] }; return null };

formatPhoneNumber ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜λ₯Ό user 객체 μ—μ„œ phone number (type: string) 둜 λ„˜κ²¨μ€ŒμœΌλ‘œμ¨, ν•¨μˆ˜μ˜ λ¬Έλ§₯을 user 와 λ…λ¦½μ‹œμΌ°λ‹€. 이제 formatPhoneNumber ν•¨μˆ˜λŠ” νšŒμ‚¬λ“  μ‚¬λžŒμ΄λ“  상관없이 λͺ¨λ“  μ „ν™”λ²ˆν˜Έλ₯Ό format ν•˜λŠ”λ° 쓰일 수 있게 λ˜μ—ˆλ‹€.

ν•¨μˆ˜λͺ… λͺ…ν™•νžˆ λ°”κΎΈλŠ” μ˜ˆμ‹œ) ν•¨μˆ˜λͺ…을 λ„ˆλ¬΄ μΆ•μ•½ν•œ 경우

λ¦¬νŒ©ν† λ§ μ „

function circum(radius) { return 2 * Math.PI * radius; }

μ—¬κΈ°μ„œ circum 은 μ›μ˜ λ‘˜λ ˆλ₯Ό λœ»ν•˜λŠ” circumference 의 μ€„μž„λ§μ΄λ‹€. λΆˆν•„μš”ν•˜κ²Œ μΆ•μ•½ν•˜μ—¬ μ˜λ―Έκ°€ λͺ…ν™•ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λ‹€μŒκ³Ό 같이 ν•¨μˆ˜λͺ…을 λ¦¬νŒ©ν† λ§ν•œλ‹€.

λ¦¬νŒ©ν† λ§ ν›„

function circumference(radius) { return 2 * Math.PI * radius; }

λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 절차 (ν•˜λ‚˜ ν•˜λ‚˜μ”© λ‹¨κ³„λ³„λ‘œ) μ˜ˆμ‹œ) 고객이 λ‰΄μž‰κΈ€λžœλ“œμ— μ‚΄κ³  μžˆλŠ” 지 ν™•μΈν•˜λŠ” ν•¨μˆ˜

λ¦¬νŒ©ν† λ§μ„ 진행할 λ•Œ, ν•¨μˆ˜κ°€ μ“°μ΄λŠ” 곳이 λͺ‡ ꡰ데가 μ•ˆλ˜μ–΄μ„œ ν•œ λ²ˆμ— λͺ¨λ‘ μ°Ύμ•„ λ°”κΎΈλŠ” κ²½μš°κ°€ μžˆλŠ” λ°˜λ©΄μ— μ“°μ΄λŠ” 곳이 λ§Žμ•„ ν•œλ²ˆμ— λ°”κΏ€ 수 μ—†λŠ” κ²½μš°κ°€ μžˆλ‹€. ν›„μžμ˜ 경우 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 절차λ₯Ό 따라야 ν•œλ‹€. λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ ˆμ°¨λŠ” μ½”λ“œ μ˜ˆμ‹œλ₯Ό λ³΄λŠ” 것이 이해가 λΉ λ₯΄λ‹€.

λ¦¬νŒ©ν† λ§ μ „

// μ„ μ–Έλ¬Έ function inNewEngland(aCustomer) { return ["MA", "CT", "ME", "VT", "NH", "RI"].includes(aCustomer.address.state); } ... // 호좜문 const newEnglanders = someCustomers.filter(c => inNewEngland(c));

λ§€κ°œλ³€μˆ˜λ‘œ λ„˜κ²¨μ£ΌλŠ” aCustomer μ—μ„œ λ‚˜λŠ” bad smell 을 λŠλ‚„ 수 μžˆλ‹€. 🐷 Customer κ°μ²΄μ—λŠ” address.state 말고도 λ‹€λ₯Έ 속성듀이 μžˆμ„ν…λ°, λ‹€λ₯Έ 속성듀은 사싀 customer κ°€ λ‰΄μž‰κΈ€λžœλ“œμ— μ‚¬λŠ” 지 ν™•μΈν•˜λŠ” ν•¨μˆ˜μ˜ μΌκ³ΌλŠ” 상관이 μ—†μœΌλ‹ˆκΉŒ λ§€κ°œλ³€μˆ˜μ— aCustomer κ°€ μ•„λ‹ˆλΌ 고객이 κ±°μ£Όν•˜λŠ” μ£Ό μ΄λ¦„λ§Œ λ„˜κ²¨μ£ΌλŠ” λ°©ν–₯으둜 λ¦¬νŒ©ν† λ§ν•˜λŠ” 것이 μ’‹λ‹€. μ•„λž˜λŠ” ν•΄λ‹Ή λ¦¬νŒ©ν† λ§μ„ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 절차둜 ν•˜λŠ” μ½”λ“œμ΄λ‹€.

// λ°”λ‘œ λ§€κ°œλ³€μˆ˜λ₯Ό aCustomer μ—μ„œ aCustomer.address.state 둜 λ°”κΎΈλ©΄ κ°œλ°œμžκ°€ λ†“μΉœ λΆ€λΆ„μ—μ„œ 버그가 λ‚  κ°€λŠ₯성이 μžˆμœΌλ―€λ‘œ μš°μ„  λ§€κ°œλ³€μˆ˜λ‘œ μ‚¬μš©ν•  μ½”λ“œλ₯Ό λ³€μˆ˜λ‘œ μΆ”μΆœν•œλ‹€. function inNewEngland(aCustomer) { const stateCode = aCustomer.address.state; return ["MA", "CT", "ME", "VT", "NH", "RI"].includes(aCustomer.address.state); }
// ν•¨μˆ˜ μΆ”μΆœν•˜κΈ°λ‘œ μƒˆ ν•¨μˆ˜λ₯Ό λ§Œλ“ λ‹€. function inNewEngland(aCustomer) { const stateCode = aCustomer.address.state; return xxNewinNewEngland(stateCode); } function xxNewinNewEngland(stateCode) { return ["MA", "CT", "ME", "VT", "NH", "RI"].includes(stateCode); }
function inNewEngland(stateCode) { return ["MA", "CT", "ME", "VT", "NH", "RI"].includes(stateCode); } const newEnglanders = someCustomers.filter(c => inNewEngland(c.address.state));
Recommend Post
Β© Copyright 2022, yesCoding