본문 바로가기
객체 지향 프로그래밍

리팩토링(Refactoring) 과 코드스멜 (Code Smell)

by xangmin 2022. 4. 7.
반응형

⦁ 리팩토링 (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) : 코드 스멜을 감추기 위해 수 많은 주석을 남용함

 

⦁ 리팩토링 기법 종류

기법 설명
메서드
정리
메서드 추출 그룹으로 함께 묶을 수 있는 코드 조작이 있을 때, 코드의 목적이 잘 드러나도록 메서드 이름을 지어 별도의 메서드로 뽑아내는 작업
메서드
파라미터 교체
객체가 메서드를 호출한 다음, 결과를 다른 메서드에 매개변수로 넘기고 있으면 수신자가 그 메서드를 호출하도록 하는 작업
추측성
 일반화
인라인 메서드 메서드의 본문이 메서드 이름만큼 명확하다면 해당 본문을 메서드를 호출하는 호출자 안으로 옮기고 메서드를 삭제
계층 붕괴 슈퍼 클래스와 서브 클래스가 별로 다르지 않다면 하나로 통합
객체
기능 이동
클래스 추출
두 개의 클래스가 해야할 일을 하나의 클래스가 하고 있는 경우 새로운 클래스를 만들어 관련있는 필드와 메서드를 예전 클래스에서 이전
서브클래스 추출
어떤 클래스가 일부 인스턴스에 의해서만 사용되는 기능을 가지고 있다면 인스턴스만 사용하는 기능을 담당하는 서브클래스를 만드는 작업
인터페이스 추출
여러 클라이언트가 한 클래스의 인터페이스의 동일한 부분집합을 사용하고 있다면 부분집합을 인터페이스로 뽑아내는 작업
이름
메서드 이름 수정
타입이 내장되어 있는 이름은 타입에 연관되지 않으면서 잘 전달할 수 있는 이름으로 변경

 

반응형

댓글