프로그래밍에서의 Purity란, 입력이 같을 시 출력이 항상 같은 것을 말한다.
따라서, 변경을 야기하지도, 변경에 영향을 받지도 않는다.
순수함은 몇 가지 좋은 점을 가져다 준다.
1 . 순수함은 훌륭한 모듈화를 내포하고 있다.
하나의 결과를 내기 위해 필요한 모든 것이 함수 안에 결속되어있어서
외부의 영향에 흔들리지 않음
좋은 모듈을 만드는 것은 어렵지만, 순수함을 구현하면 좋은 모듈화는 자연스레 따라온다.
2 . 순수함은 테스트하기 쉽게 해준다.
3 . 순수함은 구성하기 쉽다.
사이드 이펙트도 없으며, 외부를 의존하거나 영향을 주지 않기 때문에
순수함끼리 모아서 더 크고 복잡한 함수를 만들어도, 똑같이 순수함을 가질 수 있다.
4 . 순수함은 성능 향상에도 도움을 줄 것이다.
멀티 쓰레드 시스템에서, 두 개의 쓰레드가 같은 메모리에 접근하려고 하면
충돌이 일어 날 수 있고, 이런 에러는 진단하기도 매우 어렵다.
순수함은 아무것도 변경하지 않기 때문에 메모리를 공유한다 해도 문제가 없다.
이렇게 좋은 점이 많다면, 언어에 순수함을 추가할 수 있을까?
없다
언어에 보안성을 추가할 수 없듯이, 순수함도 마찬가지다.
그렇다면 어떻게 순수해질 수 있을까?
보안성을 갖추고 싶을 때, 취약점을 제거하듯이
순수하지 않은 것들을 제거하면 된다.
자바스크립트에 순수하지 않은 것
var
, let
할당자delete
와 같은 operatorObject.assgin
, splice
, sort
와 같은 메소드getter
와 setter
(이건 어떻게 없애지?)for
, while
와 같은 반복문 (tail recursion을 쓰자!)Date
, Math.random
(왜 이리 빡세지...?)
우주 전체가 순수하지 않듯이, 함수형 프로그래밍 모델도 모든게 순수할 순 없다.
순수함을 가질 수 없는 부분을 다 없애기보단, 분리를 통해 제대로 관리하고,
객체의 state 또한 변경 가능하나, 제대로 타이트하게 관리해야 함
또한, 순수함이 딱 순수함, 안 순수함처럼 이분적으로 나뉘면 좋겠지만,
함수가 딱 그렇게 되지가 않는다.