답변:
나는 여기서 다른 대답을 할 것입니다. 실제로 "방법"이 일반적으로 OO 언어의 객체와 관련된 서브 루틴을 언급 한다는 약간의 예외는 있지만 실제로 차이 는 없습니다 .
"프로 시저, 기능, 서브 루틴, 서브 프로그램 및 방법"이라는 용어는 모두 같은 것을 의미합니다 : 더 큰 프로그램 내에서 호출 가능한 서브 프로그램. 그러나 이러한 용어는 프로그래밍 언어 나 패러다임간에 일관되게 사용되지 않기 때문에 이러한 용어의 모든 변형 사용을 캡처하는 정의를 도출하기가 어렵습니다.
함수가 값을 반환한다고 말할 수 있습니다. 다음 C 함수는 값을 반환하지 않습니다.
void f() { return; }
...하지만 절차라고 부르는 사람을 찾지 못할 것입니다.
물론 파스칼에서 프로시 저는 값을 반환하지 않으며 함수는 값을 반환하지만 이는 파스칼의 설계 방식을 반영한 것입니다. 포트란에서 함수는 값을 반환하고 서브 루틴은 여러 값을 반환합니다. 그러나 이것들 중 어느 것도 우리가이 용어들에 대한 "유니버설"정의를 내놓을 수는 없습니다.
실제로 "절차 프로그래밍"이라는 용어는 C, 포트란 및 파스칼을 포함한 전체 언어 클래스를 의미하며 실제로는 "절차"라는 용어 만 사용합니다.
따라서 이것 중 어느 것도 실제로 일관되지 않습니다. 유일한 예외는 아마도 "방법"인데, 이것은 거의 전적으로 OO 언어와 함께 사용되며 객체와 관련된 기능을 나타냅니다. 그럼에도 불구하고 이것이 항상 일치하는 것은 아닙니다. 예를 들어, C ++는 일반적으로 메소드 대신 "멤버 함수"라는 용어를 사용합니다 ( "메소드"라는 용어가 프로그래머들 사이에서 C ++ 언어로 변형 되었음에도 불구하고).
요점은 이것 중 어느 것도 실제로 일관성이 없다는 것입니다. 그것은 당시에 어떤 언어가 사용 되든지간에 사용 된 용어를 단순히 반영합니다.
함수는 값을 반환하지만, 절차는 하지 않습니다.
방법은 기능과 유사하지만, 인 내부 클래스의 부분. method 라는 용어 는 거의 대부분 객체 지향 프로그래밍에서 사용됩니다.
function
JS에서 두 역할을 모두 수행 한다는 것은 확실 하지만 JS 함수는 모두 반환합니다. return 문에 값이 없으면 값은 암시 적으로 undefined
입니다. return 문이 없으면 인터프리터는 암시적인 return 문을 추가합니다. 비의가 있을지 모르지만 여기에 주어진 정의와 일치합니다. 이것이 var x = function() {}();
JS에서 합법적 인 이유 입니다. 암시 적 반환이 아닌 경우 파스칼에서와 같이 오류가되어야합니다.
기능은 입력의 무리를 소요하고 하나 개 이상의 값을 반환하는 무언가이다. 반환 된 값이 입력에 의해 완전히 결정되고 함수에 부작용이없는 경우 (아마도 외부에서 상태 변경을 로깅 또는 발생시키는 경우)이를 순수 함수라고합니다.
절차는 값을 반환하지 않는 기능입니다. 특히 이것은 절차가 부작용을 일으킬 수 있음을 의미합니다. (입력 매개 변수를 변경하는 것도 포함될 수 있습니다!)
있어서 , A는 변수 세트에 걸쳐 폐쇄하는 기능이다 클로져 . 0 개 이상의 입력 매개 변수를 사용하고이 변수 세트에 액세스하며 0 개 이상의 값을 리턴합니다. OO 언어에서 이러한 메소드는 객체 또는 클래스에 연결됩니다.
대부분의 주류 OO 언어에서 이러한 폐쇄 변수를 객체의 멤버 필드 또는 인스턴스 변수라고합니다. 방법은 순수한 기능, 불순한 기능 또는 절차 일 수 있습니다.
후자의 정의는 객체 = 구조체 + 클로저 대응으로 이어진다 .
foo.doSomething()
매개 변수가 없습니다. 그것은 foo
구문 설탕과 함께 하나의 매개 변수 (object )를 가지고 있습니다. 클로저는 그러한 매개 변수가 없어도 객체를 참조 할 수 있습니다. 즉 , 메서드 는 클로저가 될 수 없으며 대부분이 아니고 언어가 클로저를 지원하기에 충분하지 않다는 것입니다.
foo.doSomething()
foo
변수를 닫습니다 . 어떤에서 문 doSomething
캔 접속 foo
을 통해 this
또는 self
언어에 따라. 이것은 "클로즈 오버"의 정의입니다. 클래스는 멤버 변수에 가깝게 닫히므로 ( "OO 란 무엇인가"무시) OO면 충분합니다. 이것은 문헌에서 꽤 잘 알려져 있습니다.
foo.
앞의 작은 부분을 보 foo.doSomething()
시겠습니까? 그것은 당신 doSomething()
이 매개 변수 를 전달 하는 것입니다. 괄호 사이에 있지 않다고해서 매개 변수가 아니라는 의미는 아닙니다. this
또는 self
메소드 내에서 해당 매개 변수를 참조하기위한 단순히 문법 설탕입니다.
브루스는 좋은 대답이 있습니다. 의미 적으로 추가합니다.
printf
)A procedure should "do something" to the arguments
-또는 다른 부작용을 유발합니다 (예 :) printf
.
printf
값 (인쇄 된 문자 수) 을 반환하므로 기술적으로 함수입니다.
printf
가치 라는 것에 동의하지 않습니다 . 그것은 호출 범위 밖에서 특정한 부작용을 가졌습니다. 즉 표준 출력이 무엇이든 I / O입니다. 그럼에도 불구하고 Scott은 이러한 차이점을 명시 적으로 밝히지 않았지만 함수형 프로그래밍 함수에서는 부작용이 없어야하며 실제 반환되는 데이터가있는 것처럼 질문에 대답 할 수 있어야합니다.
숙련도의 80 %는 명명법에 대한 친숙 함과 직접 관련이 있습니다.
생산성의 95 %는 설명에 사용 된 용어에도 불구하고 현재 유용한 기능을 식별하는 능력입니다.
MSSQL을 사용할 때 sproc이 있었지만 c #에서 모든 메소드를 호출하는 것을 선호하지만 물론 Postgres를 사용하며 함수라고합니다.