Skip to content

Latest commit

Β 

History

History
153 lines (103 loc) Β· 5.01 KB

refactoring.md

File metadata and controls

153 lines (103 loc) Β· 5.01 KB
layout title subtitle catalog header-img tags date
post
μΈν…”λ¦¬μ œμ΄ λ¦¬νŒ©ν† λ§
Intellij Refactoring
true
IntelliJ
Refactoring
2018-03-11

μΈν…”λ¦¬μ œμ΄ λ¦¬νŒ©ν† λ§ κΈ°λŠ₯

μΈν…”λ¦¬μ œμ΄μ˜ λ¦¬νŒ©ν† λ§ κΈ°λŠ₯을 μ΄μš©ν•΄μ„œ 비ꡐ적 μ‰½κ²Œ λ¦¬νŒ©ν† λ§μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λŒ€ν‘œμ μΈ λ¦¬νŒ©ν† λ§ κΈ°λŠ₯듀을 ν•˜λ‚˜ ν•˜λ‚˜ 천천히 μ‚΄νŽ΄ 보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

ν•΄λ‹Ή κΈ°λŠ₯의 λ‹¨μΆ•ν‚€λŠ” μŠ€ν¬λ¦°μƒ· ν•˜λ‹¨ λ…Ήμƒ‰μœΌλ‘œ ν‘œμ‹œλ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€. 단좕킀 ν™˜κ²½μ΄ λ‹€λ₯Έ μ‚¬μš©μžλ“€μ€ ν•΄λ‹Ή κ·Έλ¦Ό 처럼 Find Action μ°½μ—μ„œ λ¦¬νŒ©ν† λ§ ν‚€μ›Œλ“œλ₯Ό κ²€μƒ‰ν•˜λ©΄ μ›ν•˜λŠ” κΈ°λŠ₯을 μ‰½κ²Œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€. μœ„ μ˜ˆμ œλŠ” Extract Method κ²€μƒ‰ν•œ 이미지 μž…λ‹ˆλ‹€.

Extract Method : ν•¨μˆ˜ 수좜 κΈ°λŠ₯

if(age > 19){
    //λ©”μ†Œλ“œ μˆ˜μΆœμ „
    System.out.println("성인 μž…λ‹ˆλ‹€.");
}

if(isSenior(age)){
    //λ©”μ†Œλ“œ μˆ˜μΆœν›„
    System.out.println("성인 μž…λ‹ˆλ‹€.");
}

private boolean isSenior(int age) {
    return age > 19;
}

λ©”μ†Œλ“œλ‘œ μˆ˜μΆœν•˜λŠ” κΈ°λŠ₯으둜 κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ” λ¦¬νŒ©ν† λ§ κΈ°λŠ₯μž…λ‹ˆλ‹€. λ‹¨μˆœνžˆ age > 19 으둜 κ΅¬λΆ„ν•˜λŠ” 것보닀 isSenior λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•΄μ„œ λ¬»λŠ” 것이 가독성 및 μœ μ§€λ³΄μˆ˜μ—μ„œλ„ μ’‹λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μ €λŠ” ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό ν†΅κ³Όν•˜λŠ” μ½”λ“œλ₯Ό μ΅œλŒ€ν•œ λΉ λ₯΄κ²Œ λ§Œλ“€κ³  μΈν…”λ¦¬μ œμ΄μ˜ λ¦¬νŒ©ν† λ§ κΈ°λŠ₯을 ν†΅ν•΄μ„œ ν΄λ¦°μ½”λ“œ μž‘μ—…μ„ μ§„ν–‰ν•©λ‹ˆλ‹€.

Change Signature : λ©”μ†Œλ“œ νŒŒλΌλ©”ν„° μΆ”κ°€, μ‚­μ œ 및 λ³€κ²½

//λ¦¬νŒ©ν† λ§ μ „
public void printName() {
    printName("Yun");
}

private String printName(String firstName) {
    return firstName;
}

//λ¦¬νŒ©ν† λ§ ν›„
public void printName() {
    printName("Yun", "kim");
}

private String printName(String firstName, String lastName) {
    return firstName + lastName;
}

λ©”μ†Œλ“œμ— νŒŒλΌλ―Έν„°κ°€ μΆ”κ°€λ˜λŠ” 일은 λΉˆλ²ˆν•˜κ²Œ λ§Œλ‚˜κ²Œ λ©λ‹ˆλ‹€. 이 λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©ν• μˆ˜ μžˆλŠ” κΈ°λŠ₯이 Change Signature κΈ°λŠ₯μž…λ‹ˆλ‹€. λ˜ν•œ λ©”μ†Œλ“œμ— μΆ”κ°€λœ νŒŒλΌλ©”ν„°λŠ” ν•΄λ‹Ή λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 곳에 μΌκ΄„μ μš© λ©λ‹ˆλ‹€.

Rename : 이름 λ³€κ²½

public void test() {
    printName("Yun", "kim");
}

//λ¦¬νŒ©ν† λ§μ „
private String printName(String firstName, String lastName) {
    return firstName + lastName;
}

//λ¦¬νŒ©ν† λ§ν›„
private String printFullName(String firstName, String lastName) {
    return firstName + lastName;
}

클래슀, λ©”μ†Œλ“œ, λ³€μˆ˜ λ“±λ“± 이름을 λ³€κ²½ν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€. 정말 많이 μ‚¬μš© ν•˜λŠ” κΈ°λŠ₯쀑에 ν•˜λ‚˜μž…λ‹ˆλ‹€. 이름이 λ³€κ²½λ˜λ©΄ μ°Έμ‘°λ˜λŠ” λͺ¨λ“  κ³³μ—μ„œ 일괄 λ³€κ²½ λ©λ‹ˆλ‹€.

Extract Variable : λ³€μˆ˜ 수좜 κΈ°λŠ₯

// λ¦¬νŒ©ν† λ§ μ „
public void printFullName() {
    printFullName("Yun", "kim");
}

//λ¦¬νŒ©ν† λ§ ν›„
public void printFullName() {
    final String yun = "Yun";
    printFullName(yun, "kim");
}

νŠΉμ • 값을 λ³€μˆ˜λ‘œ μˆ˜μΆœν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€. 기본적으둜 final ν‚€μ›Œλ“œλ‘œ λ³€μˆ˜κ°€ ν• λ‹Ήλ©λ‹ˆλ‹€.λ³€μˆ˜λŠ” 생각보닀 λ³€μˆ˜λ³΄λ‹€ μƒμˆ˜λ‘œ μ‚¬μš©μ„ 많이 λ©λ‹ˆλ‹€. 즉 ν•œλ²ˆ ν• λ‹Ήλœ 값을 λ³€κ²½ν•˜λŠ” 생각보닀 ν”ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ €λŠ” 일단 μƒμˆ˜λ‘œ μ„ μ–Έν•˜κ³  λ‚˜μ€‘μ— 값을 λ³€κ²½ν•  μ΄μœ κ°€ 생기면 κ·Έλ•Œ final ν‚€μ›Œλ“œλ₯Ό μ œκ±°ν•˜λŠ” λ°©ν–₯으둜 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. final ν‚€μ›Œλ“œλŠ” μƒμˆ˜λ‘œ ν• λ‹Ήλœ 값이 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€κ³  λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν•¨μœΌλ‘œμ¨ μ½”λ“œλ₯Ό μ΄ν•΄ν•˜λŠ”λ° 쒋은 μ—­ν™œμ„ ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

Extract Filed : 맴버 ν•„λ“œ 수좜 κΈ°λŠ₯

λ³€μˆ˜ 수좜 κΈ°λŠ₯κ³Ό 거의 동일 ν•©λ‹ˆλ‹€. νŠΉμ • 값을 멀버 ν•„λ“œλ‘œ ν• λ‹Ήλ©λ‹ˆλ‹€.

Extract Constant

λ³€μˆ˜ 수좜 κΈ°λŠ₯κ³Ό 거의 동일 ν•©λ‹ˆλ‹€. νŠΉμ • 값을 static μ˜μ—­μ— ν• λ‹Ήν•©λ‹ˆλ‹€.

Pull Members up

public interface AttackStrategy {
}

public class MissileStrategy implements AttackStrategy{
    public void attack() {
        System.out.println("미사일 곡격");
    }
}

μœ„μ™€ 같은 μ½”λ“œμΌ 경우 attack() λ©”μ†Œλ“œλ₯Ό μƒμœ„ μΈν„°νŽ˜μ΄μ˜ 좔상 λ©”μ†Œλ“œλ‘œ μ˜¬λ¦¬λŠ” κΈ°λŠ₯ μž…λ‹ˆλ‹€. ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œλŠ” @Override μ–΄λ…Έν…Œμ΄μ…˜μ΄ μžλ™μœΌλ‘œ μΆ”κ°€λ©λ‹ˆλ‹€.

Push Members down

Pull Members up κΈ°λŠ₯의 λ°˜λŒ€ κΈ°λŠ₯μž…λ‹ˆλ‹€. μƒμœ„ 클래슀의 μžˆλŠ” λ©”μ†Œλ“œλ₯Ό ν•˜μœ„ 클래슀의 λ©”μ†Œλ“œλ‘œ λ‚΄λ €μ€λ‹ˆλ‹€.

κ²°λ‘ 

μœ„μ—μ„œ μ†Œκ°œν•œ κΈ°λŠ₯으둜 λ ˆκ±°μ‹œν•œ μ½”λ“œλ“€μ„ λ¦¬νŒ©ν† λ§ν•˜λŠ” 것은 ν˜„μ‹€μ μœΌλ‘œ μ–΄λ ΅μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ¦¬νŒ©ν† λ§μ„ λ„ˆλ¬΄ κ±°μ°½ν•˜κ³  μ–΄λ ΅κ²Œ μ‹œμž‘ν•˜λŠ” 것보닀 반볡 적인 μ½”λ“œλ₯Ό 효과적으둜 쀄이고 μ½”λ“œλ₯Ό μœ μ§€λ³΄μˆ˜ 및 가독성 쒋은 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것도 쒋은 λ¦¬νŒ©ν† λ§ 이라고 μƒκ°ν•©λ‹ˆλ‹€.