반응형

3단계 사다리


음.. 사다리 생성 미션가지 하고 중단 되었던 미션이다. 정말 어려웠던 미션이다.
그래서 예전 코드를 보고 리팩토링을 해보려다 포비님의 코드를 보고 충격을 먹고 참고하며 개발했다.
정말 잘게 잘게 클래스를 분리 하셨다. 그에 반에 나의 코드는 도메인 코드가 아주 간결했다. 그래서 UI를 살펴보니..
아주 난리가 나있었다. API가 간단하니까 UI가 고생을 하고 있었다..

최소한으로 공개하기

무조건 public으로 하지말고, 최소한으로 하고 필요하면 늘려가라. 공개할수록 예외는 증가한다.
public으로 무작정 열어 놓으면 특정 기능을 전혀 무관한 곳에서 사용하여 의존성을 높일 수 있다.

클라이언트 입장에서 API를 제공하기

예를 들어 특정 파라미터를 받는 생성자를 열어 놓았다고 하자. 그런데 클라이언트가 잘못된 파라미터를 넣었다.
이런 것들은 모두 예외 처리를 해야 하는데 이렇게 오용할 수 있는 상황 자체를 막는 것이다.

public 생성자를 private으로 막고 팩토리 메서드로 생성을 강제하는 등의 방법이 있다.
핵심은 사용자의 오용을 막고, 편의성을 제공하기 위함이다.

불변 객체 사용

Point next(PositionGenerator current) {
    return new Point(index + 1, direction.next(current));
}

이런 식으로 현재 자신의 Point의 상태를 이용해 새로운 Point를 생성하는 코드이다.
해당 메서드는 다음 포인트를 생성하는 코드인데 자신의 위치에 + 1을 하고 포인트의 이동여부를 결정하는 코드이다.
이 코드가 좋은 점을 살펴 보겠다.

  1. getter를 사용하지 않는 메시지를 던지는 방향
    만약 index 상태를 get하는 메서드로 외부에서 새로운 Point를 만든다면, 다른 클라이언트가 다른 방식으로
    Point를 생성할 위험이 있다. 그렇기 때문에 next()라는 메서드를 제공하여 getter()를 제공하지 않으며,
    Point는 SRP를 지켜 모든 클라이언트가 동일한 방식으로 다음 Point 생성을 할 수 있게 해준다.

여기서 핵심은 메시지(next())를 받아 자신의 상태를 이용해 새로운 Point를 제공했다는 것이다.

  1. 불변 객체이기 때문에 setter를 제공하지 않아 여기저기서 상태를 마음대로 바꾸는 일이 없다.
    로직이 없는 setter를 제공하게 되면 하나의 객체를 여기저기서 건드려 복잡도가 증가한다.
반응형
복사했습니다!