비슷한 메소드와 필드를 가진 두 개의 클래스가 있다면, 슈퍼클래스를 만들어서 공통된 메소드와 필드를 수퍼클래스로 옮겨라.

동기
중복을 제거 할 수 있습니다.

절차
1. 빈 수퍼 클래스를 만들고 원래 클래스들이 이것을 상속하도록 한다.
2. Pull Up Filed, Pull Up Method, Pull Up Contruct Body들을 사용하여 공통 요소들을 옮긴다.
3. 옮길 때 마다 테스트를 한다.
4. 공통된 부분이 있다면 Extract Method를 사용한 뒤에 Pull Up Method를 사용할 수 있다.

예제
리팩터링 대상이 된 두 개의 클래스들
- AddController.java
[#M_ more.. | less.. |

public class AddController extends SimpleFormController{

 

       private TaskService taskService;

 

       public void setTaskService(TaskService taskService) {

             this.taskService = taskService;

       }

 

       public AddController() {

             setCommandClass(Task.class);

             setCommandName("task");

             setFormView("task/add");

             setSuccessView("task/list");

       }

 

       @Override

       protected ModelAndView onSubmit(Object command) throws Exception {

             Task task = (Task)command;

             task.setEnrolled(new Date());

             taskService.add(task);

             return new ModelAndView(getSuccessView())

                    .addObject("taskList", taskService.getTaskList());

       }

}

_M#]- UpdateController.java

[#M_ more.. | less.. |

public class UpdateController extends SimpleFormController {

 

       private TaskService taskService;

 

       public void setTaskService(TaskService taskService) {

             this.taskService = taskService;

       }

 

       public UpdateController() {

             setCommandClass(Task.class);

             setCommandName("task");

             setFormView("task/update");

             setSuccessView("task/list");

       }

 

       @Override

       protected Object formBackingObject(HttpServletRequest request) throws Exception {

             Integer id = Integer.parseInt(request.getParameter("id"));

             Task task = taskService.get(id);

             return task;

       }

 

       @Override

       protected ModelAndView onSubmit(Object command) throws Exception {

             Task task = (Task)command;

             task.setEnrolled(new Date());

             taskService.update(task);

             return new ModelAndView(getSuccessView())

                    .addObject("taskList", taskService.getTaskList());

       }

}

_M#]
리팩터링
1. 상위 클래스를 만들고 각각의 클래스들이 그 클래스를 상속 받도록 한다.
Eclipse를 사용하신다면 리팩터링 대상이 된 클래스에서 Alt + Shift + T를 클릭하여 리팩터링 메뉴를 띄우고 Extract Super Class를 선택할 수 있습니다.
사용자 삽입 이미지
2. 상위 클래스의 이름을 설정하고 상위로 빼낼 멤버들을 선택합니다.
사용자 삽입 이미지
3. Eclipse의 리팩터링 기능을 사용하여 만들어진 클래스를 상속 받도록 수정 되었습니다.
사용자 삽입 이미지
4. 다른 클래스는 수동으로 상속 받고 있는 클래스를 수정해 주거나 상속 하도록 코드를 수정하고 공통 요소를 하나 둘 빼내거나 Pull Up XXX 리팩토링 기능을 사용하여 옮길 수 있습니다.

참조 : Refactoring