Recent Posts
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 오블완
- Spring Batch
- 개성국밥
- 달인막창
- PersistenceContext
- Value too long for column
- k8s #kubernetes #쿠버네티스
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- tolerated
- kotlin
- mp4fpsmod
- 티스토리챌린지
- taint
- PytestPluginManager
- pytest
- preemption #
- table not found
- 코루틴 빌더
- JanusGateway
- 자원부족
- 깡돼후
- JanusWebRTCServer
- python
- terminal
- 코루틴 컨텍스트
- VARCHAR (1)
- JanusWebRTC
- 겨울 부산
- vfr video
- JanusWebRTCGateway
Archives
너와 나의 스토리
[리팩터링] Inline Function 예제로 이해하는 "함수 인라인하기" 본문
반응형
함수를 인라인하는 상황
- 상황 1: 함수 본문이 이름만큼 명확한 경우
- 함수를 제거
- 불필요한 간접 호출은 거슬릴 뿐
- 함수 생성해서 간접 호출하던 것을 합치는 것
- 예:
-
int rating(int cost) { return moreThanFiveCost(cost) ? 2 : 1; } boolean moreThanFiveCost(int cost) { return cost > 5; }
-
- 함수를 제거
- 상황 2: 잘못 추출된 함수들도 다시 인라인한다.
- 잘못 추출된 함수들을 원래 함수로 합친 다음, 필요하면 원하는 형태로 다시 추출하는 것
- 상황 3: 간접 호출을 너무 과하게 쓴 코드도 흔한 인라인 대상이다
- 다른 함수로 단순히 위임하기만 하는 함수들이 너무 많아서 위임 관계가 복잡하게 얽혀 있으면 인라인 해버린다.
절차
- 다형 메서드(polymorphic method)인지 확인한다.
- 서브 클래스에서 오버라이드하는 메서드는 인라인하면 안 된다.
- * 다형성: 하단 설명 참고
- 서브 클래스에서 오버라이드하는 메서드는 인라인하면 안 된다.
- 인라인할 함수를 호출하는 곳을 모두 찾는다.
- 각 호출문을 함수 본문으로 교체한다.
- 하나씩 교체할 때마다 테스트한다.
- 인라인 작업을 한 번에 처리할 필요는 없다.
- 인라인하기가 까다로운 부분이 있다면 일단 남겨두고 여유가 생길 때마다 틈틈이 처리한다.
- 함수 정의(원래 함수)를 삭제한다.
예제를 보며 리팩터링을 해보자!
- 예제 코드:
public class Animal {
public void action() {
List<String> features = new ArrayList<>();
gatherFeatures(features);
// do something
sound();
}
public void sound() {
System.out.println("Animal is making a sound");
}
private void gatherFeatures(List<String> features) {
features.add("Sensitive");
features.add("Independent");
}
}
public class Cat extends Animal {
@Override
public void sound() {
System.out.println("Meow");
}
}
- Animal 클래스의 action 함수를 리팩터링 해보자.
- 먼저 gatherFeautres()라는 함수가 보인다.
-
public void action() { List<String> features = new ArrayList<>(); features.add("Sensitive"); features.add("Independent"); // do something sound(); }
- 다음과 같이 함수를 인라인해도 코드의 의미가 명확하다.
-
- 다음으로는 sound()라는 함수가 보인다.
- 이는 하위 클래스에서 오버라이드하는 함수이기 때문에 인라인 해서는 안된다.
* 다형성
- 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미
- 자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현하고 있다.
class Animal { ... }
class Cat extends Animal { ... }
class Dog extends Animal { ... }
...
Animal animal = new Animal(); // 허용
Cat cat = new Cat(); // 허용
Animal animal = new Cat(); // 허용
Cat cat = new Animal(); // 오류 발생
참고:
- [리팩터링 2판]
반응형
'개발 > Refactoring' 카테고리의 다른 글
[리팩토링] Extract Class 클래스 추출하기 (0) | 2021.11.01 |
---|---|
[리팩토링] Replace Primitive with Object 기본형을 객체로 바꾸기(데이터 항목 -> 객체) (0) | 2021.10.26 |
[리팩토링] Combine Functions into Transform 여러 함수를 변환 함수로 묶기 (0) | 2021.10.19 |
[리팩토링] Introduce Parameter Object 매개변수 객체 만들기 (0) | 2021.10.14 |
[리팩토링] Change Function Declaration 함수 선언 바꾸기 (0) | 2021.10.03 |
Comments