Refactoring

리팩토링 기법 카탈로그

Refactoring - 리팩토링 기법 카탈로그

1 minute read

리팩토링 기법 카탈로그에 대해 1. 각 리팩토링 기법 절의 구성 카탈로그 부분의 각 리팩토링 기법은 다음과 같은 5개의 하위 절로 구성했다. 이름 : 각종 리팩토링 기법을 구별하기 위한 필수적인 요소, 카탈로그의 각 절 제목으로도 사용했다. 요약 : 기법의 적용 시점과 목적을 설명. 이부분을 보면 자신에게 필요한 리팩토링 기법을 더 빨리 찾을 수 있다. 동기 : 기법을 실시하는 이유와 실시하지 말아야 할 경우를 설명한다. 방법 : 기법을 수행하는 절차를 단계적으로 간단명료하게 설명한다.

코드의 구린내

Refactoring - 코드의 구린내

5 minute read

  1. 코드의 구린내 구린게 있으면 그 부분을 바로 잡으세요. 리팩토링을 어떨 때 시작하고 어떨 때 그만둬야 할지 판단하는 일은 리팩토링 기법을 적용하는 방법만큼 중요하다. 1. 중복코드 구린내의 제왕 중복코드. 똑같은 코드 구조가 두 군데 이상 있을 때는 그 부분을 하나로 통일하면 프로그램이 개선 한 클래스의 두 메서드 안에 같은 코드가 들어있는경우 -> 메서드 추출 기법을 적용해서 겹치는 코드를 빼내어 별도의 메서드로 만들고 그 메서 드를 두 곳에서 호출 수퍼클래스의 두 하위 클래스에 같은 코드가 들어 있는 경우 -> 메서드 추출 기법을 적용해서 중복을 없앤 후 메서드 상향 기법을 적용하면 된다.

테스트작성

Refactoring - 테스트작성

1 minute read

04 테스트 작성 리팩토링을 실시하기 위한 필수 전제조건은 반드시 견고한 테스트를 해야한다. 적절한 테스트를 작성하면 설령 리팩토링을 하지않더라도 프로그래밍 속도가 월등히 왜 빨라지는 가에 대해서 설명 1. 자가 테스트 코드의 가치 버그를 찾는 데 시간을 많이 소요하는 프로그래머들이 존재 모든 테스트를 완전히 자동화하고 결과를 자체적으로 검사하게 하자. 테스트 스위트(하나의 테스트)는 버그를 찾는 시간을 획기적으로 줄여주는 강력한 버그 감지 도구이다. 2. JUnit 테스트 프레임 워크 예제 소스 3. 단위 테스트와 기능 테스트 단위 테스트(Unit Test) -> 부분적인 단위만 테스트 한다.

리팩토링 개론

Refactoring - 리팩토링 개론

2 minute read

팩토링은 무엇인가 (명사) 겉으로 드러나는 기능은 그대로 둔 채, 알아보기 쉽고 수정하기 간편하게 소프트웨어 내부를 수정하는 방법 (동사) 리팩토링 기법을 연달아 적용해서 겉으로 드러나는 기능은 그대로 둔 채 소프트웨어 구조를 변경한다. 강조할 내용 리팩토링의 목적은 소프트웨어를 더 이해하기 쉽고 수정하기 쉽게 만드는 것이다. 리팩토링은 겉으로 드러나는 소프트웨어 기능에 영향을 주지 않는다. 리팩토링은 왜 해야 하나 소프트웨어 설계가 개선되기 되니까 소프트웨어를 이해하기가 더 쉬워지기 되니까 버그를 찾기가 쉬워지니까 프로그래밍 속도가 빨라지니까 리팩토링은 어떨 때 필요한가 같은 작업의 삼진아웃 때 비슷한 작업을 할 때 두번까진 그냥하고 세번째 하게 되면 리팩토링을 실시하는 것이다.

맛보기 예제

Refactoring - 맛보기 예제

8 minute read

원래의 프로그램 맛보기 예제는 단순히 비디오 대여점에서 고객의 대여료 내역을 계산하고 출력하는 간단한 프로그램이다. 이 프로그램은 고객이 대여한 비디오와 대여기간을 표시한 후, 비디오 종류와 대여 기간을 토대로 대여료를 계산한다. 비디오 종류에는 일반물, 아동물, 최신물 세종류다. 대여료 계산과 더불어 내역을 바탕으로 적립 포인트도 계산되는데, 이 포인트는 비디오가 최신물인지 아닌지에 따라 달라진다. Movie클래스 public class Movie { public static final int CHILDRENS = 2; public static final int REGULAR = 0; public static final int NEW_RELEASE = 1; private String _title; private int _priceCode; public Movie(String title, int priceCode){ _title = title; _priceCode = priceCode; } public int getPriceCode() { return _priceCode; } public void setPriceCode(int arg) { _priceCode = arg; } public String getTitle() { return _title; } } Rental 클래스 java public class Rental { private Movie _movie; private int _daysRented; public Rental(Movie movie, int daysRented) { _movie = movie; _daysRented = daysRented; } public int getDaysRented() { return _daysRented; } public Movie getMovie() { return _movie; } } * Customer 클래스java public class Customer { private String _name; private Vector _rentals = new Vector(); public Customer(String name) { _name = name; } public void addRental(Rental arg) { _rentals.addElement(arg); } public String getName() { return _name; } //리팩토링이 필요한 핵심 메서드 //너무 많은 기능을 가지고 있다 public String statement() { double totalAmount = 0; int frequentRenterPoints = 0; Enumeration<Rental> rentals = _rentals.elements(); String result = getName() + " 고객님의 대여 기록 \n"; while(rentals.hasMoreElements()) { double thisAmount = 0; Rental each = (Rental) rentals.nextElement(); //비디오 종류별 대여로 계산 switch (each.getMovie().getPriceCode()) { case Movie.REGULAR: thisAmount += 2; if(each.getDaysRented() > 2) thisAmount += (each.getDaysRented() - 2) * 1.5; break; case Movie.NEW_RELEASE: thisAmount += each.getDaysRented() * 3; break; case Movie.CHILDRENS: thisAmount += 1.5; if(each.getDaysRented() > 3) thisAmount += (each.getDaysRented() - 3) * 1.5; break; } //적립 포인트 1포인트 증 frequentRenterPoints ++; //최신물을 이틀 이상 대여하면 보너스 포인트 지급 if((each.getMovie().getPriceCode() == Movie.NEW_RELEASE) && each.getDaysRented() > 1) frequentRenterPoints++; //대여하는 비디오 정보와 대여로를 출 result += "\t" + each.getMovie().getTitle() + "\t" + String.valueOf(thisAmount) + "\n"; //현재까지 누적된 총 대여료 totalAmount += thisAmount; } //footer result += "누적 대여료 : " + String.valueOf(totalAmount) + "\n"; result += "적립 포인트 : " + String.valueOf(frequentRenterPoints); return result; } } 맛보기 프로그램설명 statement 메서드에서 지나치게 많은 기능이 들어 있는데 대부분의 기능은 다른 두 클래스에 들어가야 하는 기능이다.