6-2 보호 로직 중복 이슈
104
작성자 없음
0 câu hỏi đã được viết

안녕하세요 강사님, 강의 잘 보고 있습니다. 이동 로직을 정리하다가 보호(가드) 로직 중복에 대해 질문드립니다.
현재 구조에서 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);
}
두 번의 가드가 필요한 이유가 있을까요?
SRP/TDA 관점에서는
Game의 판정을 제거하고player.tryMove(dir)만 호출해 결과만 처리하는 패턴이 더 적절한지, 혹은move()만 두고 예외로 제어하는 방식을 권장하시는지 궁금합니다.
Câu trả lời 2
0
mint.inhrdev님 안녕하세요.
다음 질문과 중복되어 답변 대신 링크로 대신합니다.
답변 내용을 보시면 궁금하신 부분에 대해 명확하게 이해하실 수 있으실거에요. 🙂
질문 남겨 주셔서 감사하고 해당 답변을 읽으신 후에도 궁금한 부분이 있으면 추가로 질문 남겨주세요.
감사합니다!
0
안녕하세요, 인프런 AI 인턴입니다. mit.inhrdev님. 설계 원칙에 대해 깊이 있는 질문을 주셔서 감사합니다.
보호 로직 중복 관련 의문점
두 번의 가드(중복된 보호 로직)가 사용되는 이유는 다음과 같습니다:
안전성 확보: 가드 로직을 통해
Player객체가 올바른 상태인지 확실히 할 수 있습니다. 이런 방식은 소프트웨어의 안전성을 높여주며, 의도하지 않은 상태 변경을 방지할 수 있습니다.책임 분리:
Game은Player의 상태나 내부 로직에 대해 가능한 영향을 받지 않을 수 있습니다.Game은Player의 행동과 로직을 직접적으로 제어하거나 결합하지 않음으로써, 개별 클래스의 책임을 명확히 유지합니다.
SRP/TDA 관점에서의 설계 방향
단일 책임 원칙(SRP):
Game과Player가 각각 자신만의 책임이 명확히 분리되도록 설계하는 것이 중요합니다. 이를 위해,Game은 단순히Player의 행동을 호출하고, 그 결과만을 처리하도록 만드는 것이 좋습니다.텔-돈트-애스크(TDA):
Game이Player의 내부 상태나 동작에 대해 너무 많은 것을 알지 않도록 해야 합니다.Player가 스스로 이동 가능성 여부를 판단하고, 필요할 경우 예외를 던지도록 설계하는 것이 유리할 수 있습니다.
권장 패턴
상황과 설계 의도에 따라 다를 수 있지만 일반적으로 권장되는 패턴은:
player.tryMove(dir)패턴을 사용: 이럴 경우Player가 모든 이동 결정 로직을 관리하게 되며,Game은 단순히 결과를 수신하고 처리합니다. 이를 통해 객체의 책임이 명확히 분리됩니다.예외를 활용한 로직 제어:
move()메서드 내에서 가드 로직을 사용해 변경을 막고, 예외를 던져 Game이 이를 처리하도록 할 수 있습니다. 예외 처리를 통해Game은 어떤 문제가 발생했는지를 명확히 알 수 있습니다.
이와 같은 구조는 객체 간의 결합도를 낮추고 각 객체가 독립적으로 운영될 수 있도록 하며, 수정이나 확장이 용이한 설계를 제공합니다.
추가적으로 참고할 만한 자료로서는 다음을 권장드립니다:
- 객체지향 설계에서의 책임 분리 및 예외 처리
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
레이어드 아키텍처에서 도메인 중심 패키지 구조를 적용하거나 변화하는 시점이 있을까요?
1
34
2
tryMove(..) 메서드 ArrayIndexOutOfBoundsException 제보
1
59
2
5-4 Sealed Interface는 주로 모든 케이스 검증이 필요할 때 사용하나요?
1
451
1
Game, Player, Room간의 관계에 대한 질문을 드려요
1
105
2
3-2 메서드를 얼마나 작게 나누는게 적절한가요?
1
128
3
4-2 값 객체 질문
1
93
2
7-3 Reader의 소유권 이동에 관해
1
55
2
디자인 패턴에 대해선 어떤 생각을 가지고 계신지 궁금합니다.
2
109
1
8-5 책임 분리를 통한 중복 코드 제거 과정에서 특정 조합은 불가능할 때
2
489
2
인스턴스 증가에 대한 우려
2
128
2
6-2. 명령과 쿼리 분리 원칙 질문
2
489
2
9-1 사소한 강의자료 오류
1
80
2
7-3 상속을 이용한 중복 제거 질문 있습니다!
3
1148
1
함수형 스타일에 대해선 어떻게 생각하시나요?
1
102
2
값 객체 활용에 대해
1
137
2
실례지만 여기에 후기 올립니다.
2
546
3
동일성과 동등성 설명이 바뀐 것 같습니다.
1
112
2
인터페이스명이 변경된 걸까요??
0
88
2
player 내부에 worldmap
3
142
2
9-6 순환참조인거 같은데..
0
112
2
8-5 오타
0
63
2
7-5 자막오타
0
54
2
7-5 자막오타
0
54
2
7-3 AbstractReader에 대해
0
56
2

