U E D R , A S I H C RSS

Refactoring/Bad Smells In Code

Refactoring이 λ™μž‘ν•˜λŠ” λ§€μ»€λ‹ˆμ¦˜μ„ μ•„λŠ” 것 만큼 μ€‘μš”ν•œ 것은, μ–Έμ œ Refactoring을 μ μš©ν• κΉŒ ν•˜λŠ” 것이닀.

μ—¬κΈ°μ„œ λ”œλ ˆλ§ˆκ°€ μ˜¨λ‹€. μ–΄λ–»κ²Œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λΌ μ‚­μ œν•˜κ±°λ‚˜ 클래슀 κ³„μ¦κ΅¬μ‘°λΌ λ§Œλ“œλŠ”κ°€λΌ ν‘œν˜„ν•˜λŠ” 것은 쉽닀. 그건 μ‚¬μ†Œν•œ λ¬Έμ œλ“€μ΄λ‹€. ν•˜μ§€λ§Œ μ–Έμ œ μ΄λŸ¬ν•œ 것듀을 ν•΄μ•Ό ν•  것인지 ν‘œν˜„ν•˜λŠ” 것은 쉽지 μ•Šλ‹€. λ‚˜λŠ” (μ—¬κΈ°μ„œμ˜ IλŠ” Martin Fowler) ν”„λ‘œκ·Έλž˜λ° λΈν•™μ΄λΌλŠ” λͺ¨ν˜Έν•œ ν‘œν˜„μœΌλ‘œ 얼버무리지 μ•Šκ³  μ€ λ” ν™•μ‹€ν•œ 것을 μ›ν–ˆλ‹€.

λ‚΄κ°€ 이 문제둜 Kent Beck 을 λ°©λ¬Έν–ˆμ„ λ•Œ κ·ΈλŠ” "μ–Έμ œ" λΌ μ„λͺ…ν•˜κΈ° μœ„ν•΄μ„œ "Smell" μ΄λΌλŠ” ν‘œν˜„μ„ μ‚¬μš©ν–ˆλ‹€. μš°λ¦¬λŠ” λ§Žμ€ μ½”λ“œλ“€μ„ λ³΄μ•˜κ³ , 그것듀을 λ³΄λ©΄μ„œ Refactoring이 μ μš©κ°€λŠ₯ν•œ μ–΄λ–€ κ΅¬μ‘°λΌ λ°œκ²¬ν–ˆλ‹€.

μ—¬κΈ°μ—μ„œ μš°λ¦¬λŠ” Refactoring이 μ μš©κ°€λŠ₯ν•œ μ•„μ£Ό μ •ν™•ν•œ μ²™λ„λΌ μ œκ³΅ν•˜λ €κ³ λŠ” ν•˜μ§€ μ•Šμ„ 것이닀. κ²½ν—˜μƒ, μ–΄λ– ν•œ 츑정도ꡬ듀도 μˆ™λ ¨λœ μΈκ°„μ˜ μ§κ΄€μ˜ κ²½μŸμƒλŒ€κ°€ 될 μˆ˜λŠ” μ—†μ—ˆλ‹€. μš°λ¦¬κ°€ ν•˜λ €λŠ” 것은 Refactoring에 μ˜ν•΄ 해결될 수 μžˆλŠ” λ¬Έμ œλ“€μ΄ μžˆλŠ” λͺ‡λͺ‡ 뢀뢄을 μ§€μ ν•˜λ €λŠ” 것이닀.

μ–΄λ– ν•œ Refactoring을 ν•΄μ•Ό ν•  지 ν™•μ‹ ν•  수 μ—†μ„λ•Œ 이 뢀뢄을 읽어라. μ •ν™•ν•˜κ²Œ λ˜‘κ°™μ€ Smell을 λ°œκ²¬ν•  순 없더라도 Refactoring에 λŒ€ν•œ μ˜¬λ°”λ₯Έ λ°©ν–₯을 κ°€λ¦¬μΌœ μ„ μ§€μΉ¨μ΄ 될 것이닀.

Duplicated Code

μ€‘λ³΅μ½”λ“œ μ½”λ“œ
  • 같은 ν΄λž˜μŠ€λ‚΄μ— 2κ°œμ΄μƒμ˜ λ©”μ†Œλ“œλ“€μ— μ€‘λ³΅μ½”λ“œ μ‘΄μž¬μ‹œ - ExtractMethod
  • λ‘κ°œ 이상 μ„œλΈŒν΄λž˜μŠ€ λ‚΄ μ€‘λ³΅μ½”λ“œμ‹œ - ExtractMethod ν•œλ’€ PullUpField
  • μ½”λ“œλŠ” λΉ„μŠ·ν•˜μ§€λ§Œ λ˜‘κ°™μ§€λŠ” μ•Šμ€ 경우 - λΉ„μŠ·ν•œ 뢀뢄에 λŒ€ν•΄μ„œ ExtractMethod
  • λ‹€λ₯Έ μ•Œκ³ λ¦¬μ¦˜ λ‚΄μ—μ„œ 같은 일을 ν•˜λŠ” λ©”μ†Œλ“œ - SubstituteAlgorithm
  • λ‘κ°œμ΄μƒμ˜ μ—°κ΄€μ—†λŠ” 클래슀 λ‚΄μ˜ μ€‘λ³΅μ½”λ“œ - ExtractClass

ExtractMethod, ExtractClass, PullUpMethod, FormTemplateMethod

Long Method

μ½”λ“œμ˜ 길이가 κΈ΄ λ©”μ†Œλ“œ
  • λŒ€λΆ€λΆ„μ˜ κ²½μš°μ— λŒ€ν•΄μ„œ - ExtractMethod
  • ExtractMethod ν•˜λŠ”μ€‘ parameterλΌ λ§Žμ΄ λ„˜κ²¨μ•Ό ν•˜κ±°λ‚˜, μž„μ‹œλ³€μˆ˜λΌ λ§Žμ΄ μ‚¬μš©ν•˜κ²Œ λ˜λŠ” 경우 - ReplaceTempWithQuery, IntroduceParameterObject, PreserveWholeObject, ReplaceMethodWithMethodObject
  • 쑰건 & 반볡문 - DecomposeConditional

ExtractMethod, ReplaceTempWithQuery, ReplaceMethodWithMethodObject, DecomposeConditional

Large Class

λ„ˆλ¬΄ ν•˜λŠ” 일이 λ§Žμ€ 큰 클래슀
  • μˆ˜λ§Žμ€ λ³€μˆ˜λ“€ - ExtractClass, ExtractSubclass
  • κΌ­ 항상 μ‚¬μš©λ˜μ§€λŠ” μ•ŠλŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ“€ - ExtractClass, ExtractSubclass
  • GUI ν΄λž˜μŠ€μ—μ„œ 데이터뢀가 μ€‘λ³΅λ λ•Œ - DuplicateObservedData
  • AWT -> Swing Component둜 λ°”κΏ€λ•Œ - DuplicateObservedData

ExtractClass, ExtractSubclass, ExtraceInterface, ReplaceDataValueWithObject

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

ReplaceParameterWithMethod, IntroduceParameterObject, PreserveWholeObject

Divergent Change

ν•˜λ‚˜μ˜ ν΄λž˜μŠ€κ°€ 각각 λ‹€λ₯Έ μ΄μœ λ“€λ‘œ μΈν•΄μ„œ λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ 자주 변경될 λ•Œ.
λ‹€λ₯Έ ν΄λž˜μŠ€λ“€μ΄ λ°”λ€” λ•Œλ§ˆλ‹€ 맀번 μˆ˜μ •λ˜λŠ” λΆ€λΆ„.

ex)
  • μƒˆ λ°μ΄ν„°λ² μ΄μŠ€κ°€ μƒκΈΈλ•Œλ§ˆλ‹€ 3개의 λ©”μ†Œλ“œλΌ λ°”κΏ”μ•Ό ν•œλ‹€.
  • λ°”λ€Œμ–΄μ•Ό ν•˜λŠ” κ²½μš°λ“€μ„ λͺ…ν™•ν•˜κ²Œ ν•œλ’€ ExtractClass ν•˜μ—¬ ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ— λͺ¨μ€λ‹€.

ExtractClass

Shotgun Surgery

ν•˜λ‚˜μ˜ 변화에 μ˜ν•΄ λ‹€λ₯Έ μ—¬λŸ¬ ν΄λž˜μŠ€λ“€μ˜ λ³€κ²½ ν•„μš”μ‹œ
  • λ°”λ€ŒλŠ” 뢀뢄듀에 λŒ€ν•΄ MoveMethod, MoveField ν•˜μ—¬ ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ— λ„£λŠ”λ‹€. (μ—†μœΌλ©΄ μƒˆλ‘œ ν•˜λ‚˜ 클래슀 생성할것)
  • λͺ¨λ“  ν–‰μœ„λ“€μ˜ λ¬ΆμŒμ„ 가지기 μœ„ν•΄ - InlineClass

    • Divergent Change - one class that suffers many kinds of changes
    • shotgun surgery - one change that alters many classes

MoveMethod, MoveField, InlineClass

Feature Envy

μ–΄λ–€ λ©”μ„œλ“œκ°€ μžμ‹ μ΄ 속해 μžˆλŠ” 클래슀의 데이터가 μ•„λ‹Œ λ‹€λ₯Έ 클래슀의 데이터듀을 ν•„μš”λ‘œ ν•  λ•Œ.
MoveMethod, MoveField, ExtractMethod

Data Clumps

클래슀의 λ³€μˆ˜μ„ μ–Έ ν•„λ“œλ‚˜ ν•¨μˆ˜ ν”„λ‘œν† νƒ€μž… 같은 곳에 μžˆλŠ”, 항상 같이 λͺ°λ €λ‹€λ‹ˆλŠ” 데이터 μ•„μ΄ν…œλ“€
  • ExtractClass, IntroduceParameterObject or PreserveWholeObject
  • μ²˜μŒμ— Data Clump듀을 ExtractClassν–ˆμ„λ•Œ Field λ“€ 묢음으둜 보일 μˆ˜λ„ μžˆμ§€λ§Œ λ„ˆλ¬΄ κ±±μ •ν•  ν•„μš”λŠ” μ—†λ‹€.

ExtractClass, IntroduceParameterObject, PreserveWholeObject

Primitive Obsession

κΈ°λ³Έ λ°μ΄ν„°ν˜• : Class 에 λŒ€ν•΄

ReplaceValueWithObject, ExtraceClass, IntroduceParameterObject, ReplaceArrayWithObject, ReplaceTypeCodeWithClass, ReplaceTypeCodeWithSubclasses, ReplaceTypeCodeWithState/Strategy

Switch Statements

길이가 κΈ΄ Switch-Case λ¬Έ.
  • λŒ€λΆ€λΆ„μ˜ 경우 - polymorphism으둜 ν•΄κ²° κ°€λŠ₯
  • switch-case 뢀뢄을 ExtractMethod ν•œ λ’€, polymorphism이 ν•„μš”ν•œ class에 MoveMethod ν•œλ‹€. 그리고 λ‚˜μ„œ ReplaceTypeCodeWithSubclasses λ‚˜ ReplaceTypeCodeWithState/Strategy λΌ ν•  것을 κ²°μ •ν•œλ‹€. μƒμ†κ΅¬μ‘°λΌ μ •μ˜ν•  수 μžˆμ„λ•Œμ—λŠ” ReplaceConditionalWithPolyMorphism ν•œλ‹€.
  • polymorphism을 μ΄μš©ν•˜κΈ°μ—λŠ” λ„ˆλ¬΄ μž‘μ•„ 였히렀 costκ°€ 더 λ“œλŠ” 경우 - ReplaceParameterWithExplicitmethods
  • 쑰건 case 에 null 이 μžˆλŠ” 경우 - IntroduceNullObject

ReplaceConditionalWithPolymorphism, ReplaceTypeCodeWithSubclasses, ReplaceTypeCodeWithState/Strategy, ReplaceParameterWithExplicitMethods, IntroduceNullObject

Parallel Inheritance Hierarchies

병렬 상속 ꡬ쑰. shotgun surgery의 νŠΉλ³„ μΌ€μ΄μŠ€κ°€ λœλ‹€. -_-a

MoveMethod, MoveField

Lazy Class

거의 μ“Έλͺ¨μ—†λŠ” 클래슀.

  • λ³„λ‘œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” subclassλ“€ - CollapseHierarchy
  • 거의 μ“Έλͺ¨μ—†λŠ” μ»΄ν¬λ„ŒνŠΈλ“€ - InlineClass

InlineClass, CollapseHierarchy

Speculative Generality

일어날 κ°€λŠ₯성이 거의 μ—†λŠ” μΌκΉŒμ§€ λ‹€ λŒ€λΉ„ν•œ ν•„μš”μ—†λŠ” μ½”λ“œ. λͺ¨λ“  κΈ°λŠ₯λ“€κ³Ό μ ˆμ°¨λ“€μ€ μ œλŒ€λ‘œ μ΄μš©λ˜μ—ˆμ„λ•Œ μ“Έλͺ¨μžˆλ‹€.
  • μΆ”μƒν΄λž˜μŠ€λ“€μ΄ λ³„λ‘œ ν•˜λŠ” 일이 μ—†μ„λ•Œ - CollapseHierarchy
  • λΆˆν•„μš”ν•œ Delegation - InlineClass
  • μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” parameter듀을 가진 λ©”μ†Œλ“œ - RemoveParameter
  • 좔상적인 λ‘λ¦¬λ­‰μ‹€ν•œ λ©”μ†Œλ“œ 이름 -_-; - RenameMethod 둜 μ§€μƒμœΌλ‘œ λ‚΄λ €μ˜€λ„λ‘ ν•˜λΌλŠ”.. --;

CollapseHierarchy, InlineClass, RemoveParameter, RenameMethod

Temporary Field

νŠΉλ³„ν•œ μƒν™©μ—μ„œλ§Œ μ„ΈνŒ…λ˜λŠ” λ³€μˆ˜λΌ κ°€μ§„ 객체.

ExtractClass, IntroduceNullObject

Message Chains

κ°μ²΄λΌ λΆ€λ₯΄κ³  κ·Έ 객체가 λ‹€λ₯Έ κ°μ²΄λΌ λΆ€λ₯΄κ³ , κ·Έ λ‹€λ₯Έ κ°μ²΄λŠ” 또 또 λ‹€λ₯Έ κ°μ²΄λΌ λΆ€λ₯΄κ³ .. --

HideDelegate

Middle Man

delegation 의 λ‚¨μš©.

RemoveMiddleMan, InlineMethod, ReplaceDelegationWithInheritance

Inappropriate Intimacy

사적인 λΆ€λΆ„(?)에 λŒ€ν•΄μ„œ μ§€λ‚˜μΉ˜κ²Œ 관심을 κΈ°μšΈμ΄λŠ” μœ„ν—˜ν•œ(?) ν΄λž˜μŠ€λ“€.

MoveMethod, MoveField, ChangeBidirectionalAssociationsToUnidirectional, ReplaceInheritanceWithDelegation, HideDelegation

Alternative Classes with Different Interfaces

같은 일을 ν•˜μ§€λ§Œ λ‹€λ₯Έ signatureλΌ κ°€μ§„ λ©”μ„œλ“œλ“€.

RenameMethod, MoveMethod

Incomplete Library Class

λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ œκ³΅ν•˜λŠ” λ©”μ„œλ“œλ“€μ΄ λΆˆμΆ©λΆ„ν•  λ•Œ.


IntroduceForeignMethod, IntroduceLocalExtension

Data Class

ν•„λ“œ, getter, setterλ§Œμ„ 가진 어린아이와 같은 클래슀.

MoveMethod, EncapsulateField, EncapsulateCollection

Refused Bequest

μ„œλΈŒν΄λž˜μŠ€κ°€ λΆ€λͺ¨μ˜ behaviorλŠ” μž¬μ‚¬μš©ν•˜λ‚˜ λΆ€λͺ¨μ˜ μΈν„°νŽ˜μ΄μŠ€λΌ μ§€μ›ν•˜κΈ°λΌ μ›ν•˜μ§€λŠ” μ•Šμ„ λ•Œ.

ReplaceInheritanceWithDelegation

Comments

λ‚˜μœ λƒ„μƒˆλΌ κ°€λ¦¬κΈ° μœ„ν•œ λ°©ν–₯제둜 μ‚¬μš©λ˜λŠ” 주석. --;


주석을 μ“Έ ν•„μš”κ°€ μžˆλ‹€λŠ” λŠλ‚Œμ΄ λ“€λ•Œ 일단 μ½”λ“œλΌ λ¦¬νŽ™ν† λ§ ν•˜λ©΄ 주석을 많이 μ“Έ ν•„μš”κ°€ μ—†μŒμ„ μ•Œκ²Œ λœλ‹€.


주석을 μ΄μš©ν•  쒋은 μ‹œκΈ°λŠ” λ„λŒ€μ²΄ 무엇을 ν•΄μ•Ό ν•  지 λͺ¨λ₯΄κ² μ„ λ•Œ 이닀. 무엇을 ν•  것인지 μ£Όμ„μœΌλ‘œ λ¨Όμ € μ„œμˆ ν•¨μœΌλ‘œμ„œ 주석은 ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 무엇을 ν•΄μ•Ό ν•  지 ν™•μ‹ ν•  수 없을 λ•Œ 쒋은 μ§€μΉ¨μ„œκ°€ λœλ‹€. 주석은 ' μ™œ 당신이 이것을 ν•˜λŠ”κ°€' λΌ λ§ν•˜κΈ° μœ„ν•œ 쒋은 μž₯μ†Œμ΄λ‹€.

ExtractMethod, IntroduceAssertion


전에 JuNe ν˜•μ΄ μ΅œν•œκΈ°μ˜ 신기톡을 μ–ΈκΈ‰ν•˜λ©΄μ„œ Metaphor λ‘œμ„œ 'Smell' 이 잘 λ§žμ•„λ–¨μ–΄μ§μ„ μ΄μ•ΌκΈ°ν•˜λ˜κ²Œ 생각. 'λƒ„μƒˆλž€ 일단 κ·Έ 자체둜 μ•…μ·¨λΌ ν’κΈΈ 뿐만 μ•„λ‹ˆλΌ, λ°–μœΌλ‘œ 점차적으둜 퍼지고, μ‚¬λžŒμ—κ²Œ λ°°μ–΄λ“€ 수 있으며, μ‚¬λžŒμ—κ²Œ λ°°μ–΄λ“€κ³  λ‚˜λ©΄ κ·Έ μ‚¬λžŒμ΄ λƒ„μƒˆμ— λŒ€ν•΄ 인식을 ν•˜μ§€ λͺ»ν•œλ‹€.'. Smell 에 λΌκ°ν•œ μ‚¬λžŒλ“€μ€ μž‘μ€ Refactoring 도 잘 ν•΄λ‚Ό 수 μžˆλ‹€. -- 1002


Refactoring
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:27:52
Processing time 0.0916 sec