Compose Method
어떤 메서드의 내부 로직이 한눈에 이해하기 어렵다면, 그 로직을 읟가 잘 드러나며 동등한 수준의 작업을 하는 여러 단계로 나눈다.
Composed Method는 다른 메서드들에 대한 호출로 이루어진다. 또, 호출하는 각 메서드가 동등한 수준으로 작업할 때 더 좋은 Composed Mthod가 된다.
장점과 단점
1. +어떤 메서드가 무슨 일을 하고, 또 그일을 어떻게 수행하지는효과적으로 나타냄 즉 메서드가 명확해짐.
2. +메서드를 단순하게 만든다.
3. -작은 메서드가 지나치게 많이 생길 수 있다.
4. -로직이 여러 곳에 흩어지기 때문에 디버깅이 어렵다.
지침
1. 작게만든다 - 10줄 이내로 짠다.
2. 사용되지 않거나 중복된 코드를 제거 - 내부의 코드량 줄임
3. 코드의 의도가 잘 드러나도록 한다. - 목적에 맞는 이름을 지어라
4. 단순화한다. - 코드를 가능한 단순하게 변경
5. 동등한 수준으로 단계를 나눔 - 메서드를 나눌때, 각 단계가 동등한 수준이 되도록 해야 한다.
예제
public class List { public void add(Object element) { if (!readOnly) { int newSize = size +1 if (newSize > elemnets.length) { Object[] newElements = new Object[elements.length + 10]; for (int i = 0; i < size; i++) { newElements[i] = elements[i]; } elements[size++] = element; } } } }
1. 조건문을 감싸기 보다는, 초반에 메서드를 빠져 나가도록 함으로써 메서드의 실행 요건을 명시하는 것이 낫다.
if(readOnly) {
return;
}
}
2. 중간에 10은 매직넘버이고 그 목적을 전혀 표현하지 못하는 숫자로 하드 코딩되어 있으므로, 먼저 이를 상수로 변경
3. element 배열의 크기를 늘릴 필요가 있는지를 검사하는 코드에 Extract Method 리팩토링을 적용
4. element 배열의 크기를 늘리는 코드에 Extract Method 리팩토링 적용
if (readOnly) {
return;
}
grow();
}
}
private void grow() {
Object[] newElements = new Object[elements.length + GROWTH_INCREMENT];
for (int i = 0; i < size; i++) {
newElements[i] = elements[i];
}
elements = newElements;
}
private int atCapaticy() {
return (size + 1) > elemnets.length;
}
5. 마지막 한 줄은 다른 부분과 동등한 수준이 아니기 대문에 별도 메소드 추출
public void add(Object element) {
if (readOnly) {
return;
}
if (atCapaticy()) {
grow();
}
addElement(element);
}