강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

오브젝트 - 설계 원칙편

7-1. 외부 의존성과 테스트

6-2 보호 로직 중복 이슈

해결된 질문

작성

·

29

1

image.png

안녕하세요 강사님, 강의 잘 보고 있습니다. 이동 로직을 정리하다가 보호(가드) 로직 중복에 대해 질문드립니다.

현재 구조에서 Game.tryMove()에서 player.canMove(dir)로 먼저 확인하고, Player.move(dir) 내부에서도 canMove(dir)를 다시 확인하여 막습니다.

즉, 이동 가능 여부 판정이 두 번 수행됩니다.

// Game
private void tryMove(Direction dir) {
    if (player.canMove(dir)) {   // 1차
        player.move(dir);        // 내부의 2차
        showRoom();
    } else showBlocked();
}

// Player
public void move(Direction dir) {
    if (!canMove(dir)) throw new IllegalArgumentException();
    this.position = this.position.shift(dir);
}
  1. 두 번의 가드가 필요한 이유가 있을까요?

  2. SRP/TDA 관점에서는

    Game의 판정을 제거하고 player.tryMove(dir)만 호출해 결과만 처리하는 패턴이 더 적절한지, 혹은 move()만 두고 예외로 제어하는 방식을 권장하시는지 궁금합니다.

     

답변 2

0

조영호님의 프로필 이미지
조영호
지식공유자

mint.inhrdev님 안녕하세요.

 

다음 질문과 중복되어 답변 대신 링크로 대신합니다.

https://inf.run/41yfx

 

답변 내용을 보시면 궁금하신 부분에 대해 명확하게 이해하실 수 있으실거에요. 🙂

 

질문 남겨 주셔서 감사하고 해당 답변을 읽으신 후에도 궁금한 부분이 있으면 추가로 질문 남겨주세요.

 

감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다. mit.inhrdev님. 설계 원칙에 대해 깊이 있는 질문을 주셔서 감사합니다.

보호 로직 중복 관련 의문점

두 번의 가드(중복된 보호 로직)가 사용되는 이유는 다음과 같습니다:

  1. 안전성 확보: 가드 로직을 통해 Player 객체가 올바른 상태인지 확실히 할 수 있습니다. 이런 방식은 소프트웨어의 안전성을 높여주며, 의도하지 않은 상태 변경을 방지할 수 있습니다.

  2. 책임 분리: GamePlayer의 상태나 내부 로직에 대해 가능한 영향을 받지 않을 수 있습니다. GamePlayer의 행동과 로직을 직접적으로 제어하거나 결합하지 않음으로써, 개별 클래스의 책임을 명확히 유지합니다.

SRP/TDA 관점에서의 설계 방향

  • 단일 책임 원칙(SRP): GamePlayer가 각각 자신만의 책임이 명확히 분리되도록 설계하는 것이 중요합니다. 이를 위해, Game은 단순히 Player의 행동을 호출하고, 그 결과만을 처리하도록 만드는 것이 좋습니다.

  • 텔-돈트-애스크(TDA): GamePlayer의 내부 상태나 동작에 대해 너무 많은 것을 알지 않도록 해야 합니다. Player가 스스로 이동 가능성 여부를 판단하고, 필요할 경우 예외를 던지도록 설계하는 것이 유리할 수 있습니다.

권장 패턴

상황과 설계 의도에 따라 다를 수 있지만 일반적으로 권장되는 패턴은:

  1. player.tryMove(dir) 패턴을 사용: 이럴 경우 Player가 모든 이동 결정 로직을 관리하게 되며, Game은 단순히 결과를 수신하고 처리합니다. 이를 통해 객체의 책임이 명확히 분리됩니다.

  2. 예외를 활용한 로직 제어: move() 메서드 내에서 가드 로직을 사용해 변경을 막고, 예외를 던져 Game이 이를 처리하도록 할 수 있습니다. 예외 처리를 통해 Game은 어떤 문제가 발생했는지를 명확히 알 수 있습니다.

이와 같은 구조는 객체 간의 결합도를 낮추고 각 객체가 독립적으로 운영될 수 있도록 하며, 수정이나 확장이 용이한 설계를 제공합니다.

추가적으로 참고할 만한 자료로서는 다음을 권장드립니다:
- 객체지향 설계에서의 책임 분리 및 예외 처리

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기