함수가 다른 함수에서 값을 얻는 것이 순수한 것으로 간주됩니까?


9

부작용없이 함수를 만들 때 기본 변수 값을 처리하는 방법을 찾으려고 노력하고 있으며 다음과 같이 끝났습니다.

function getDefaultSeparator() {
    return ':';
}

function process(input, separator) {
    var separator = separator || getDefaultSeparator();

    // Use separator in some logic

    return output;
}

기본 구분 기호는 다른 기능에서 사용되며 한 위치에서만 정의하고 싶습니다.

이것이 순수한 함수라면, 대신 전역 DEFAULT_SEPARATOR 상수를 사용하는 것과의 차이점은 무엇입니까?


5
나중에 로직을 추가하기 위해이 기능을 자리 표시 자로 사용하려는 경우를 제외하고는 실질적인 차이가 없습니다.
Robert Harvey

3
가능한 중복 함수 함수를 매개 변수로 사용하는 경우 함수가 즉시 불완전합니까? . 질문은 정확히 중복되지는 않지만 대답은 동일해야합니다. ( "다른 기능의 순도에 따라 다릅니다.")
jpmc26

1
전역 상수를 사용 한다고해서 함수가 불완전하지는 않습니다. 상수 라고 가정 하는 전역 값을 사용하면 됩니다.
chepner

Btw, 당신은 카레 process(역순으로 매개 변수)와 카레 기능을 전문화하는 것보다var processDefault = process(":")
bob

답변:


22

함수가 다른 함수에서 값을 얻는 것이 순수한 것으로 간주됩니까?

다른 함수의 기능과 호출 함수의 기능에 따라 다릅니다. 불순은 전염성이 있고 순도는 아닙니다.

순수한 함수를 호출해도 호출 함수의 순도는 바뀌지 않습니다. 불순 기능을 호출하면 자동으로 호출 기능도 불완전하게됩니다.

따라서 귀하의 예에서, 그것은 당신이 빠진 부분의 순도에 달려 있습니다 : 그것이 순수하다면, 전체 기능은 순수합니다.

이것이 순수한 함수라면, 대신 전역 DEFAULT_SEPARATOR 상수를 사용하는 것과의 차이점은 무엇입니까?

아무것도. 항상 같은 값을 반환하는 함수는 상수와 구별 할 수 없습니다. 실제로, 그것은 상수가 λ- 미적분학으로 모델링되는 방식입니다.


2
"불순 함수를 호출하면 자동으로 호출 함수도 불완전하게됩니다."확실합니까? 불순 함수를 호출하는 AFAICS는 호출자를 불완전하게 만들지 않지만 자동으로 불완전하게 만들지는 않습니다.
중복 제거기

2
@Deduplicator : 얼마나 많은 정적 분석을 수행 할 수 있는지에 따라 다릅니다. 물론, func0을 전달할 때 부작용이 있지만 1을 전달할 때 부작용이 없는 함수 가 있다면 , 그 func자체가 "불순" 하지만 이를 호출하는 함수 func(1)(및 반환 값을 무시하는 것)를 합리적으로 말할 수 있습니다. 말) 반드시 불완전한 것은 아닙니다. 호출 func은 호출자가 잠재적으로 불완전한 것으로 "오염"하기에 충분하지만, 오염 된 기능은 결국 순수한 것으로 입증 될 수 있습니다. 적어도 순수한 / 불순이 언어 내에 정의되어 있지 않은 자바 스크립트에서는 적어도.
Steve Jessop

6

예, 다음과 같은 이유로 순수한 기능입니다 (제거 된 부분도 순수하다고 가정).

  1. 결과는 매개 변수에만 의존합니다.
  2. 부작용이 없습니다.

경우 참고 getDefaultSeparator()순수한 기능이 아니었다, 다음 둘 것 process()순수하지 않습니다.

Javascript에서는 함수를 재정의하거나 상수 값을 변경하는 Javascript의 기능을 피할 수있는 한 순수 함수 또는 상수를 사용하는 것 사이에는 의미있는 차이가 없으며 순수 함수에서 둘 다 사용할 수 있습니다.

순수한 함수의 핵심 개념은 프로그램 결과에 영향을 미치지 않으면 서 반환되는 값으로 대체 될 수 있다는 것입니다.


1

다른 사람들이 말했듯이, 그것은 여전히 ​​순수한 기능입니다.

그러나 디자인 문제에 대해 이야기합시다. 한 번에 값을 입력하여 코드 DRY를 유지하기 위해 무언가를 시도하는 것이 옳습니다. 또한, 고려해야 할 것은 적절한 커플 링 수준입니다.

함수를 사용하면 구현을 변경할 수있는 유연성이 높아집니다. 즉, 함수 방식은 전역 변수보다 느슨한 결합을 제공합니다.

문제는 필요한지 아닌지입니다.

소비자와 공급자가 동일한 모듈에 있고 공급자가 모듈에 대해 개인 인 경우 공급자가 개인 변수에서 개인 변수로 업그레이드해야하는 경우이 수준의 느슨한 결합이 필요하다고 주장하기가 어렵습니다. 개인 방법을 사용하면 모듈 내에서 간단한 리팩토링을 소비자에게 동시에 적용 할 수 있습니다. 실제로 필요한 방법 / 기능을 사용하면 YAGNI에 해당 할 수 있습니다.

소비자와 공급자가 서로 다른 모듈에 있더라도 모듈의 버전이 함께 (예 : 소비자와 공급자의 모듈이 같은 파일에 있도록 축소기를 사용하는 경우) YAGNI도 적용될 수 있습니다.

반면에, 예를 들어 생산자가 소비자와 별도로 버전이 지정된 라이브러리 나 API 패키지 또는 모듈에있는 경우, 함수를 사용하는 것이 적절할 수 있습니다. 이 경우 API의 수명과 OCP와 같은 원칙을 살펴 봐야합니다.

(또 다른 참고로, 코드의 크기가 큰 경우 전역 변수 및 함수가 아닌 필드 및 메소드가있는 모듈을 사용하는 것이 좋습니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.