명령형 언어
- 부수 효과를 기반으로 한다.
- f(x) = y이고 f(x) = z라고 해도 y와 z가 같지 않을 수 있다.
함수형 언어
- 부수 효과를 금지한다.
- f(x) = y이고 f(x) = z일 때 항상 y와 z가 동일하다.
참조 투명성
- 어떤 표현식 e가 있을 때, e의 값을 바꾸지 않고 다른 표현식으로 대체할 수 있음을 의미한다.
- 참조 투명성이 유지되지 않는 경우 함수의 결과는 함수의 호출 순서에 의존한다.
부수 효과
- 프로그램의 버그를 발생시키는 온상이다.
- 부수 효과를 제거하고 참조 투명성을 유지함으로써 프로그램의 수행 결과를 예측 가능한 상태로 유지할 수 있다.
- 부수 효과를 가진 프로그램은 함수 호출 순서에 따라 다른 결과를 얻게 되므로 프로그래밍 동안 함수 호출 순서에 주의를 기울여야 한다.
- 부수 효과의 존재 유무를 판단하기 위해서는 추상화 뿐만 아니라 구현 세부 사항까지 인지하고 있어야 한다.
Command-Query Separation 원리의 기본 개념
- "질문이 답변을 수정해서는 안 된다"는 의미
- 부수 효과의 발생 여부에 따라 객체의 메소드를 Command와 Query로 분리하자.
- Command: 상태를 변경 O, 객체의 상태를 반환 X
- Query: 상태를 변경 X, 객체의 상태를 반환 O
Command-Query Separation 장점
- 명령형 언어의 틀 안에서 함수형 언어의 장점을 제한적이나마 누릴 수 있게 된다.
- 버그를 줄일 수 있다.
- 디버깅이 용이하다.
- Query의 순서에 따라 실행 결과가 변하지 않는다.
추상적인 부수 효과
- 외부에서 인식 가능한 부수 효과
- Command-Query Separation 에서 부수 효과의 범위는 추상적인 부수 효과 만으로 제한된다.
- Command에서 객체의 내부 상태를 변경하더라도 변경 내용이 클라이언트에게 노출되지 않는다면 추상적인 부수 효과라고 볼 수 없다.
Command-Query Separation 원리에 따라 Command와 Query를 분리했다면 복잡한 변경 로직을 VALUE OBJECT 내부로 이동시켜 부수 효과를 제어하는 방법을 고려해 보는 것이 좋다.
참고
- http://aeternum.egloos.com/m/1125381 Command-Query Separation(CQS) 원리
'Java' 카테고리의 다른 글
[자바 성능 튜닝 이야기] java 성능 튜닝의 기본 (0) | 2020.09.03 |
---|---|
정보 은닉과 데이터 캡슐화는 동일한 개념이 아니다 (0) | 2020.05.06 |
일급 컬렉션의 장점 (0) | 2020.03.26 |
[이펙티브 자바] 3장 모든 객체의 공통 메서드 (0) | 2020.03.10 |
[이펙티브 자바] 2장 객체 생성과 파괴 (0) | 2020.03.06 |