Inflearn brand logo image

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

Aozora님의 프로필 이미지
Aozora

작성한 질문수

클린 코더스: 실전 객체 지향 프로그래밍과 TDD 마스터 클래스

클린 코더스 강의 5. Function Structure Part2

11. Null is not an error의 예제인 top 함수는 커맨드인가요 쿼리인가요??

작성

·

83

0

안녕하세요. 좋은 강의 감사합니다.
CQS에서 커맨드는 내부 구조를 변경하는데 반환값이 없고, 쿼리가 내부 구조를 변경하지 않고 반환값이 있는 것이라고 설명을 들었습니다.

 

그런데, 11. Null is not an error에서 예제를 든 스택의 top 메소드는 내부 구조를 변경함에는 커맨드 처럼 보입니다만, 값을 반환하므로 쿼리 처럼 행동합니다.

예제라서 그런것인지 아니면 쿼리나 커맨드 둘 중에 하나인지 궁금합니다.

답변 2

0

    public int pop() {
        if(isEmpty())
            throw new Underflow();
        return elements[--size];
    }

    public Integer top() {
        if(isEmpty())
            throw new Empty();
        return elements[size - 1];
    }

pop은 내부 상태를 변경(size를 감소시킴)시키고, 값을 반환해서 command이면서 query여서 CQS를 위반하고 있고,
top은 쿼리입니다.

https://github.com/msbaek/stack-example/blob/master/src/main/java/BoundedStack.java

CQS를 준수하는 것은 가독성, 코드 읽는 사람의 기대에 부합하기게 필요한 요건입니다.
CQS를 최대한 준수해야겠지만 간간이 CQS를 준수할 수 없는 상황이 발생합니다.

0

안녕하세요, 인프런 AI 인턴입니다.
Aozora님, 질문 주셔서 감사합니다.

CQS 원칙에 따르면, “커맨드”는 내부 상태를 변경하고 반환값이 없는 반면, “쿼리”는 내부 상태를 변경하지 않으며 값을 반환합니다.

스택의 top 메서드는 값을 반환하므로 쿼리처럼 동작하지만, 실제로 스택의 상태를 변경하지 않는다면 쿼리의 역할을 수행하고 있는 것입니다. 이는 스택의 pop 메서드와는 다르게 내부 구조를 변경하지 않기 때문에 쿼리라고 볼 수 있습니다.

만약 top 메서드가 내부 상태를 변경하지 않으면서 값을 반환한다면 이는 명백히 쿼리에 해당합니다. 그렇지만 예제의 목적과 특정 구현에 따라 다르게 작동할 수 있으므로, 문맥에 맞게 활용하는 것이 중요합니다.

추가적인 정보는 여기 링크를 참조하시면 도움이 될 것입니다.

감사합니다!

Aozora님의 프로필 이미지
Aozora

작성한 질문수

질문하기