명령형 언어

  • 부수 효과를 기반으로 한다.
  • 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 내부로 이동시켜 부수 효과를 제어하는 방법을 고려해 보는 것이 좋다.

참고

+ 따끈한 최근 게시물