이것을하는 용어가 있습니까 : func1 (func2 (), func3 ());


24

나는 그것이 obj.func1().func2()메쏘드 체인이라고 불리는 것을 알고 있지만, 기술적 용어는 다음과 같습니다.

func1(func2(), func3());

함수 반환이 다른 함수의 인수로 사용되는 경우


8
obj.func1().func2() is called method chaining-수정 : 열차 난파선이라고합니다.
얌 마르코비치

멤버 함수 obj.func1()가있는 객체를 항상 반환 한다고 확신하지 않는 한 매우 까다로운 소리 func2()입니다.
Shadur

8
@ 얌 케어 설명? 유창한 인터페이스에서 많은 이익을 얻기 위해 사용됩니다. 데메테르의 법칙을 언급하고 있습니까? 그렇다면 위의 패턴을 금지하지 않으며 LoD에 대한 좋은 사례가있는 경우에도 마찬가지입니다.
Konrad Rudolph

1
방법 체인은 구문 설탕이있는 선반에 놓여 있으며 소란을 피울 필요가 없습니다.
코스

1
@ PauliØsterø 스택 추적의 목적이라고 생각했습니다.
Chris C

답변:


38

나는 그것이 기능 구성이라고 생각하지 않습니다. 함수 구성은 f . g . h하스켈 에서와 같이 둘 이상의 함수를 가져 와서 새로운 함수로 바꾸는 것을 의미합니다 . 이 시점에서 함수가 호출되지 않습니다.

개인적으로 필자는 func1(func2(), func3())"중첩 함수 호출" 과 같은 구문을 참조 할 것 입니다.


+1, 내가 본 모든 프로그래밍 컨텍스트에서 "중첩 함수 호출"이라고합니다.
이즈 카타

1
+1,이 "기능 구성"이라고하는 것은 현혹 적으로 잘못되었습니다.
지안

+1. 모든 f(g())것은 f()첫 번째 인수에 대한 표현식 으로 호출 하는 것이므로 함수 호출 g()이 표현식으로 규정됩니다. 그러나 이름이 있어야한다면이 이름은 비슷합니다.
Blrfl

16

수학에서는 함수 구성 이라고 합니다 . 그래도 프로그래밍에 적용되는 용어를 들어 본 적이 없다고 생각합니다. 몇 가지 이유로 사용법을 크게 피하기 때문일 수 있습니다. 컴파일러가 func2 이전에 func3을 자유롭게 평가할 수 있기 때문에 함수에 부작용이있을 때 이상한 버그가 발생할 수 있습니다. 중단 점을 설정하거나 중간 결과를 인쇄 할 수 없기 때문에 디버그하기가 더 어려우며 대부분의 사람들은 읽기가 더 어렵습니다.


4
기능 프로그래밍의 구성이라고도합니다.

8
나는 그것이 "거의 피하는"것이라고 생각하지 않습니다. IMO printf("%d %d\n", strlen(a), strlen(b));중간 변수 대신 코드를 작성하는 것은 드문 일이 아닙니다 .
user281377

3
함수에 부작용이있을 때 이상한 버그에 대한 해결책은 이것을 피하는 것이 아니라 값을 생성하고 부작용을 갖는 함수를 작성하는 것을 피하는 것입니다. 마찬가지로 디버거와 관련하여 해결책은 디버거가 작동하도록 코드를 변경하지 않는 더 나은 디버거를 요청하는 것입니다.
R. Martinho Fernandes

7
func2 전에 컴파일러가 func3을 자유롭게 평가할 수 있는지 여부는 전적으로 사용되는 언어에 따라 다릅니다. 예를 들어 Java에서는 평가 순서가 엄격하게 지정됩니다. 실제로 이것이 대부분의 언어에 해당되는 것으로 의심됩니다.
Michael Borgwardt

2
수학에서 "함수 구성"이라는 용어는 실제로 단일 인수 함수에만 적용되며, 여기서 형식의 구조를 나타냅니다 func1(func2(func3(x))). 또는 기술적으로, 그것은을 의미 기능 하는 경우 : 스스로 g(x) = f1(f2(f3(x)))다음 g( 하지 g(x) )의 구성은 f1, f2하고 f3. "함수 구성"이라는 질문에서 구조를 호출 할 수있는 방법을 볼 수는 있지만 수학적인 의미에서이 용어를 매우 이례적으로 사용하는 것으로 나타났습니다.
David Z

2

@Karl Bielefeldt가 지적한 것처럼 수학에서 함수 구성이라고합니다.

프로그래밍에는이 용어에 대한 기술적 용어가 없습니다. 그리고 이것이 정상적이며 직교 한다는 것을 나타 내기 때문에 이것이 좋은 것이라고 생각합니다 .

프로그래밍 언어에서의 직교성은 문맥과 무관하게 명령어 / 연산을 사용할 수 있음을 의미합니다 . 예를 들어 다음과 같은 방법으로 함수 / 메소드를 호출 할 수 있습니다.

f1()(f2(), f3());

x = y + f4();

if ( f5() && !f6() ) doSomething();

f7() = f8() + f9(); // in C++ when a function returns a reference

x = f10() ? f11(f12(f13(x))) : f14();

당신은에 프로그래밍에 직교성에 대한 자세한 내용을보실 수 있습니다 위키 백과 , 그리고 거기에 질문에 유래에 이에.


직교성을 나타내지는 않지만 그에 따라 다릅니다.
Raffael

+1 당신은 단지 가치를 전달하고 있습니다. OP의 부름에는 마법이 없습니다
vemv

1

나는 정말 용어가 좋지는 않지만 며칠 전에 Higher order functions 이라는 용어를 읽은 기사를 읽었으며 Wikipedia 당 정의에 대한 개요가 있습니다.

http://en.wikipedia.org/wiki/Higher-order_function

수학 및 컴퓨터 과학에서 고차 함수, 함수 형태 또는 함수는 다음 중 하나 이상을 수행하는 함수입니다.

  • 하나 이상의 기능을 입력으로 사용
  • 함수를 출력하다

다른 모든 기능은 1 차 기능입니다. 수학에서 고차 함수는 연산자 또는 함수라고도합니다. 미적분학의 미분은 함수를 다른 함수에 매핑하기 때문에 일반적인 예입니다.

따라서이 시나리오에서는 적어도 하나의 기능을 입력 / 매개 변수로 사용하기 때문에 고차 함수로 간주됩니다.


1
아니요, 고차 함수를 호출하면 다음과 같습니다 func1(func2, func3). 괄호가없는 것을 주목하십시오.
fredoverflow 5

프레드 말이 되네요 하나는 함수의 주소이고 다른 하나는 그 함수의 실행 결과입니다. 지적 해 주셔서 감사합니다.
silverCORE
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.