Proste pytanie, ale często słyszę te trzy terminy zdefiniowane z taką zaciekłością, które z biegiem lat były dla mnie różne.
Jakie są „prawidłowe” definicje „procedur”, „metod”, „funkcji”, „podprogramów” itp.?
Proste pytanie, ale często słyszę te trzy terminy zdefiniowane z taką zaciekłością, które z biegiem lat były dla mnie różne.
Jakie są „prawidłowe” definicje „procedur”, „metod”, „funkcji”, „podprogramów” itp.?
Odpowiedzi:
Idę tutaj z inną odpowiedzią: praktycznie nie ma żadnej różnicy , z niewielkim wyjątkiem, że „metoda” zwykle odnosi się do podprogramu powiązanego z obiektem w językach OO.
Terminy „procedura, funkcja, podprogram, podprogram i metoda” naprawdę oznaczają to samo: podprogram, który można wywołać w większym programie. Ale trudno jest znaleźć definicję, która przechwytuje wszystkie warianty użycia tych terminów, ponieważ nie są one stosowane konsekwentnie we wszystkich językach programowania lub paradygmatach.
Można powiedzieć, że funkcja zwraca wartość. Cóż, następująca funkcja C nie zwraca wartości:
void f() { return; }
... ale wątpię, byś znalazł kogoś, kto nazwałby to procedurą.
Jasne, w Pascalu procedury nie zwracają wartości, a funkcje zwracają wartości, ale jest to jedynie odzwierciedlenie tego, jak zaprojektowano Pascala. W Fortranie funkcja zwraca wartość, a podprogram zwraca wiele wartości. Jednak tak naprawdę nic nie pozwala nam na opracowanie „uniwersalnej” definicji tych terminów.
W rzeczywistości termin „programowanie proceduralne” odnosi się do całej klasy języków, w tym C, Fortran i Pascal, z których tylko jeden faktycznie używa terminu „procedura”, aby cokolwiek znaczyć.
Więc nic z tego nie jest spójne. Jedynym wyjątkiem jest prawdopodobnie „metoda”, która wydaje się być stosowana prawie całkowicie w językach OO, odnosząc się do funkcji powiązanej z obiektem. Chociaż nawet to nie zawsze jest spójne. Na przykład C ++ zwykle używa terminu „funkcja członka” zamiast metody (nawet jeśli termin „metoda” wkradł się do języka C ++ wśród programistów).
Chodzi o to, że nic z tego nie jest naprawdę spójne. Po prostu odzwierciedla terminologię stosowaną przez wszystkie języki, które są w tym czasie modne.
Funkcja zwraca wartość, ale procedura nie.
Metoda jest podobna do funkcji, ale wewnętrznego części klasy. Termin metoda jest stosowany prawie wyłącznie w programowaniu obiektowym.
function
spełnia obie role w JS, ale wszystkie funkcje JS powracają. Jeśli instrukcja return nie ma wartości, wartość ta jest niejawna undefined
. Gdy instrukcja return jest nieobecna, interpreter dodaje niejawną instrukcję return. Może ezoteryczny, ale jest zgodny z podaną tutaj definicją. Dlatego var x = function() {}();
jest legalne w JS; gdyby nie zwroty niejawne, musiałby to być błąd, tak jak w Pascalu.
Funkcja jest coś, co zajmuje kilka wejść i zwraca jeden lub więcej wartości. Jeśli zwracane wartości są całkowicie określane przez dane wejściowe, a funkcja nie ma żadnych skutków ubocznych (być może rejestrowanie lub powodowanie zmian stanu poza sobą), wówczas jest to nazywane funkcją czystą.
Procedura jest funkcją, która nie zwraca wartości. W szczególności oznacza to, że procedura może powodować tylko skutki uboczne. (Może to obejmować mutację parametru wejściowego!)
Metoda jest funkcją, która zamyka się w zbiorze zmiennych, to jest zamknięcie . Pobiera zero lub więcej parametrów wejściowych, ma dostęp do tego zestawu zmiennych i zwraca zero lub więcej wartości. W językach OO metody te są dołączane do obiektów lub klas.
W większości popularnych języków programowania zmienne zamknięte nazywane są polami składowymi lub zmiennymi instancji obiektu. Metoda może być czystą funkcją, nieczystą funkcją lub procedurą.
Ta ostatnia definicja prowadzi do korespondencji obiekt = struktura + zamknięcia .
foo.doSomething()
nie jest bez parametrów. Ma jeden parametr (obiekt foo
) z danym cukrem składniowym. Zamknięcie byłoby w stanie odwoływać się do jego obiektu bez potrzeby posiadania takiego parametru. Nie oznacza to, że metody nie mogą być zamknięciami, po prostu większość z nich nie jest, a bycie OO nie wystarcza, aby język obsługiwał zamknięcia.
foo.doSomething()
zamyka foo
zmienną. Każde oświadczenie w doSomething
może uzyskać dostęp foo
za pośrednictwem this
lub self
, w zależności od języka. To jest właśnie definicja „blisko”. Klasy zamykają swoje zmienne składowe, dlatego (ignorując „co to jest OO”), OO jest wystarczające. Jest to dość dobrze znane w literaturze ...
foo.
z przodu foo.doSomething()
? To jest przekazanie doSomething()
parametru. To, że nie znajduje się pomiędzy nawiasami, nie oznacza, że nie jest to parametr. Metoda this
lub self
wewnątrz metody jest po prostu cukrem syntaktycznym służącym do odwoływania się do tego parametru.
Bruce ma dobrą odpowiedź . Dodałbym semantycznie:
printf
)A procedure should "do something" to the arguments
- lub wywołać inny efekt uboczny (np printf
.).
printf
zwraca wartość - liczbę wydrukowanych znaków - więc jest to technicznie funkcja.
printf
to wartość. Miał specyficzny efekt uboczny poza zakresem wywoływania: mianowicie we / wy niezależnie od standardowego wyjścia, jakie powinno być. Chociaż Scott nie wyraził tego rozróżnienia, w funkcyjnym programowaniu funkcje nie powinny mieć skutków ubocznych i powinny być w stanie odpowiadać na pytania, jakbyś miał rzeczywiste dane, które zwraca.
dobre szczegółowe odpowiedzi powyżej; opowiadanie jest takie, że wszystkie smaki podprogramów; znaczenie każdego terminu będzie się różnić w zależności od kontekstu języka programowania
generalnie funkcje zwracają wartość, ale nie muszą
metody to ogólne warunki OOP chwili obecnej
w SQL procedury składowane mają dane wyjściowe, ale zwykle zwracają tylko kod błędu, podczas gdy funkcje zdefiniowane przez użytkownika muszą zwracać wartość (która może być zestawem wyników)
ponownie, dokładna różnica między tymi warunkami zależy od tego, z kim rozmawiasz!
80% biegłości jest bezpośrednio związane ze znajomością nomenklatury,
95% wydajności to zdolność do zidentyfikowania tego, co jest obecnie przydatne, pomimo terminów użytych do jej opisania
Raczej wolę nazywać je wszystkimi metodami w języku c #, z wyjątkiem sytuacji, gdy użyłem MSSQL, mieliśmy sproc, ale oczywiście teraz używamy Postgres i są one nazywane funkcjami.