⦁ 리팩토링 (Refactoring)
- 외부의 프로그램 동작은 변경하지 않고 프로그램 내부 구조를 개선하는 것
- 외부적 기능은 수정하지 않고 내부적 구조 및 관계를 단순화하여 소프트웨어 유지 보수를 향상시켜 품질을 높이는 것
⦁ 코드 스멜 (Code Smell)
- 개발자가 이해하거나 유지보수하기 어려워 리팩토링 대상 대상이 되는 코드
⦁ 리팩토링의 중요성
- 설계 검증
- 코드 최적화 (To clean up messy code)
- 코드 간결화
- 높은 가독성과 이해성
- 잠재적 오류 제거
- 디버깅 시간 단축
⦁ 리팩토리 수행방안
- 소규모 변경 (단일 리팩토링)
- 회귀테스트 (Retest All)
- 테스트 통과 시 단계 상승
- 하나라도 미작동 시 Undo
⦁ 코드스멜 종류
1) 중복코드(Duplicated Code) : 중복된 코드
2) 긴 메서드(Long Method) : 메소드의 내용이 너무 길다
3) 방대한 클래스(Large Class) : 한 클래스에 너무 많은 속성과 메소드가 존재
4) 과다한 매개변수 : 메소드의 파라미터 개수가 너무 많음
5) 수정의 산발(Divergent Change) : 하나의 클래스에 대해 잦은 변경이 발생하는 경우
6) 기능의 산재(Shotgun Surgery) : 변경이 발생할 때 마다 많은 클래수가 수정되는 경우
7) 잘못된 소속(Feature Envy) : 객체 안의 메서드와 데이터가 잘못연결
8) 데이터 뭉치(Data Clump) 동일한 목적/사용용도인 3~4개의 데이터가 몰려있음
9) 임시필드(Temporary Field) : 클래스안의 인스턴스 변수가 아주 특정한 상황에서만 사용됨, 대부분의 경우 실제 사용되지 않는 변수
10) 지나친 관여(Inapproprate Intimacy) : 클래스 간 관게가 지나치게 밀접함. 서로를 너무 많이 관여하고 있음
11) Switch 문 (switch Statements) : 중복코드 발생확률이 높음
12) 불필요한 주석(Comments) : 코드 스멜을 감추기 위해 수 많은 주석을 남용함
⦁ 리팩토링 기법 종류
기법 | 설명 | |
메서드 정리 |
메서드 추출 | 그룹으로 함께 묶을 수 있는 코드 조작이 있을 때, 코드의 목적이 잘 드러나도록 메서드 이름을 지어 별도의 메서드로 뽑아내는 작업 |
메서드 파라미터 교체 |
객체가 메서드를 호출한 다음, 결과를 다른 메서드에 매개변수로 넘기고 있으면 수신자가 그 메서드를 호출하도록 하는 작업 | |
추측성 일반화 |
인라인 메서드 | 메서드의 본문이 메서드 이름만큼 명확하다면 해당 본문을 메서드를 호출하는 호출자 안으로 옮기고 메서드를 삭제 |
계층 붕괴 | 슈퍼 클래스와 서브 클래스가 별로 다르지 않다면 하나로 통합 | |
객체 간 기능 이동 |
클래스 추출 |
두 개의 클래스가 해야할 일을 하나의 클래스가 하고 있는 경우 새로운 클래스를 만들어 관련있는 필드와 메서드를 예전 클래스에서 이전 |
서브클래스 추출 |
어떤 클래스가 일부 인스턴스에 의해서만 사용되는 기능을 가지고 있다면 인스턴스만 사용하는 기능을 담당하는 서브클래스를 만드는 작업 |
|
인터페이스 추출 |
여러 클라이언트가 한 클래스의 인터페이스의 동일한 부분집합을 사용하고 있다면 부분집합을 인터페이스로 뽑아내는 작업 |
|
이름 |
메서드 이름 수정 |
타입이 내장되어 있는 이름은 타입에 연관되지 않으면서 잘 전달할 수 있는 이름으로 변경 |
'객체 지향 프로그래밍' 카테고리의 다른 글
JSON (JavaScript Object Notation)이란? (0) | 2022.04.14 |
---|---|
객체 지향 4가지 특징과 5가지 원칙 (0) | 2022.03.21 |
댓글