본문 바로가기
Java

[Java] 단일 책임 원칙(SRP)을 지키는 방법 / 모든 원시 값과 문자열을 포장

by bkuk 2023. 4. 25.
해당 글은 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)을 지키고 있는 것을 알 수 있다.

 

 

댓글