728x90
리펙토링이란 일련의 리펙토링을 적용하여 겉으로 보이는 동작의 변화없이 소프트 웨어 구조를 바꾸는 것이다.
리펙토링은 외부 동작을 바꾸지 않고 내부 구조를 개선하는 방법이기도하고 , 코드가 작성된 후 디자인을 개선하기도 한다.
리펙토링은 처음부터 좋은 방법을 생각하기 보다 개발해가면서 지속적으로 좋은 디자인을 찾는것이 좋다.
🔓리펙토링의 목적
소프트 웨어를 보다 이해하기 쉽고, 수정하기 쉽도록 만드는 것이고 리펙토링은 겉으로 보이는 소프트웨어의 기능은 변경하지 않는 것이다.
🔓리펙토링을 하는 이유
- 코드의 구조가 망가지면 당시에는 괜찮을 수 있으나 망가진 구조의 효과는 계속 누적된다.
- 코드의 디자인을 유지하도록 해주고 불필요한 중복을 제거함으로써 각각의 작업에 대한 코드가 한 곳에만 있게 할 수 있다.
- 소프트웨어의 디자인을 개선시켜주고 더 이해하기 쉽게 해준다.
- 디버깅을 하기 편리해진다.
🔓리펙토링을 해야하는 시기
- 3번의 중복/ 3번의 동일한 행위하면 리펙토링을 한다.
- 기능을 추가할 때 되도록이면 리펙토링을 하는 것이 좋다. 기능을 추가할 때 객체 지향의 특징을 살리려면 switch-case문은 지양하는 것이 좋다.
- 버그를 수정 해야할 때 리펙토링을 한다.
🔓리펙토링 단계
- Naming
- 컴퓨터가 이해하는 코드는 개발에서 당연한 것이다. 좋은 프로그래머는 사람도 이해하기 쉽게 작성해야 한다.
- 클래스의 메소드는 클래스의 변수를 사용한다.
- 클래스 정보를 사용하고 있지 않다면 사용하고 있는 쪽으로 움직여야 한다.
- 임시 변수 제거
- 임시 변수는 종종 불필요한 파라미터를 많이 만들게 된다. 임시 변수는 하나의 메소드로 구현하여 리펙토링 하는게 좋다.
- 다른 객체의 속성을 기반으로한 switch문
- switch문을 함수로 추출하여 자신의 데이터를 사용하는 것으로 리펙토링 해야한다.
- 메소드에서 두개의 클래스를 변수로 사용한다면 변화하기 쉬운쪽으로 메소드를 이동시켜 변화의 폭을 최대한 작게 만들어야 한다.
- 기능이 한쪽으로 모여진 클래스를 추상화하여 상속관계로 표현할 수 있다.
- 추후 리펙토링 → 테스트 → 리펙토링 → 테스트를 반복한다.
🔓리펙토링 예제
- 함수,변수명 변경
//before
public int getOrderPrice(int arg1, int arg2){
return arg1 * arg2;
}
//after
public int getOrderTotalPrice(int price , int quantity){
return price * quantity;
}
첫번째 리펙토링 예제는 함수명을 직관적으로 바꾸고 , 변수명을 의미에 맞게 수정한 것이다.
- 메소드 추출을 통해 코드를 간소화 한다.
//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
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 |