본문 바로가기

자바로 배우는 리팩토링7

클래스 추출 클래스 추출 클래스는 각각의 역할이 있어서 그 일을 완수할 '책임'이 있다. 즉 클래스에 있는 필드나 메소드는 해당 클래스가 그 책임을 다하기 위해 선언한 것이다. "클래스에는 하나의 책임만 있는 것이 이상적"이지만 코드를 작성하다 보면 점점 클래스의 크기가 커질 때가 있다. 이때 기존 클래스가 지는 책임 중 누군가에게 넘길 수 잇는 것이 있는지 찾아본다. 그리고 책임을 넘길 새로운 클래스를 작성한다. 책 정보를 관리하는 클래스인 Book을 보자. Client는 Book객체를 생성해서 toXml메소드를 호출하여 Book에 대한 xml을 얻는다. 실행결과: 위의 Book클래스에 이미 노란 네모박스를 칠해 둔 것같이 하나의 클래스에 Book과 책의 저자인 Author에 대한 정보가 존재한다. 이를 클래스 추.. 2022. 1. 1.
메소드 추출 메소드 추출 하나의 메소드 안에 이런저런 세세한 처리가 많다면, 그러한 처리들을 묶어서 나누고 독립된 메소드로 추출한다. 추출한 메소드에는 적절한 이름을 붙힌다. 아주아주 간단한 예로 content를 입력하면 원하는 횟수만큼 출력해주는 배너가 있다고 해보자. 메소드 추출 전의 코드는 아래와 같다. 이를 실행보면 실행결과: 현재 Banner클래스의 print메소드를 보면 길어서 읽기가 어렵다. 테두리 출력 부분과 컨텐츠 출력 부분을 나눠서 메소드로 작성해보자. 그 전에 메소드 추출을 할 때는 몇가지 권장 사항이 있다. 1. 메소드 이름은 중요하다 되도록이면 '동사 + 명사'로 하자! 2. 새로운 메소드는 외부에서 호출하지 못하게 private으로 하자. (혹시 메소드가 변경되어야 한다면 외부의 코드들도 수.. 2021. 12. 31.
널(null)객체 도입 어떤 약을 격일로 먹어야 한다고 해보자. 그런데 이렇게 하루를 걸러서 약을 먹은 것은 쉽지 않다. "내가 오늘 먹었나? 어제는 안먹었나?"를 매일 떠올리면서 먹어야하고, 깜빡하기도 쉽다. 이러한 일이 없도록 '아무런 효과도 없는 가짜약'을 만들어서 케이스에 교대로 담아 매일 먹으면 편리할 것이다. 우리는 이러한 방법을 'null객체'를 도입하여 적용해본다. -자바로 배우는 리패토링 입문- 널 객체 도입은 아래와 같은 상황에서 사용된다. 분기문으로 Null확인을 하는 코드가 너무 많다! 하여 우리는 Null객체를 만들어 Null을 Null객체로 치환하여 Null객체는 아무일도 하지 않도록 할 것이다. 예를 들어 아래와 같은 코드를 if(name != null ){ name.display(); } 아래와 같.. 2021. 12. 28.
어서션(Assertion) Assertion은 프로그래머의 의도를 확실히 밝히면서도 실행 시 조건이 반드시 성립함을 보장한다. 만약 프로그램의 특정 부분에서 int value가 10이어야만 다음 코드가 실행되어야 한다고 로직을 구성했을 시에 value가 10이 아닌데도 실행되면 이는 프로그래머의 의도와는 다른 것이다. 하여 우리는 아래와 같이 value가 10임을 표명한다는 것을 아래와 같이 작성할 수 있다. assert value == 10; 만약 value가 10이 아니면 java.lang.AssertionError를 던진다. 어서션을 사용하면 아래와 같은 장점이 있다. 1. 해당 부분에서 성립해야 할 조건이 명확해지고 소스 코드 읽기가 좋아짐 2. 버그를 빨리 발견할 수 있음 3. 어서션을 활성화하면 어서션이 성립하는지 자동.. 2021. 12. 25.