728x90

리펙토링이란 일련의 리펙토링을 적용하여 겉으로 보이는 동작의 변화없이 소프트 웨어 구조를 바꾸는 것이다.

리펙토링은 외부 동작을 바꾸지 않고 내부 구조를 개선하는 방법이기도하고 , 코드가 작성된 후 디자인을 개선하기도 한다.

리펙토링은 처음부터 좋은 방법을 생각하기 보다 개발해가면서 지속적으로 좋은 디자인을 찾는것이 좋다.

🔓리펙토링의 목적

소프트 웨어를 보다 이해하기 쉽고, 수정하기 쉽도록 만드는 것이고 리펙토링은 겉으로 보이는 소프트웨어의 기능은 변경하지 않는 것이다.

🔓리펙토링을 하는 이유

  • 코드의 구조가 망가지면 당시에는 괜찮을 수 있으나 망가진 구조의 효과는 계속 누적된다.
  • 코드의 디자인을 유지하도록 해주고 불필요한 중복을 제거함으로써 각각의 작업에 대한 코드가 한 곳에만 있게 할 수 있다.
  • 소프트웨어의 디자인을 개선시켜주고 더 이해하기 쉽게 해준다.
  • 디버깅을 하기 편리해진다.

🔓리펙토링을 해야하는 시기

  • 3번의 중복/ 3번의 동일한 행위하면 리펙토링을 한다.
  • 기능을 추가할 때 되도록이면 리펙토링을 하는 것이 좋다. 기능을 추가할 때 객체 지향의 특징을 살리려면 switch-case문은 지양하는 것이 좋다.
  • 버그를 수정 해야할 때 리펙토링을 한다.

🔓리펙토링 단계

  • Naming
    • 컴퓨터가 이해하는 코드는 개발에서 당연한 것이다. 좋은 프로그래머는 사람도 이해하기 쉽게 작성해야 한다.
  • 클래스의 메소드는 클래스의 변수를 사용한다.
    • 클래스 정보를 사용하고 있지 않다면 사용하고 있는 쪽으로 움직여야 한다.
  • 임시 변수 제거
    • 임시 변수는 종종 불필요한 파라미터를 많이 만들게 된다. 임시 변수는 하나의 메소드로 구현하여 리펙토링 하는게 좋다.
  • 다른 객체의 속성을 기반으로한 switch문
    • switch문을 함수로 추출하여 자신의 데이터를 사용하는 것으로 리펙토링 해야한다.
  • 메소드에서 두개의 클래스를 변수로 사용한다면 변화하기 쉬운쪽으로 메소드를 이동시켜 변화의 폭을 최대한 작게 만들어야 한다.
  • 기능이 한쪽으로 모여진 클래스를 추상화하여 상속관계로 표현할 수 있다.
  • 추후 리펙토링 → 테스트 → 리펙토링 → 테스트를 반복한다.

🔓리펙토링 예제

  1. 함수,변수명 변경
//before
public int getOrderPrice(int arg1, int arg2){
        return arg1 * arg2;
    }

//after
public int getOrderTotalPrice(int price , int quantity){
        return price * quantity;
}

첫번째 리펙토링 예제는 함수명을 직관적으로 바꾸고 , 변수명을 의미에 맞게 수정한 것이다.

  1. 메소드 추출을 통해 코드를 간소화 한다.
//before
public int getOrderTotalPrice1(int price, int quantity,double discount){
     return (int) ((price * quantity) * (discount/100));
}

----------------------------------------------------

//after
public int getOrderTotalPrice2(int price, int quantity,double discount){
    return (int) calculationOrderTotalPrice(price,quantity,discount);
}

private double calculationOrderTotalPrice(int price, int quantity, double discount) {
     return ((price * quantity) * (discount/100));
}

기능을 가지고 있는 메서드는 외부에서 건들지 못하도록 private 선언을 해준다.

🛠클린 코드와 리펙토링

클린 코드와 리펙토링은 큰 의미로 보면 비슷하다. 그러나 클린코드보다 리펙토링이 더 큰 의미를 가지고 있다.

클린코드는 단순히 가독성을 높이기 위한 작업으로 이루어 지지만 리펙토림은 클린 코드를 포함한 유지보수를 위한 코드 개선이 이루어 진다.클린 코드와 같은 부분은 설계부터 잘 설계된느 것이 중요하고 리펙토링은 추후에 개선해 나가는 것이 바람직 하다.

 

https://github.com/ryudongjae/blog-ex

 

GitHub - ryudongjae/blog-ex: 📁블로그 예제 코드

📁블로그 예제 코드 . Contribute to ryudongjae/blog-ex development by creating an account on GitHub.

github.com


REFERENCE

https://tasddc.tistory.com/85

728x90

'Dev > JAVA' 카테고리의 다른 글

[디자인 패턴]GoF 디자인 패턴  (0) 2022.03.15
[JAVA]반복문 안에서 List 요소 삭제  (0) 2022.03.04
[Design Pattern] 빌더 패턴(Builder Pattern)  (0) 2021.12.02
[JAVA]Optional이란?  (0) 2021.06.17
[JAVA]상속(Inheritance)  (0) 2021.06.16