일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Linux
- SBT
- docker
- 제주
- Angular2
- Clean Code
- Spring
- Hbase
- spark
- scala
- elasticsearch
- 스프링 배치
- apache storm
- nginx
- hadoop
- Spring Batch
- Domain Driven Design
- Storm
- DDD
- hdfs
- Spring Boot
- design pattern
- hibernate
- 엘라스틱서치
- Spring XD
- Java
- 도메인주도설계
- intellij
- elastic search
- Gradle
- Today
- Total
욱'S 노트
CQS - Command Query Separation 본문
Command–query separation (CQS)는 컴퓨터 프로그래밍에서 반드시 지켜야 할 원칙이다. 이것은 Bertrand Meyerd의 Eiffel 프로그래밍 언어에서 고안되었다.
모든 메소드는 한번의 액션에서 상태를 변경하는 커맨드든 데이터를 반환하는 쿼리든 한가지 액션만 취해야 한다는 것이다. 다시 말하자면 질문을 할때 대답을 변경하지 말라는 것이다. 더 정확하게는 메소드는 값을 반환할 때 referentially transparent(시스템의 상태를 변경하지 않을 때 함수를 referentially transparent하다고 함)해야 하며 사이드 이펙트를 유발하지 말아야 한다.
여기 CQS 원칙을 위반한 단순한 예제이다. 그러나 멀티 스레드 소프트웨어에서 유용한 예이기도 하다. 살태를 변경하는 메소드와 그것을 리턴하는 내용이 함께 존재하므로 CQS 위반이다.
private int x;
public int increment_and_return_x()
{
lock x; // by some mechanism
x = x + 1;
int x_copy = x;
unlock x; // by some mechanism
return x_copy;
}
다음은 CQS를 따른 패턴이다. 하지만 싱글 스레드 어플리케이션에서만 사용할 수 있다. 멀티 스레드 프로그램에서는 콜러 race condition이 발생할 수 있다.
private int x;
public int value()
{
return x;
}
void increment()
{
x = x + 1;
}
마침내 스레드 세이프한 CQS 패턴이다.
private int x;
private int _x;
public int value()
{
return x;
}
void increment()
{
lock _x; // by some mechanism
_x = _x + 1;
x = _x;
unlock _x; // by some mechanism
}
출처 : Wikipedia
'Language > IT' 카테고리의 다른 글
Netcat (0) | 2016.02.17 |
---|---|
minimum granularity (0) | 2016.01.26 |
synchronization primitives (0) | 2015.03.12 |
race condition (0) | 2015.03.12 |
ACL (0) | 2015.03.11 |