본문 바로가기
Computer Science/소프트웨어 공학

[소프트웨어공학] 리팩토링 (Refactoring)

by Sky Titan 2020. 11. 4.
728x90

※출처 : TOPCIT 에센스

이미지를 클릭하면 사이트로 이동합니다.

리팩토링 (Refactoring)

  • 외부의 프로그램 동작은 변경하지 않고 프로그램 내부 구조를 개선하는 것을 의미한다.
  • 외부적 기능은 수정하지 않고 내부적 구조 및 관계를 단순화하여 소프트웨어의 유지 보수성을 향상시켜 품질을 높이는 것

 

코드스멜 (Code Smell)

  • 개발자가 이해하거나 유지보수하기 어려워 리팩토링의 대상이 되는 코드

 

코드스멜의 종류

종류 설명
중복된 코드 기능, 데이터 코드가 중복되어 작성
너무 긴 메서드 메서드가 너무 길다
방대한 클래스 힌 클래스가 너무 많은 속성과 메서드를 가짐
과다한 매개변수 메서드의 매개변수가 너무 많음
두 가지 이유로 수정되는 클래스 클래스는 한가지 종류의 책임만을 가져야 하기에 2가지 이상의 이유로 수정되면 안된다.
여러 클래스를 동시에 수정 특정 클래스를 수정할 때마다 다른 클래스들에서 변경을 수행해야하는 경우
데이터 뭉치 합쳐서 다뤄야 할 데이터가 한 클래스에 있지 않다.
기본 타입 집착 클래스를 만들지 않고 int와 같은 기본형 데이터 타입만 사용하는 경우
스위치 문 switch문이나 if 문으로 동작을 나누는 경우
게으른 클래스 클래스가 하는 역할이 별로 없는 경우
의심스러운 일반화 '언젠가 확장 하겠지 '하며 일반화한다.
클래스 인터페이스 불일치 클래스 인터페이스가 적절하지 않다.
불완전한 라이브러리 클래스 기존 라이브러리 클래스를 사용하기 어렵다.
평행상속 하위 클래스를 만들면 클래스 계층의 다른 곳에도 하위 클래스를 만들어야 함
주석 코드의 모자란 부분을 설명하기 위한 자세한 주석이 붙어 있다.

 

리팩토링 기법

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

댓글