장점은 순수한 함수로 코드를 쉽게 추론 할 수 있다는 것입니다. 즉, 부작용으로 인해 코드의 복잡성이 증가합니다.
computeProductPrice
방법 의 예를 들어보십시오 .
순수한 방법은 제품 수량, 통화 등을 요구할 것입니다. 동일한 인수로 메소드가 호출 될 때마다 항상 동일한 결과를 생성 한다는 것을 알고 있습니다.
- 캐시하고 캐시 된 버전을 사용할 수도 있습니다.
- 값이 변경되지 않는다는 것을 알고 실제로 필요할 때 호출을 지연시키고 호출을 연기 할 수 있습니다.
- 부작용이 없음을 알고 메소드를 여러 번 호출 할 수 있습니다.
- 필요한 모든 것이 인수라는 것을 알면 메소드 자체를 세상과 분리하여 추론 할 수 있습니다.
순수하지 않은 방법은 사용 및 디버그가 더 복잡합니다. 인수 이외의 변수 상태에 따라 변경 될 수 있으므로 여러 번 호출 할 때 다른 결과를 생성하거나 전혀 호출하지 않거나 너무 빨리 또는 너무 늦게 호출 될 때 동일한 동작을하지 않을 수 있음을 의미합니다.
예
프레임 워크에 숫자를 구문 분석하는 방법이 있다고 상상해보십시오.
decimal math.parse(string t)
다음에 의존하기 때문에 참조 투명성이 없습니다.
번호 매기기 시스템, 즉 Base 10 등을 지정하는 환경 변수입니다.
math
구문 분석 할 숫자의 정밀도를 지정 하는 라이브러리 내의 변수 입니다. 따라서 값을 사용 1
하면 문자열 "12.3456"
을 구문 분석하면 됩니다 12.3
.
예상되는 형식을 정의하는 문화권. 예를 들어,와 fr-FR
, 구문 분석 "12.345"
줄 것이다 12345
분리 문자가해야하기 때문에 ,
,하지.
그러한 방법으로 작업하는 것이 얼마나 쉬운 지 상상해보십시오. 동일한 입력을 사용하면 메서드를 호출하는 순간에 따라 환경 변수가 변경되거나 문화권이 바뀌거나 다른 정밀도가 설정되므로 결과가 크게 달라질 수 있습니다. 이 방법의 비 결정적 특성은 더 많은 버그와 더 많은 악몽을 초래할 것입니다. 일부 병렬 코드가 8 진수를 구문 분석했기 때문에 전화를 걸고 답변을 math.parse("12345")
얻는 5349
것은 좋지 않습니다.
이 깨진 방법을 고치는 방법? 참조 투명성을 도입함으로써. 다시 말해, 전역 상태를 제거하고 모든 것을 메소드의 매개 변수로 옮김으로써 :
decimal math.parse(string t, base=10, precision=20, culture=cultures.en_us)
이제 메소드가 순수하므로 메소드를 호출 할 때마다 동일한 인수에 대해 항상 동일한 결과를 생성한다는 것을 알고 있습니다.