[Refactoring 2ν] Chapter 6-5 ν¨μ μ μΈ λ°κΎΈκΈ° (Change Function Declaration)
리ν©ν°λ§ 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));