문맥에 따라 크게 달라집니다.
기본적으로 함수가 bar
의 인수 인 경우 호출자는 해당 함수를 구현하는 방법을 알고 있어야합니다. bar
은 신경 쓸 필요가 없습니다. 그러나 결과적으로 bar
의 설명서에는 어떤 기능이 종류에 해당하는지 설명해야합니다.
종종 매우 적절합니다. 분명한 예로는 map
내장 기능입니다. map
은 목록의 각 항목에 함수를 적용하고 결과 목록을 돌려주는 논리를 구현합니다. map
자체는 항목이 무엇인지, 또는 함수가 무엇을하는지에 대해 알지도 모릅니다. map
의 설명서에는 하나의 인수 기능이 필요하다는 것을 설명해야하고 map
의 각 호출자는 적절한 기능을 구현하거나 찾는 방법을 알아야합니다. 그러나이 협정은 훌륭합니다. 그것은 당신이 당신의 커스텀 오브젝트들과 그 오브젝트들에 대해 특별히 작동하는 함수의리스트를 전달할 수있게 해주고, map
은 없어져서 일반적인 일을 할 수 있습니다.
그러나 종종이 배열은 부적절합니다. 함수는 상위 수준의 작업에 이름을 지정하고 내부 구현 세부 정보를 숨기므로 작업을 하나의 단위로 생각할 수 있습니다. 함수 매개 변수로 외부에서 조작의 일부를 전달할 수 있도록 허용하려면 해당 함수의 인터페이스를 사용하는 방식으로 작동해야합니다.
좀 더 구체적인 (다소 인위적이지만) 예제가 도움이 될 수 있습니다. 내가 Person
및 Job
을 나타내는 데이터 유형을 구현했다고 가정하고 전자 메일 서명이나 레터 헤드 등에 삽입 할 클라이언트 코드 용으로 전체 이름과 직책을 문자열로 서식 지정하기위한 함수 name_and_title
을 작성했습니다. 분명히 Person
및 Job
을 가져갈 것입니다. 호출자가 사람의 이름을 형식화하는 방법을 결정할 수 있도록 함수 매개 변수를 취할 수 있습니다 (예 : lambda firstname, lastname: lastname + ', ' + firstname
). 하지만 이렇게하려면 내가 다른 사람들의 이름과 성으로 사람들의 이름을 대표하고 있음을 드러내는 것입니다.중간 이름 지원으로 변경하려면 name_and_title
중 중간 이름을 포함 할 수 없거나 허용되는 함수의 유형을 변경해야합니다. 어떤 사람들이 4 개 이상의 이름을 가지고 있고 이름 목록을 저장하는 것으로 변경하기로 결정한 후에는 확실히 함수 유형을 변경해야합니다. name_and_title
수락합니다.
예를 들어 bar
예를 들어, 의미가없는 추상 예이기 때문에 어떤 것이 더 좋다고 말할 수는 없습니다. partialfun
에 대한 호출이 bar
이 수행해야하는 구현 세부 사항인지 또는 partialfun
에 대한 호출이 호출자가 알고있는 것 (다른 작업을 수행하려고 할 수 있음)인지 여부에 따라 다릅니다. 'bar
'의 일부인 경우 매개 변수가 아니어야합니다. 호출자의 "일부"인 경우 매개 변수 여야합니다.
bar
은 거대한 개의 함수 매개 변수 수를 가질 수 있습니다. 당신은 bar
보다 유연하게 모두 매개 변수화 할 수 sum
, map
및 operator.mul
를 호출 :
def bar(fn, xs,ys, g, h, i):
return fn(g(h(i,xs,ys))
그리고 g
이 h
의 출력에 호출되는 방식을 너무 추상화 될 수있다 :
def bar(fn, xs, ys, g, h, i, j):
return fn(j(g, h(i, xs, ys)))
우리는 계속해서 bar
이 아무것도하지 않고 모든 것이 전달 된 함수에 의해 제어되며 호출자는 100 가지 재미를 쓰기보다는 원하는 것을 직접 할 수도 있습니다. 기능을 수행하기 위해 그것을 수행하고이를 bar
에 전달하십시오.
그래서 항상 확실한 답을 얻지 못하는 경우가 있습니다. 그것은 당신이 쓰고있는 특정 코드에 달려 있습니다.
의존성 주입에 대한 링크에 감사드립니다. 그것은 분명히 몇 가지를 명확히했습니다 (내가 묻고 있다는 것을 깨닫지 못했던 것) – beoliver