Refactoring κ³Ό κ΄λ ¨λ ν λ‘ , μ§λ¬Έ/λ΅λ³μ μ₯μΌλ‘ νμ©νλ€.
νμ¬ κ²μνμ μλ κΈμ κ°μ Έμμ΅λλ€.(μ‘°κΈ μλ΄) μλμ λ§μ§ μλ λΆλΆμ μμ λ°λλλ€.
refactoring μ μ μ 쑰건μ, Refactoring μ νμ κ²°κ³Όκ° κ°μμΌ νλ€. λΌλ κ²μ΄λ€.
Martin Folwerμ Refactoring p326(νμ), 10μ₯μ Parameterize Method λ₯Ό μ΄ν΄λ³΄λ©΄ λ€μκ³Ό κ°μ λ΄μ©μ΄ λμ¨λ€.
~cpp protected Dollars baseCharge() { double result = Math.min(lastUsage(),100) * 0.03; if (lastUsage() > 100) { result += (Math.min (lastUsage(),200) - 100) * 0.05; }; if (lastUsage() > 200) { result += (lastUsage() - 200) * 0.07; }; return new Dollars (result); } μ΄κ²μ λ€μκ³Ό κ°μ΄ λ체λ μ μλ€. protected Dollars baseCharge() { double result = usageInRange(0, 100) * 0.03; //--(1) result += usageInRange (100,200) - 100) * 0.05; result += usageInRange (200, Integer.MAX_VALUE) * 0.07; return new Dollars (result); } protected int usageInRange(int start, int end) { if (lastUsage() > start) return Math.min(lastUsage(),end) - start; else return 0; }
"MatrinFowlerμ μΆμ’
μλ€μ lastUsage()κ° 0 μ΄μμΈ κ°μ λν΄ λμνλκ²μΌν
λ (μ½λλ₯Ό λ³΄κ³ μΆμ νλ©΄ κ·Έλ λ€) λΉμ°νκ±° μλλ?" λΌκ³ μ΄μλ₯Ό μ κΈ°ν μ§λ λͺ¨λ₯΄μ§λ§, μ΄κ±΄ Refactoring μμ νκ²°κ°μ΄ μΆκ΅¬νλ "μλλ₯Ό λͺ
ννκ²"λΌλ λΆλΆμ Refactoringμ΄λΌλ λꡬμ λΌμλ§μΆλ€λ³΄λ μλλ₯Ό λΆλͺ
ννκ² ν κ²°κ³Όλ₯Ό λ³μκ² κ°λ€. (λ§μΉμμ€λ₯)
μμ (1)λ² μ½λλ μλμ²λΌ κ·Έλλ‘ λκ±°λ, usageInRange(Integer.MIN_VALUE, 100)μΌλ‘ νΈμΆνλκ² λ§μ λ― νλ€.
νμ§λ§ μ΄κ²λ μμ λ°©νΈμΌλΏ, μνμ μ‘΄μ¬νλ€. lastUsage()μ κ°μ΄ Integer.MIN_VALUE μ΄κ±°λ, Integer.MAX_VALUE λΌλ©΄? (μ΄λ°μΌμ΄ κ²°μ½ μΌμ΄λ μ μλ€κ³ μ₯λ΄ν μ μλκ°?)
-- μ΄μ μ°
- μ½λμ μλκ° νλ Έλλμ λν κ²μ¦ - λ§μΌ νλ‘κ·Έλ¨ λ΄μμμ μλνλ°κ° λ§λμ§μ λν κ²μ¦μ UnitTest Code μͺ½μΌλ‘ λκΈ°λκ² λμ κ² κ°λ€κ³ μκ°μ΄ λλ€μ. κΈμ λ΄μ©λ κ²°κ΅μ μ 체 Context λ΄μμ νμ
ν΄μΌ νλκΉ. μλκ° μ€μλλ€λ©΄ Test Code λ νμκ² μ£ . (μ¬κΈ°μμ 'μλ'λ κ° λͺ¨λλ³ input μ λν output μ λλ‘ λ°κΏμ μκ°νμ
λ μ’μλ―)
- μμ μ½λλ‘ μ μ νλλ - μ’ λ μ½κ² μλμ λ§κ² Refactoring λμ΄μ§ κ²μ΄ μ΄ μμ λ°λ‘ μ μΈ Raise μ΄κΈ΄ νμ§λ§. 그리 μ’μ μλ μλλ― νλ€. usageInRange λ‘ λΉΌλ΄κΈ° μν΄ μ½κ° μΌλΆλ¬ μΌλ°ν 곡μμ λ§λ€μλ€κ³ ν΄μΌ ν κΉμ. κ·Έ λμ μ½λ μ체λ§μΌλ‘ λ»μ μ΄ν΄νκΈ°κ° μ’ λͺ¨νΈν΄μ‘λ€λ λΆλΆμλ λκ°.
- Refactoringμ Motivation - Pattern μ΄κ±΄ Refactoring μ΄κ±΄ 'Motivation' λΆλΆμ΄ μμ£ . μ¦, 무μμ μλνμ¬ μ΄λ¬μ΄λ¬νκ² μ½λλ₯Ό μμ±νλκ°μ
λλ€. Parameterize Method μ μλλ 'couple of methods that do similar things but vary depending on a few values'μ λν μ²λ¦¬μ΄μ£ . μ¦, λΉμ·ν μΌμ νλ λ©μλλ€μ΄κΈ΄ νλ° μΌλΆ κ°λ€μ μν₯λ°λ μ½λλ€μ λν΄μλ, κ·Έ μν₯λ°κ² νλ κ°λ€μ parameter λ‘ λ£μ΄μ£Όκ²λ νκ³ , κ°μ μΌμ νλ λΆλΆμ λν΄μ λ¬ΆμμΌλ‘μ μ€λ³΅μ μ€μ΄κ³ , μΆν μ€λ³΅μ΄ λ λΆλΆλ€μ΄ μ μ΄μ§λλ‘ νμλ κ²μ΄κ² μ£ . -- μμ²
μ κΈμ μ§λ¬Έμ΄λΌκΈ°λ³΄λ€λ μ§μ κ³Ό λΉνμΈ λ― ν©λλ€.
κ·Έ μ§μ μ μΆ©λΆν μ΄ν΄ν©λλ€.
리ν©ν λ§μ μ½λμ μΈλΆμ νλμ λ°κΎΈμ§ μμΌλ©΄μ λ΄λΆμ ꡬ쑰λ₯Ό λ³ννλ κ²μ λ§ν©λλ€. μ¬κΈ°μ ν΅μ¬μ "μΈλΆμ νλ"μ μμ΅λλ€. μ λ μ΄ "μΈλΆμ νλ"μ "μλ―Έμλ/μλνλ μΈλΆμ νλ"μΌλ‘ λ΄
λλ€ -- μ΄μ°¨νΌ μ°λ¦¬μκ² μ½λ μμ²΄κ° κΆκ·Ήμ΄ μλκ³ κ·Έ μ½λκ° νμ€μ λλ¬λ΄λ "μμ€ν
"μ΄ κΆκ·Ήμ΄κΈ° λλ¬Έμ.
κ·Έλ λ€λ©΄, λͺ¨λ μν 곡κ°μ΄ μ μ§λμ΄μΌ νλ κ²μ μλλλ€. μ΄μ°¨νΌ μλ μ½λ μμ²΄κ° μΈκ°μ μμ΄λμ΄λ₯Ό "μ΄μ€νκ²" ννν΄ λΈ κ²μ΄κ³ , κ±°κΈ°μλΆν° μ΄λ―Έ μν 곡κ°μ μ’νμ§κ±°λ, λλ €μ Έμμ΅λλ€.
νμ§λ§ μ΄λ° λ
Όμλ₯Ό λ λμ λλ체 μ 리ν©ν λ§μ νλκ° μκ°ν΄λ³Ό νμκ° μκ² μ΅λλ€. μ°λ¦¬λ 리ν©ν λ§μ "리ν©ν λ§μ΄λΌλ κ²μ΄ μ³λ€ κ·Έλ₯΄λ€"λ₯Ό λ°μ§κΈ° μν΄ μ¬μ©νλ κ²μ΄ μλκ³ , μ°λ¦¬μ νλ‘κ·Έλλ°μ λμμ΄ λκΈ° μν΄ μ¬μ©ν©λλ€.
리ν©ν λ§μ΄λΌλ μ±
μ μ½μ λμλ λ
Όλ¦¬μ μΌλ‘ μ³κ±°λ νλ¦° λΆλΆμ μ°Ύμλ΄λ €κ³ λ
Έλ ₯νλ κ²λ³΄λ€, λμκ² λμμ΄ λλ©΄ μ·¨νκ³ κ·Έλ μ§ μλ€λ©΄ λμ€μ κΈ°μ½νλ κ²μ΄ "νλ‘κ·Έλλ¨Έ"μκ² λμ΄ λλ λ― ν©λλ€.
λ¬Όλ‘ , μ΄λ‘ μ 곡λΆνλ μ μ°νμμκ²λ μ’ λ€λ₯΄κ² μ§μ. νμ§λ§, λκ΅°κ° λ§νλ―μ΄ "μλ²½ν μ΄λ‘ "μ νμ€μμλ ν° κ°μΉκ° μκΈ° λ§λ ¨μ
λλ€. μ λ 리ν©ν λ§μμ "μλ²½ν μ΄λ‘ "λ³΄λ€ "μ μ©ν μ΄λ‘ "μ μ°Ύμ΅λλ€.
ps. νμ€μμ μ λ§ λͺ¨λ μν 곡κ°/κΈ°κ³κ° κ³ λλ‘ μ μ§λλ 리ν©ν λ§μ μμ΅λλ€. κ°μ₯ λνμ μΈ Extract a Method μ‘°μ°¨λ λͺ¨λ κ²½μ°μ λμΌν νλ μ μ§λ₯Ό 보μ₯ν μλ μμ΅λλ€. 1+2κ° 2+1κ³Ό κ°μ§ μλ€κ³ λ§ν μ μμ΅λλ€. νμ§λ§ μ°λ¦¬μκ² μλ―Έμλ μ λ λ΄μμ μΆ©λΆν μλ‘ κ°λ€κ³ λ§ν μλ μμ΅λλ€ -- λ¬Όλ‘ νμμ λ°λΌ μμλ₯Ό ꡬλΆν μλ μμ΄μΌκ² μ§λ§, μ°μ λ΅μ μ±μ μμ 1+2, 2+1 μ€ μ΄λ κ²μ μ μλ₯Ό μ€ μ§ κ³ λ―Όν νμλ μκ² μ£ .
~cpp > { Refactoring(by Martin Fowler)μ μλͺ»λ refactoring } > { μ μ°(guest), } [snip] > > > μμ (1)λ² μ½λλ μλμ²λΌ κ·Έλλ‘ λκ±°λ, usageInRange(Integer.MIN_VALUE, 100)μΌλ‘ > νΈμΆνλκ² λ§μ λ― νλ€. > > νμ§λ§ μ΄κ²λ μμ λ°©νΈμΌλΏ, μνμ μ‘΄μ¬νλ€. > > lastUsage()μ κ°μ΄ Integer.MIN_VALUE μ΄κ±°λ, Integer.MAX_VALUE λΌλ©΄? > (μ΄λ°μΌμ΄ κ²°μ½ μΌμ΄λ μ μλ€κ³ μ₯λ΄ν μ μλκ°?) >
μ°λ¦¬μκ² νλ‘κ·Έλ¨μ μ³μ(correctness)μ΄ μΌμ°¨μ μ
λλ€. μ΄κ²μ UnitTestλ Eiffel κ°μ DBC μΈμ΄λ‘ μλΉν μ λκΉμ§ 보μ₯ κ°λ₯ ν©λλ€.
κ·Έ λ€μμ λΉλ‘μ 리ν©ν λ§μ μ³μμ λ°μ§ μ¬μ κ° μμ΅λλ€. νλ¦°/ν릴 μ μλ νλ‘κ·Έλ¨μ "μ³κ² 리ν©ν λ§"νλ©΄ μμ νλ¦°/ν릴 μ μλ νλ‘κ·Έλ¨μ΄ λμ΅λλ€.
-- κΉμ°½μ€