해당 글은 NEXTSTEP 자바 플레이그라운드 with TDD, 클린 코드를 통해서 새롭게 배우고 내용을 기록한 글입니다.
왜 모든 원시 값과 문자열을 포장해야할까?
아래 코드를 살펴보자.
현재 멤버 변수에는 'name'과 'position'이 존재 하며, 대충 봤을 때는 Car 클래스는 복잡도가 그렇게 높진 않다.
만약, 요구사항이 추가되어서 멤버 변수가 더 늘어나서 100개 이상이 된다면 어떨까?
public class Car {
private static final int MIN_FORWARD_VALUE = 4;
private static final int MAX_NAME_LENGTH_VALUE = 5;
private String name;
private int position;
public Car(String name) {
this(name, 0);
}
public Car(String name, int position) {
this.name = name;
this.position = position;
}
// 생략..
그렇다면, Car 라는 클래스의 복잡도는 굉장히 높아진다.
어떻게 해야할까?
클래스로 분리해볼까?
public class Car {
private static final int MIN_FORWARD_VALUE = 4;
private Name name;
private Position position;
// 생략...
public class Position {
private int position;
public Position(int value) {
if( value < 0 ) {
throw new IllegalArgumentException("position을 음수로 지정할 수 없습니다.");
}
this.position = value;
}
// 생략...
public class Name {
private static final int MAX_NAME_LENGTH_VALUE = 5;
private String name;
public Name(String name) {
if( StringUtils.isBlanck(name) )
throw new IllegalArgumentException("1글자 이상을 입력해야 합니다.");
if( isInvalidNameLegnth(name) )
throw new IllegalArgumentException("5글자를 초과할 수 없습니다.");
this.name = name;
}
// 생략...
기존에 Car 클래스에 있던 'position'과 'name'에 대한 유효성 체크 로직이 각각의 클래스로 이동한 것을 확인할 수 있다.
따라서, 객체는 단 하나의 책임만 가져야 한다는 원칙인 단일 책임 원칙(SRP)을 지키고 있는 것을 알 수 있다.
'Java' 카테고리의 다른 글
refactor: 상속과 인터페이스 활용 (0) | 2023.04.27 |
---|---|
[Java] 상태 데이터를 get하지 말고 메시지를 보내라. (0) | 2023.04.25 |
[Java] 요구사항이 자주 변경되는 코드에 대한 리팩토링 / 전략 패턴 ( Strategy Pattern ) / 의존관계 주입(DI) (0) | 2023.04.24 |
[Java] Matcher 클래스를 사용한 커스텀 구분자 지정 (0) | 2023.04.18 |
[Java] 왜 DI(Dependency Injection)가 필요한가? (0) | 2023.04.10 |
댓글