명령-쿼리 분리

Command–query separation

명령-쿼리 분리(CQS)명령형 컴퓨터 프로그래밍의 원칙이다.이것은 베르트랑 마이어에펠 프로그래밍 언어에 대한 그의 선구적인 연구의 일환으로 고안한 것이다.

그것은 모든 방법이 동작을 수행하는 명령이거나, 데이터를 발신자에게 반환하는 쿼리가 되어야 하지만 둘 다가 아니라라고 명시하고 있다.즉, 질문을 해도 답이 바뀌지 않아야 한다.[1]보다 공식적으로 방법은 참조적으로 투명하여 부작용이 없는 경우에만 값을 반환해야 한다.

계약에 의한 설계와의 연결

명령-질문 분리는 특히 프로그램 설계가 소스코드에 내장된 주장으로 표현되는 계약(DbC) 방법론에 의한 설계에 잘 적합하며, 특정 임계시기의 프로그램 상태를 기술한다.DbC에서 주장은 프로그램 논리가 아닌 설계 주석으로 간주되며, 따라서 이들의 실행은 프로그램 상태에 영향을 미치지 않아야 한다.CQS는 프로그램 상태를 수정할 염려 없이 어떤 주장으로도 가치반환 방법(모든 질의)을 호출할 수 있기 때문에 DbC에 이롭다.

이론적 용어로, 이것은 프로그램의 상태를 동시에 수정하지 않고도 프로그램의 상태에 대해 추론할 수 있는 제정신의 척도를 확립한다.실무적으로 CQS는 모든 어설션 점검을 작업 시스템에서 우회하여 의도하지 않게 행동을 수정하지 않고 성능을 개선할 수 있도록 한다.CQS는 또한 특정한 종류의 하이젠버그의 발생을 막을 수도 있다.

소프트웨어 엔지니어링에 대한 광범위한 영향

계약에 의한 설계와의 연관성 외에도, CQS는 프로그램에 대한 단순화 효과를 가지고, (질의를 통해) 프로그램의 상태와 (명령어를 통해) 상태 변화를 더 이해할 수 있게 만드는 것으로 그것의 추종자들은 CQS를 고려한다.[citation needed]

CQS는 객체 지향 방법론에 잘 적합하지만 객체 지향 프로그래밍 이외의 영역에서도 적용할 수 있다.부작용과 수익률의 분리가 본질적으로 객체 지향적인 것이 아니기 때문에, CQS는 부작용에 대한 추론을 필요로 하는 어떤 프로그래밍 패러다임에 대해서도 수익적으로 적용할 수 있다.[citation needed]

명령 쿼리 책임 분리

명령 쿼리 책임 분리(CQRS)는 메시지 기반 및 이벤트 기반 아키텍처에 CQS를 일반화한다. CQS는 데이터 검색수정에 각각 별도의 쿼리 메시지명령 메시지를 사용하여 CQS 원칙을 적용한다.[2][3]

기타 건축 패턴

  • CRUD를 통해 상호 작용하는 단일 표현에서 벗어나면 작업 기반 UI로 쉽게 이동할 수 있다.
  • CQRS는 이벤트 기반 프로그래밍 모델과 잘 적합하다.CQRS 시스템이 Event Collaboration과 통신하는 별도의 서비스로 분할되는 것이 일반적이다.이를 통해 이러한 서비스들은 이벤트 기반 아키텍처를 쉽게 이용할 수 있다.
  • 별도의 모델을 갖는 것은 이러한 모델을 일관적으로 유지하는 것이 얼마나 어려운지에 대한 의문을 제기하며, 이는 궁극적인 일관성을 사용할 가능성을 높인다.
  • 많은 도메인의 경우 업데이트할 때 필요한 로직의 상당 부분이 필요하므로 쿼리측 모델을 단순화하기 위해 빠른 읽기 파생 기능을 사용하는 것이 타당할 수 있다.
  • 쓰기 모델이 모든 업데이트에 대한 이벤트를 생성하는 경우, 읽기 모델을 이벤트 포스터로 구성하여 메모리 이미지가 되도록 허용함으로써 많은 데이터베이스 상호작용을 방지할 수 있다.
  • CQRS는 도메인 기반 설계의 이점을 제공하는 복잡한 도메인에 적합하다.[3]

제한 사항

CQS는 reentrantmultithreaded 소프트웨어를 올바르게 구현하기 위한 복잡성을 도입할 수 있다.이는 일반적으로 명령-쿼리 분리를 구현하기 위해 비 스레드 안전 패턴을 사용할 때 발생한다.

다음은 CQS를 따르는 것이 아니라 프로그램의 다른 모든 부분에 대한 잠금의 복잡성을 해결하므로 다중 스레드 소프트웨어에 유용하지만, 그렇게 함으로써 기능이 상태를 모두 변이하고 반환하기 때문에 CQS를 따르지 않는 간단한 예가 있다.

사유의 인트로 x; 공중의 인트로 incrementAndReturnX() {     자물쇠를 채우다 x;   // 어떤 메커니즘에 의해     x = x + 1;     인트로 x_copy = x;     자물쇠를 열다 x; // 어떤 메커니즘에 의해     돌아오다 x_copy; } 

다음은 CQS 호환 버전이다.단일 스레드 애플리케이션에서만 안전하게 사용할 수 있다는 점에 유의하십시오.다중 스레드 프로그램에서, 발신자 사이에 경기 조건이 있다.increment()그리고value()다음과 같이 불릴 수 있다.

사유의 인트로 x; 공중의 인트로 가치를 매기다() {     돌아오다 x; } 공허하게 하다 증분하다() {     x = x + 1; } 

단일 스레드 프로그램에서도 질의와 명령어를 결합한 방법을 갖는 것이 논쟁의 여지가 없을 정도로 훨씬 더 편리할 때가 있다.마틴 파울러는 그 말을 인용했다.pop()스택[4]예시법

참고 항목

참조

  1. ^ Meyer, Bertrand. "Eiffel: a language for software engineering" (PDF). p. 22. Retrieved 16 December 2014.
  2. ^ Young, Greg. "CQRS Documents" (PDF). Retrieved 2012-12-28.
  3. ^ a b Fowler, Martin. "CQRS". Retrieved 2011-07-14.
  4. ^ Fowler, Martin. "CommandQuerySeparation". Retrieved 5 December 2005.

추가 읽기

외부 링크