본문 바로가기

BOOKREVIEW/패턴을활용한리팩토링

ComposeMethod

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. 조건문을 감싸기 보다는, 초반에 메서드를 빠져 나가도록 함으로써 메서드의 실행 요건을 명시하는 것이 낫다.

public void add(Object element) {

      if(readOnly) {

           return;

      }

  }

2. 중간에 10은 매직넘버이고 그 목적을 전혀 표현하지 못하는 숫자로 하드 코딩되어 있으므로, 먼저 이를 상수로 변경

private final static int GROWTH_INCREMENT = 10;

3. element 배열의 크기를 늘릴 필요가 있는지를 검사하는 코드에 Extract Method 리팩토링을 적용

4. element 배열의 크기를 늘리는 코드에 Extract Method 리팩토링 적용

public void add(Object element) {
  if (readOnly) {
   return;
  }
  if (atCapaticy()) {
   grow();
  }
  elements[size++] = element;  
 }
 
 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);
}