Refactoringμ΄ λμνλ 맀컀λμ¦μ μλ κ² λ§νΌ μ€μν κ²μ, μΈμ Refactoringμ μ μ©ν κΉ νλ κ²μ΄λ€.
μ¬κΈ°μ λλ λ§κ° μ¨λ€. μ΄λ»κ² μΈμ€ν΄μ€ λ³μλ₯Ό μμ νκ±°λ ν΄λμ€ κ³μ¦κ΅¬μ‘°λ₯Ό λ§λλκ°λ₯Ό νννλ κ²μ μ½λ€. 그건 μ¬μν λ¬Έμ λ€μ΄λ€. νμ§λ§ μΈμ μ΄λ¬ν κ²λ€μ ν΄μΌ ν κ²μΈμ§ νννλ κ²μ μ½μ§ μλ€. λλ (μ¬κΈ°μμ Iλ Martin Fowler) νλ‘κ·Έλλ° λ―Ένμ΄λΌλ λͺ¨νΈν ννμΌλ‘ μΌλ²λ¬΄λ¦¬μ§ μκ³ μ’ λ νμ€ν κ²μ μνλ€.
λ΄κ° μ΄ λ¬Έμ λ‘ Kent Beck μ λ°©λ¬Ένμ λ κ·Έλ "μΈμ " λ₯Ό μ€λͺ
νκΈ° μν΄μ "Smell" μ΄λΌλ ννμ μ¬μ©νλ€. μ°λ¦¬λ λ§μ μ½λλ€μ 보μκ³ , κ·Έκ²λ€μ 보면μ Refactoringμ΄ μ μ©κ°λ₯ν μ΄λ€ ꡬ쑰λ₯Ό λ°κ²¬νλ€.
μ¬κΈ°μμ μ°λ¦¬λ Refactoringμ΄ μ μ©κ°λ₯ν μμ£Ό μ νν μ²λλ₯Ό μ 곡νλ €κ³ λ νμ§ μμ κ²μ΄λ€. κ²½νμ, μ΄λ ν μΈ‘μ λꡬλ€λ μλ ¨λ μΈκ°μ μ§κ΄μ κ²½μμλκ° λ μλ μμλ€. μ°λ¦¬κ° νλ €λ κ²μ Refactoringμ μν΄ ν΄κ²°λ μ μλ λ¬Έμ λ€μ΄ μλ λͺλͺ λΆλΆμ μ§μ νλ €λ κ²μ΄λ€.
μ΄λ ν Refactoringμ ν΄μΌ ν μ§ νμ ν μ μμλ μ΄ λΆλΆμ μ½μ΄λΌ. μ ννκ² λκ°μ Smellμ λ°κ²¬ν μ μλλΌλ Refactoringμ λν μ¬λ°λ₯Έ λ°©ν₯μ κ°λ¦¬μΌ μ€ μ§μΉ¨μ΄ λ κ²μ΄λ€.
Duplicated Code ¶
μ€λ³΅μ½λ μ½λ
- κ°μ ν΄λμ€λ΄μ 2κ°μ΄μμ λ©μλλ€μ μ€λ³΅μ½λ μ‘΄μ¬μ - ExtractMethod
- λκ° μ΄μ μλΈν΄λμ€ λ΄ μ€λ³΅μ½λμ - ExtractMethod νλ€ PullUpField
- μ½λλ λΉμ·νμ§λ§ λκ°μ§λ μμ κ²½μ° - λΉμ·ν λΆλΆμ λν΄μ ExtractMethod
- λ€λ₯Έ μκ³ λ¦¬μ¦ λ΄μμ κ°μ μΌμ νλ λ©μλ - SubstituteAlgorithm
- λκ°μ΄μμ μ°κ΄μλ ν΄λμ€ λ΄μ μ€λ³΅μ½λ - ExtractClass
Long Method ¶
μ½λμ κΈΈμ΄κ° κΈ΄ λ©μλ
- λλΆλΆμ κ²½μ°μ λν΄μ - ExtractMethod
- ExtractMethod νλμ€ parameterλ₯Ό λ§μ΄ λκ²¨μΌ νκ±°λ, μμλ³μλ₯Ό λ§μ΄ μ¬μ©νκ² λλ κ²½μ° - ReplaceTempWithQuery, IntroduceParameterObject, PreserveWholeObject, ReplaceMethodWithMethodObject
- 쑰건 & λ°λ³΅λ¬Έ - DecomposeConditional
Large Class ¶
λ무 νλ μΌμ΄ λ§μ ν° ν΄λμ€
- μλ§μ λ³μλ€ - ExtractClass, ExtractSubclass
- κΌ νμ μ¬μ©λμ§λ μλ μΈμ€ν΄μ€ λ³μλ€ - ExtractClass, ExtractSubclass
- GUI ν΄λμ€μμ λ°μ΄ν°λΆκ° μ€λ³΅λ λ - DuplicateObservedData
- AWT -> Swing Componentλ‘ λ°κΏλ - DuplicateObservedData
Long Parameter List ¶
Parameter μΈμκ° λ§μ ν¨μ. μ΄ν΄νκΈ° νλ€κ³ , μ¬μ©νκΈ° μ΄λ ΅λ€.
- When you can get the data in one parameter by making a request of an object you already know about - ReplaceParameterWithMethod
- to take a bunch of data gleaned from an object and replace it with the object itself - PreserveWholeObject
- logicμ κ°μ§μ§ μλ μ¬λ¬κ°μ data itemμ κ°μ§λ κ²½μ° - IntroduceParameterObject
Divergent Change ¶
νλμ ν΄λμ€κ° κ°κ° λ€λ₯Έ μ΄μ λ€λ‘ μΈν΄μ λ€λ₯Έ λ°©μμΌλ‘ μμ£Ό λ³κ²½λ λ.
λ€λ₯Έ ν΄λμ€λ€μ΄ λ°λ λλ§λ€ λ§€λ² μμ λλ λΆλΆ.
λ€λ₯Έ ν΄λμ€λ€μ΄ λ°λ λλ§λ€ λ§€λ² μμ λλ λΆλΆ.
Shotgun Surgery ¶
νλμ λ³νμ μν΄ λ€λ₯Έ μ¬λ¬ ν΄λμ€λ€μ λ³κ²½ νμμ
- λ°λλ λΆλΆλ€μ λν΄ MoveMethod, MoveField νμ¬ νλμ ν΄λμ€μ λ£λλ€. (μμΌλ©΄ μλ‘ νλ ν΄λμ€ μμ±ν κ²)
- λͺ¨λ νμλ€μ λ¬Άμμ κ°μ§κΈ° μν΄ - InlineClass
- Divergent Change - one class that suffers many kinds of changes
- shotgun surgery - one change that alters many classes
- Divergent Change - one class that suffers many kinds of changes
Feature Envy ¶
μ΄λ€ λ©μλκ° μμ μ΄ μν΄ μλ ν΄λμ€μ λ°μ΄ν°κ° μλ λ€λ₯Έ ν΄λμ€μ λ°μ΄ν°λ€μ νμλ‘ ν λ.
MoveMethod, MoveField, ExtractMethod
MoveMethod, MoveField, ExtractMethod
Data Clumps ¶
ν΄λμ€μ λ³μμ μΈ νλλ ν¨μ νλ‘ν νμ
κ°μ κ³³μ μλ, νμ κ°μ΄ λͺ°λ €λ€λλ λ°μ΄ν° μμ΄ν
λ€
- ExtractClass, IntroduceParameterObject or PreserveWholeObject
- μ²μμ Data Clumpλ€μ ExtractClassνμλ Field λ€ λ¬ΆμμΌλ‘ λ³΄μΌ μλ μμ§λ§ λ무 κ±±μ ν νμλ μλ€.
Primitive Obsession ¶
Switch Statements ¶
κΈΈμ΄κ° κΈ΄ Switch-Case λ¬Έ.
- λλΆλΆμ κ²½μ° - polymorphismμΌλ‘ ν΄κ²° κ°λ₯
- switch-case λΆλΆμ ExtractMethod ν λ€, polymorphismμ΄ νμν classμ MoveMethod νλ€. κ·Έλ¦¬κ³ λμ ReplaceTypeCodeWithSubclasses λ ReplaceTypeCodeWithState/Strategy λ₯Ό ν κ²μ κ²°μ νλ€. μμꡬ쑰λ₯Ό μ μν μ μμλμλ ReplaceConditionalWithPolyMorphism νλ€.
- polymorphismμ μ΄μ©νκΈ°μλ λ무 μμ μ€νλ € costκ° λ λλ κ²½μ° - ReplaceParameterWithExplicitmethods
- 쑰건 case μ null μ΄ μλ κ²½μ° - IntroduceNullObject
Parallel Inheritance Hierarchies ¶
Lazy Class ¶
Speculative Generality ¶
μΌμ΄λ κ°λ₯μ±μ΄ κ±°μ μλ μΌκΉμ§ λ€ λλΉν νμμλ μ½λ. λͺ¨λ κΈ°λ₯λ€κ³Ό μ μ°¨λ€μ μ λλ‘ μ΄μ©λμμλ μΈλͺ¨μλ€.
- μΆμν΄λμ€λ€μ΄ λ³λ‘ νλ μΌμ΄ μμλ - CollapseHierarchy
- λΆνμν Delegation - InlineClass
- μ¬μ©νμ§ μλ parameterλ€μ κ°μ§ λ©μλ - RemoveParameter
- μΆμμ μΈ λ리λμ€ν λ©μλ μ΄λ¦ -_-; - RenameMethod λ‘ μ§μμΌλ‘ λ΄λ €μ€λλ‘ νλΌλ.. --;
Temporary Field ¶
Message Chains ¶
κ°μ²΄λ₯Ό λΆλ₯΄κ³ κ·Έ κ°μ²΄κ° λ€λ₯Έ κ°μ²΄λ₯Ό λΆλ₯΄κ³ , κ·Έ λ€λ₯Έ κ°μ²΄λ λ λ λ€λ₯Έ κ°μ²΄λ₯Ό λΆλ₯΄κ³ .. --
HideDelegate
Inappropriate Intimacy ¶
Alternative Classes with Different Interfaces ¶
Incomplete Library Class ¶
Data Class ¶
Refused Bequest ¶
μλΈν΄λμ€κ° λΆλͺ¨μ behaviorλ μ¬μ¬μ©νλ λΆλͺ¨μ μΈν°νμ΄μ€λ₯Ό μ§μνκΈ°λ₯Ό μνμ§λ μμ λ.
ReplaceInheritanceWithDelegation
Comments ¶
λμ λμλ₯Ό κ°λ¦¬κΈ° μν λ°©ν₯μ λ‘ μ¬μ©λλ μ£Όμ. --;
μ£Όμμ μΈ νμκ° μλ€λ λλμ΄ λ€λ μΌλ¨ μ½λλ₯Ό 리νν λ§ νλ©΄ μ£Όμμ λ§μ΄ μΈ νμκ° μμμ μκ² λλ€.
μ£Όμμ μ΄μ©ν μ’μ μκΈ°λ λλ체 무μμ ν΄μΌ ν μ§ λͺ¨λ₯΄κ² μ λ μ΄λ€. 무μμ ν κ²μΈμ§ μ£ΌμμΌλ‘ λ¨Όμ μμ ν¨μΌλ‘μ μ£Όμμ νλ‘κ·Έλλ¨Έκ° λ¬΄μμ ν΄μΌ ν μ§ νμ ν μ μμ λ μ’μ μ§μΉ¨μκ° λλ€. μ£Όμμ ' μ λΉμ μ΄ μ΄κ²μ νλκ°' λ₯Ό λ§νκΈ° μν μ’μ μ₯μμ΄λ€.
μ μ JuNe νμ΄ μ΅νκΈ°μ μ κΈ°ν΅μ μΈκΈνλ©΄μ Metaphor λ‘μ 'Smell' μ΄ μ λ§μλ¨μ΄μ§μ μ΄μΌκΈ°νλκ² μκ°. 'λμλ μΌλ¨ κ·Έ μμ²΄λ‘ μ
μ·¨λ₯Ό νκΈΈ λΏλ§ μλλΌ, λ°μΌλ‘ μ μ°¨μ μΌλ‘ νΌμ§κ³ , μ¬λμκ² λ°°μ΄λ€ μ μμΌλ©°, μ¬λμκ² λ°°μ΄λ€κ³ λλ©΄ κ·Έ μ¬λμ΄ λμμ λν΄ μΈμμ νμ§ λͺ»νλ€.'. Smell μ λ―Όκ°ν μ¬λλ€μ μμ Refactoring λ μ ν΄λΌ μ μλ€. -- 1002
Refactoring