Mówiąc ogólnie, wszyscy słyszymy o funkcjach lub procedurach w językach programowania. Jednak właśnie dowiedziałem się, że używam tych terminów prawie zamiennie (co prawdopodobnie jest bardzo błędne).
Moje pytanie brzmi:
Jaka jest różnica pod względem funkcjonalności, przeznaczenia i zastosowania?
Przykład byłby mile widziany.
(define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0))
.Odpowiedzi:
Funkcja zwraca wartość, a procedura po prostu wykonuje polecenia.
Funkcja imienia pochodzi od matematyki. Służy do obliczania wartości na podstawie danych wejściowych.
Procedura to zestaw poleceń, które można wykonać w kolejności.
W większości języków programowania nawet funkcje mogą mieć zestaw poleceń. Dlatego różnica polega tylko na zwracaniu części wartości.
Ale jeśli chcesz utrzymać funkcję w czystości (wystarczy spojrzeć na języki funkcjonalne), musisz upewnić się, że funkcja nie ma skutków ubocznych.
źródło
To zależy od kontekstu.
W językach podobnych do Pascala funkcje i procedury są odrębnymi jednostkami, różniącymi się tym, czy zwracają wartość, czy nie. Zachowują się inaczej. składnia języka (np. wywołania procedur tworzą instrukcje; nie można użyć wywołania procedury wewnątrz wyrażenia, a wywołania funkcji nie tworzą instrukcji, należy ich używać w innych instrukcjach). Dlatego programiści z Pascal rozróżniają te.
W językach podobnych do C i wielu innych współczesnych językach to rozróżnienie zniknęło; w językach o typie statycznym procedury są tylko funkcjami o zabawnym typie zwrotu. Prawdopodobnie dlatego są używane zamiennie.
W językach funkcjonalnych zwykle nie ma czegoś takiego jak procedura - wszystko jest funkcją.
źródło
Przykład w C:
Chociaż należy zauważyć, że Standard C nie mówi o procedurach, tylko działa.
źródło
void function
. Kernighan & Ritchie Ch 1.7: „W C funkcja jest równoważna podprogramowi lub funkcji w Fortran lub procedurze lub funkcji w Pascal.” Innymi słowy ... ta odpowiedź jest błędna.Ogólnie procedura jest sekwencją instrukcji.
Funkcja może być taka sama, ale zwykle zwraca wynik.
źródło
Istnieje termin podprogram lub podprogram, który oznacza sparametryzowany fragment kodu, który można wywołać z różnych miejsc.
Funkcje i procedury są ich implementacjami. Zwykle funkcje zwracają wartości, a procedury nic nie zwracają.
źródło
Podstawowe różnice
Zaawansowane różnice
W SQL:
SELECT
również jako DML (INSERT
,UPDATE
,DELETE
) sprawozdania w nim, podczas gdy funkcja pozwala jedynieSELECT
oświadczenie w nim.SELECT
instrukcji, podczas gdy Funkcje mogą być osadzone wSELECT
instrukcji.WHERE
(lub aHAVING
lub aSELECT
), podczas gdy Funkcje mogą.JOIN
bloku z innymi tabelami.JOIN
wbudowane mogą być traktowane jako widoki, które przyjmują parametry i mogą być używane w blokach i innych operacjach zestawu wierszy.źródło
Ściśle mówiąc, funkcja f jest zgodna z właściwością, że f (x) = f (y), jeśli x = y, tzn. Oblicza ten sam wynik za każdym razem, gdy jest wywoływana z tym samym argumentem (a zatem nie zmienia stanu system.)
Zatem rand () lub print („Hello”) itp. Nie są funkcjami, lecz procedurami. Chociaż sqrt (2.0) powinien być funkcją: nie ma zauważalnego efektu ani zmiany stanu bez względu na to, jak często się go wywołuje i zwraca zawsze 1,41 i niektóre.
źródło
Jeśli jesteśmy tutaj niezależni od języka, procedura zwykle określa szereg działań wymaganych do rzetelnego i idempotentnego osiągnięcia określonego wyniku. Oznacza to, że procedura jest w zasadzie algorytmem.
Z drugiej strony funkcje to nieco niezależny fragment kodu w większym programie. Innymi słowy, funkcja jest implementacją procedury.
źródło
To dobrze znane stare pytanie, ale chciałbym podzielić się nieco więcej spostrzeżeniami na temat badań i projektowania współczesnego języka programowania.
Podstawowa odpowiedź
Tradycyjnie (w sensie programowania strukturalnego ) i nieformalnie procedura jest konstrukcją strukturalną wielokrotnego użytku, która ma „dane wejściowe” i umożliwia programowanie. Gdy trzeba coś zrobić w ramach procedury, możesz podać (rzeczywiste) argumenty do procedury w wywołaniu procedury zakodowanym w kodzie źródłowym (zwykle w rodzaju wyrażenia), a także działania zakodowane w treści procedury (pod warunkiem w definicji procedury) zostanie wykonana z podaniem argumentów na (formalne) parametry użyte w treści.
Funkcja jest większa niż procedura ponieważ wartości powrotne może być określony jako „Wyjście” w organizmie. Wywołania funkcji są mniej więcej takie same jak wywołania procedur, z tym wyjątkiem, że można również użyć wyniku wywołania funkcji, składniowo (zwykle jako podwyrażenie jakiegoś innego wyrażenia).
Tradycyjnie, wywołania procedur (a nie wywołania funkcji) są używane do wskazania, że żadne wyjście nie musi być zainteresowane, i muszą istnieć skutki uboczne, aby uniknąć wywołania braku operacji, dlatego podkreślono paradygmat programowania imperatywnego . Wiele tradycyjnych języków programowania, takich jak Pascal, zapewnia zarówno „procedury”, jak i „funkcje” w celu rozróżnienia zamierzonej różnicy stylów.
(Żeby było jasne, wspomniane powyżej „dane wejściowe” i „dane wyjściowe” są uproszczonymi pojęciami opartymi na właściwościach składniowych funkcji. Wiele języków dodatkowo obsługuje przekazywanie argumentów do parametrów przez odniesienie / udostępnianie, aby umożliwić użytkownikom przesyłanie informacji zakodowanych w argumentach podczas wywołań Taki parametr można nawet nazwać po prostu „parametrem wejścia / wyjścia”. Ta funkcja opiera się na naturze obiektów przekazywanych w wywołaniach, która jest ortogonalna względem właściwości funkcji procedury / funkcji.)
Jeśli jednak wynik wywołania funkcji nie jest potrzebny, można go (przynajmniej logicznie) zignorować, a definicje funkcji / wywołania funkcji powinny być spójne z definicjami procedur / wywołaniami procedur w ten sposób. Języki podobne do ALGOL, takie jak C, C ++ i Java, wszystkie zapewniają w ten sposób funkcję „funkcji”: kodując typ wyniku
void
jako specjalny przypadek funkcji wyglądających jak tradycyjne procedury, nie ma potrzeby zapewniania funkcji „procedur” „osobno. Zapobiega to wzdęciom w projektowaniu języka.Ponieważ wspomniano o SICP, warto również zauważyć, że w języku schematu określonym przez R n RS procedura może, ale nie musi, zwracać wynik obliczeń. Jest to połączenie tradycyjnej „funkcji” (zwracanie wyniku) i „procedury” (nic nie zwracającej), zasadniczo identycznej z koncepcją „funkcji” wielu języków podobnych do ALGOL (i faktycznie udostępniających jeszcze więcej gwarancji, takich jak oceny aplikacyjne operandy przed wywołaniem). Jednak różnice w starym stylu wciąż występują nawet w dokumentach normatywnych, takich jak SRFI-96 .
Nie wiem zbyt wiele o dokładnych przyczynach rozbieżności, ale jak się przekonałem, wydaje się, że projektanci języków będą teraz szczęśliwsi bez rozdęcia specyfikacji. Oznacza to, że „procedura” jako samodzielna funkcja nie jest konieczna. Techniki takie jak
void
typ są już wystarczające, aby zaznaczyć zastosowanie, w którym należy podkreślić działania niepożądane. Jest to również bardziej naturalne dla użytkowników mających doświadczenie w językach podobnych do C, które są popularne od kilku dekad. Ponadto pozwala uniknąć zawstydzenia w przypadkach takich jak R n RS, gdzie „procedury” są w rzeczywistości „funkcjami” w szerszym znaczeniu.Teoretycznie funkcję można określić za pomocą określonego typu jednostki jako typu wyniku wywołania funkcji, aby wskazać, że wynik jest szczególny. To odróżnia tradycyjne procedury (w których wynik połączenia jest niezainteresowany) od innych. Istnieją różne style projektowania języka:
#inert
) również działa.void
Typu w językach ALGOL-podobnych jest dokładnie przykładem tej techniki. ISO C11_Noreturn
jest podobny, ale bardziej subtelny w tym rodzaju.Dalsza lektura
Jako tradycyjna koncepcja wywodząca się z matematyki, istnieje mnóstwo czarnej magii, której większość ludzi nie zawraca sobie głowy. Ściśle mówiąc, najprawdopodobniej nie wszystko wyjaśnisz zgodnie z książkami matematycznymi. Książki CS również mogą nie zapewniać dużej pomocy.
Jeśli chodzi o języki programowania, istnieje kilka zastrzeżeń:
{{{}}, {}}
…) poza pewnymi ograniczonymi kontekstami .źródło
W większości kontekstów: funkcja zwraca wartość, podczas gdy procedura nie. Oba są zgrupowanymi fragmentami kodu, aby zrobić to samo.
W kontekście programowania funkcjonalnego (gdzie wszystkie funkcje zwracają wartości) funkcja jest obiektem abstrakcyjnym:
Tutaj f jest taką samą funkcją jak g, ale jest inną procedurą.
źródło
Wewnątrz procedury możemy używać instrukcji DML (Wstaw / Aktualizuj / Usuń), ale w funkcji Inside nie możemy używać instrukcji DML.
Procedura może mieć oba parametry wejściowe \ wyjściowe, ale funkcja może mieć tylko parametr wejściowy.
Możemy użyć bloku Try-Catch w procedurze przechowywanej, ale w funkcji Nie możemy użyć bloku Try-Catch.
Nie możemy użyć procedury składowanej w instrukcji Select, ale w funkcji Możemy użyć instrukcji Select.
Procedura składowana może zwrócić 0 lub n wartości (maks. 1024), ale funkcja może zwrócić tylko 1 wartość, która jest obowiązkowa.
Procedura przechowywana nie może być wywołana z funkcji, ale możemy wywołać funkcję z procedury składowanej.
Możemy użyć transakcji w procedurze składowanej, ale w funkcji nie możemy użyć transakcji.
Nie możemy używać procedury składowanej w instrukcji Sql nigdzie w sekcji Where / Posing / select, ale w funkcji, której możemy użyć.
Nie możemy dołączyć do procedury składowanej, ale możemy dołączyć do funkcji.
aby uzyskać więcej .. kliknij tutaj ... http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html
źródło
Funkcja zwraca wartość, a procedura po prostu wykonuje polecenia.
Funkcja imienia pochodzi od matematyki. Służy do obliczania wartości na podstawie danych wejściowych.
Procedura to zestaw poleceń, które można wykonać w kolejności.
W większości języków programowania nawet funkcje mogą mieć zestaw poleceń. Dlatego różnica polega tylko na zwracaniu części wartości.
Ale jeśli chcesz utrzymać funkcję w czystości (wystarczy spojrzeć na języki funkcjonalne), musisz upewnić się, że funkcja nie ma skutków ubocznych.
źródło
Funkcji można używać w instrukcji sql, podczas gdy procedury nie można używać w instrukcji sql.
Instrukcje Wstaw, Aktualizuj i Utwórz nie mogą być włączone do funkcji, ale procedura może zawierać te instrukcje.
Procedura obsługuje transakcje, ale funkcje nie obsługują transakcji.
Funkcja musi zwrócić jedną i tylko jedną wartość (inna może zostać zwrócona przez zmienną OUT), ale procedura zwraca tyle zestawów danych i zwracanych wartości.
Plany wykonania funkcji i procedur są buforowane, więc wydajność jest taka sama w obu przypadkach.
źródło
Sprzeciwiam się czemuś, co ciągle widzę w większości tych odpowiedzi, że funkcja powoduje, że funkcja zwraca wartość.
Funkcja to nie tylko stara metoda, która zwraca wartość. Nie tak: aby metoda była funkcją rzeczywistą, musi zwracać tę samą wartość, zawsze podając określone dane wejściowe. Przykładem metody, która nie jest funkcją, jest
random
metoda w większości języków, ponieważ chociaż zwraca wartość, nie zawsze jest taka sama.Funkcja jest zatem bardziej zbliżona do mapy (np. Gdzie
x -> x'
dla funkcji jednowymiarowej). Jest to bardzo ważne rozróżnienie między zwykłymi metodami i funkcjami, ponieważ w przypadku funkcji rzeczywistych czas i kolejność ich oceny nie powinny mieć znaczenia, ponieważ nie zawsze tak jest w przypadku funkcji niefunkcjonalnych.Oto kolejny przykład metody, która nie jest funkcją, ale w przeciwnym razie nadal zwróci wartość.
Dalej sprzeciwiam się twierdzeniu, że procedury nie zwracają wartości. Procedura jest tylko specyficznym sposobem mówienia o funkcji lub metodzie. Oznacza to, że jeśli metoda podstawowa, którą twoja procedura definiuje lub implementuje, zwraca wartość, to zgadnij, co ta procedura zwraca wartość. Weźmy na przykład następujący fragment kodu SICP :
Czy ostatnio słyszałeś o procedurach rekurencyjnych? Mówią o funkcji rekurencyjnej (funkcji rzeczywistej), która zwraca wartość i używają słowa „procedura”. Więc jaka jest różnica?
Cóż, innym sposobem myślenia o funkcji (oprócz znaczenia wspomnianego powyżej) jest abstrakcyjne przedstawienie ideału takiego jak cyfra 1. Procedura polega na tym, że rzeczywista implementacja tej rzeczy. Osobiście uważam, że są one wymienne.
(Uwaga: jeśli przeczytasz ten rozdział z linku, który podam, może się okazać, że trudniejszą koncepcją do zrozumienia nie jest różnica między funkcją a procedurą, ale proces i procedura. Czy wiesz, że procedura rekurencyjna może mieć proces iteracyjny?)
Analogiem do procedur są przepisy kulinarne. Na przykład; załóżmy, że masz maszynę o nazwie
make-pies
ta maszyna pobiera składniki(fruit, milk, flower, eggs, sugar, heat)
i ta maszyna zwraca apie
.Może wyglądać reprezentacja tego komputera
Oczywiście to nie jedyny sposób na zrobienie ciasta.
W tym przypadku możemy zobaczyć, że:
Ta analogia jest OK, ale załamuje się, gdy weźmie się pod uwagę, że w przypadku programu komputerowego wszystko jest abstrakcją. Tak więc, inaczej niż w przypadku przepisu na maszynę, porównujemy dwie rzeczy, które same są abstrakcjami; dwie rzeczy, które równie dobrze mogą być tym samym. I uważam, że są (dla wszystkich celów i celów) to samo.
źródło
W kontekście db : procedura składowana jest prekompilowanym planem wykonania, w którym funkcje nie są.
źródło
Pod względem С # / Java funkcja jest blokiem kodu, który zwraca konkretną wartość, ale procedura jest blokiem kodu, który zwraca void (nic). W języku C # / Java zarówno funkcje, jak i procedury są częściej nazywane tylko metodami .
źródło
Procedury: 1.Procedury to zbiory instrukcji, które definiują sparametryzowane obliczenia. 2. Procedury nie mogą zwracać wartości.
3. Procedury nie mogą być wywoływane z funkcji.
Funkcje 1. Funkcje strukturalnie przypominają procedury, ale są semantycznie modelowane na funkcjach matematycznych. 2. Może zwracać wartości 3. Funkcja może być wywołana z procedur.
źródło
Obie procedury i funkcje są podprogramami, jedyną różnicą między nimi jest to, że procedura zwraca wiele (lub przynajmniej może to zrobić) wartości, podczas gdy funkcja może zwrócić tylko jedną wartość (dlatego w matematyce stosuje się notację funkcji, ponieważ zwykle znajduje się tylko jedna wartość w danym momencie), chociaż niektóre języki programowania nie przestrzegają tych zasad, są to ich prawdziwe definicje
źródło
return
. Mówisz o skutkach ubocznych, które są możliwe w obu przypadkach (jeśli pozwala na to język).