Qual è la differenza tra una "funzione" e una "procedura"?


203

In generale, sentiamo tutti parlare delle funzioni o delle procedure nei linguaggi di programmazione. Tuttavia, ho appena scoperto che uso questi termini quasi in modo intercambiabile (il che è probabilmente molto sbagliato).

Quindi, la mia domanda è:

Qual è la differenza in termini di funzionalità, scopo e utilizzo?

Un esempio sarebbe apprezzato.



6
Penso che la SICP abbia ragione. Le funzioni esistono solo in matematica e rappresentano ciò che è conoscenza. Le procedure esistono nei linguaggi di programmazione (compresi quelli funzionali) e rappresentano le modalità di conoscenza. Funzione : sqrt (x) = y tale che y ^ 2 = x. Procedura : (define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0)).
MK

Risposte:


296

Una funzione restituisce un valore e una procedura esegue semplicemente i comandi.

La funzione name deriva dalla matematica. Viene utilizzato per calcolare un valore basato sull'input.

Una procedura è un insieme di comandi che può essere eseguito in ordine.

Nella maggior parte dei linguaggi di programmazione, anche le funzioni possono avere una serie di comandi. Quindi la differenza sta solo nel restituire una parte di valore.

Ma se ti piace mantenere una funzione pulita (basta guardare i linguaggi funzionali), devi assicurarti che una funzione non abbia effetti collaterali.


Come si possono assicurare effetti collaterali in un linguaggio imperativo (java, c) o dichiarativo (scala, schema)?
orlybg,

1
@orlybg, nelle lingue dichiarative, la coerenza deriva dall'implementazione della lingua. Le loro restrizioni di portata impediscono loro di avere effetti collaterali. D'altra parte, le lingue imperative sfruttano esplicitamente i loro effetti collaterali. Gli effetti collaterali non sono sempre negativi.
Tharindu Rusira,

Sto leggendo il seguente tutorial di Ada ( goanna.cs.rmit.edu.au/~dale/ada/aln/8_subprograms.html ), in cui il secondo paragrafo di quella pagina inizia con "Le procedure in Ada sono simili a quelle di Pascal . Una procedura può contenere dichiarazioni di restituzione ". È un errore nel testo? O significa che può avere dichiarazioni di ritorno ma non restituire alcun valore?
jviotti,

3
In pascal, le procedure non hanno dichiarazioni di ritorno, ma solo le funzioni. Deve essere un errore nel testo. Tuttavia, una procedura può avere un'istruzione "exit", che può agire come un'istruzione "return" senza argomenti, senza valori di ritorno.
Eric Fortier,

la funzione può ottenere input e restituire solo un output. la procedura o la macro possono ottenere input e non restituire alcun dato, eseguire solo il numero di istruzioni. la differenza principale è che la procedura non può restituire alcun tipo di dati.
EsmaeelE

42

Questo dipende dal contesto.

In linguaggi simili a Pascal, funzioni e procedure sono entità distinte, che differiscono nel fatto che restituiscano o meno un valore. Si comportano diversamente. la sintassi del linguaggio (ad es. istruzioni di moduli per le chiamate di procedura; non è possibile utilizzare una chiamata di procedura all'interno di un'espressione rispetto a chiamate di funzioni che non formano istruzioni, è necessario utilizzarle in altre istruzioni). Pertanto, i programmatori allevati da Pascal si differenziano tra quelli.

Nelle lingue simil-C e in molte altre lingue contemporanee, questa distinzione è sparita; nelle lingue tipizzate staticamente, le procedure sono solo funzioni con un tipo di ritorno divertente. Questo è probabilmente il motivo per cui sono usati in modo intercambiabile.

Nei linguaggi funzionali, in genere non esiste una procedura: tutto è una funzione.


e la documentazione dei linguaggi di programmazione può chiamare funzioni e procedure come preferisce, perché le persone accetteranno qualsiasi nome poiché lo sfondo dietro quei nomi è stato cancellato molto tempo fa.
Arne Babenhauserheide,

18

Esempio in C:

// function
int square( int n ) {
   return n * n;
}

// procedure
void display( int n ) {
   printf( "The value is %d", n );
}

Sebbene si dovrebbe notare che lo standard C non parla di procedure, ma solo di funzioni.


4
... lo standard C non parla di procedure, ma solo di funzioni. Questo perché ha solo funzioni. Una funzione che non restituisce nulla è a void function. Kernighan & Ritchie Ch 1.7: "In C, una funzione equivale a una subroutine o una funzione in Fortran o una procedura o una funzione in Pascal." In altre parole ... questa risposta è sbagliata.
Mogsdad,

8
La risposta non è sbagliata ed è un buon esempio della differenza tra funzioni e procedure pure. K&R ha definito ogni subroutine una "funzione" per mantenere le cose semplici, ma una subroutine con effetti collaterali è in realtà una "procedura", non una "funzione" in senso canonico della matematica. C potrebbe essere un linguaggio migliore se distinguesse le funzioni reali dalle procedure, questo aiuterebbe con l'analisi statica, l'ottimizzazione delle prestazioni e la parallelizzazione.
Sam Watkins,

12

In generale, una procedura è una sequenza di istruzioni.
Una funzione può essere la stessa, ma di solito restituisce un risultato.


11

C'è un termine subroutine o sottoprogramma che sta per un pezzo di codice parametrizzato che può essere chiamato da luoghi diversi.

Le funzioni e le procedure sono implementazioni di quelle. Di solito le funzioni restituiscono valori e le procedure non restituiscono nulla.


6

Differenze di base

  • Una funzione deve restituire un valore ma nelle Stored procedure è facoltativa: una procedura può restituire valori 0 o n .
  • Le funzioni possono avere solo parametri di input, mentre le procedure possono avere parametri di input / output.
  • Per una funzione è obbligatorio prendere un parametro di input, ma una procedura memorizzata può richiedere da 0 a n parametri di input.
  • Le funzioni possono essere richiamate da una procedura mentre le procedure non possono essere richiamate da una funzione.

Differenze avanzate

  • Le eccezioni possono essere gestite da blocchi try-catch in una procedura, mentre un blocco try-catch non può essere utilizzato in una funzione.
  • Possiamo andare per la gestione delle transazioni in una procedura, mentre in una funzione non possiamo.

In SQL:

  • Una procedura consente SELECTcosì come (DML INSERT, UPDATE, DELETE) le dichiarazioni in essa, mentre la funzione consente solo SELECTdichiarazioni in esso.
  • Le procedure non possono essere utilizzate in SELECTun'istruzione, mentre le funzioni possono essere incorporate in SELECTun'istruzione.
  • Le procedure memorizzate non possono essere utilizzate nelle istruzioni SQL in qualsiasi punto di un blocco WHERE(o a HAVINGo a SELECT), mentre le funzioni possono.
  • Le funzioni che restituiscono tabelle possono essere trattate come un altro Rowset. Questo può essere usato in un JOINblocco con altre tabelle.
  • Le funzioni incorporate possono essere pensate come viste che accettano parametri e possono essere utilizzate in JOINblocchi e altre operazioni di Rowset.

3
Questa risposta è molto specifica per la lingua, mentre la domanda era indipendente dalla lingua. Le affermazioni qui non sono tutte vere nel caso generale, ma sarebbe utile se chiarissi la lingua o l'ambiente per cui le stai affermando.
Mogsdad,

5

Più strettamente, una funzione f obbedisce alla proprietà che f (x) = f (y) se x = y, ovvero calcola lo stesso risultato ogni volta che viene chiamato con lo stesso argomento (e quindi non cambia lo stato del sistema.)

Pertanto, rand () o print ("Hello"), ecc. Non sono funzioni ma procedure. Mentre sqrt (2.0) dovrebbe essere una funzione: non vi sono effetti osservabili o cambiamenti di stato, indipendentemente dalla frequenza con cui lo si chiama e restituisce sempre 1,41 e alcuni.


3
Questo utilizzo è relavent nel contesto della programmazione "funzionale". Tenere presente che molte lingue (spesso imperative) che chiamano i loro sottoprogrammi "funzioni" non richiedono questa proprietà.
dmckee --- ex gattino moderatore

1
Non ho suggerito che i linguaggi di programmazione richiedano questa proprietà. Ad ogni modo, si possono scrivere funzioni rigorose in qualsiasi lingua, e sento che è buona abitudine programmare il più possibile in funzioni pulite, quindi incollare i pezzi insieme con alcune procedure principali.
Ingo,

4

Se qui siamo indipendenti dalla lingua, la procedura di solito specifica una serie di atti necessari per ottenere certi risultati in modo affidabile e idempotente. Cioè, una procedura è sostanzialmente un algoritmo.

Le funzioni, d'altra parte, sono un pezzo di codice in qualche modo indipendente all'interno di un programma più ampio. In altre parole, la funzione è l'implementazione di una procedura.


4

Questa è una vecchia domanda ben nota, ma vorrei condividere alcuni approfondimenti sulla moderna ricerca e progettazione del linguaggio di programmazione.

Risposta di base

Tradizionalmente (nel senso della programmazione strutturata ) e informalmente, una procedura è un costrutto strutturale riutilizzabile per avere "input" e fare qualcosa di programmabile. Quando è necessario eseguire qualcosa all'interno di una procedura, è possibile fornire argomenti (effettivi) alla procedura in una chiamata di procedura codificata nel codice sorgente (di solito in una specie di espressione) e le azioni codificate nel corpo delle procedure (fornito nella definizione della procedura) verrà eseguito con la sostituzione degli argomenti nei parametri (formali) utilizzati nel corpo.

Una funzione è più di una procedura perché i valori di ritorno possono anche essere specificati come "output" nel corpo. Le chiamate di funzione sono più o meno le stesse delle chiamate di procedura, tranne per il fatto che è anche possibile utilizzare il risultato della chiamata di funzione in modo sintattico (di solito come sottoespressione di un'altra espressione).

Tradizionalmente, le chiamate di procedura (anziché le chiamate di funzione) sono utilizzate per indicare che nessun output deve essere interessato e devono esserci effetti collaterali per evitare che la chiamata sia non operativa, sottolineando quindi il paradigma della programmazione imperativa . Molti linguaggi di programmazione tradizionali come Pascal forniscono sia "procedure" che "funzioni" per distinguere questa differenza intenzionale di stili.

(Per essere chiari, "input" e "output" menzionati sopra sono nozioni semplificate basate sulle proprietà sintattiche delle funzioni. Molte lingue supportano inoltre il passaggio di argomenti a parametri mediante riferimento / condivisione, per consentire agli utenti di trasportare informazioni codificate in argomenti durante le chiamate Tale parametro può anche essere chiamato semplicemente "parametro in / out". Questa funzione si basa sulla natura degli oggetti che vengono passati nelle chiamate, che è ortogonale alle proprietà della funzione di procedura / funzione.)

Tuttavia, se il risultato di una chiamata di funzione non è necessario, può essere semplicemente (almeno logicamente) ignorato e le definizioni di funzione / chiamate di funzione devono essere coerenti con le definizioni di procedura / chiamate di procedura in questo modo. Linguaggi simili a ALGOL come C, C ++ e Java, forniscono tutti la funzione di "funzione" in questo modo: codificando il tipo di risultato voidcome un caso speciale di funzioni che assomigliano a procedure tradizionali, non è necessario fornire la funzione di "procedure "separatamente. Questo impedisce un po 'di gonfiore nella progettazione della lingua.

Poiché viene menzionato SICP, vale anche la pena notare che nel linguaggio dello schema specificato da R n RS , una procedura può o meno dover restituire il risultato del calcolo. Questa è l'unione della tradizionale "funzione" (che restituisce il risultato) e della "procedura" (che non restituisce nulla), essenzialmente uguale al concetto di "funzione" di molti linguaggi simili a ALGOL (e che in realtà condivide ancora più garanzie come le valutazioni applicative del operandi prima della chiamata). Tuttavia, le differenze vecchio stile si verificano ancora anche in documenti normativi come SRFI-96 .

Non so molto sui motivi esatti alla base della divergenza, ma come ho sperimentato, sembra che i progettisti linguistici saranno più felici senza il gonfiore delle specifiche al giorno d'oggi. Cioè, la "procedura" come funzionalità autonoma non è necessaria. Tecniche come il voidtipo sono già sufficienti per contrassegnare l'uso in cui gli effetti collaterali dovrebbero essere enfatizzati. Questo è anche più naturale per gli utenti che hanno esperienze con linguaggi simili al C, che sono popolari da più di qualche decennio. Inoltre, evita l'imbarazzo in casi come R n RS in cui le "procedure" sono in realtà "funzioni" in senso lato.

In teoria, una funzione può essere specificata con un tipo di unità specificato come tipo del risultato della chiamata di funzione per indicare che il risultato è speciale. Ciò distingue le procedure tradizionali (in cui il risultato di una chiamata non è interessato) dalle altre. Esistono diversi stili nella progettazione di una lingua:

  • Come in R n RS, è sufficiente contrassegnare i risultati non interessati come valore "non specificato" (di tipo non specificato, se la lingua deve menzionarlo) ed è sufficiente essere ignorati.
  • Specificando il risultato disinteressato come il valore di un tipo di unità dedicata (es Kernel s' #inert) funziona anche.
  • Quando quel tipo è un ulteriore tipo di fondo , può essere (si spera) staticamente verificato e impedito di usarlo come tipo di espressione. Il voidtipo in linguaggi simili ad ALGOL è esattamente un esempio di questa tecnica. ISO C11 _Noreturnè simile ma più sottile in questo tipo.

Ulteriori letture

Poiché il concetto tradizionale deriva dalla matematica, ci sono tonnellate di magia nera che la maggior parte delle persone non si preoccupa di conoscere. A rigor di termini, probabilmente non sarai in grado di chiarire il tutto secondo i tuoi libri di matematica. Neanche i libri CS possono fornire molto aiuto.

Per quanto riguarda i linguaggi di programmazione, ci sono diversi avvertimenti:

  • Le funzioni in diversi rami della matematica non sono sempre definite con gli stessi significati. Le funzioni in diversi paradigmi di programmazione possono anche essere abbastanza diverse (anche a volte le sintassi della chiamata di funzione sembrano simili). A volte i motivi per causare le differenze sono gli stessi, ma a volte non lo sono.
    • È idiomatico modellare il calcolo mediante funzioni matematiche e quindi implementare il calcolo sottostante nei linguaggi di programmazione. Fai attenzione a non mapparli uno a uno a meno che tu non sappia di cosa si sta parlando.
  • Non confondere il modello con l'entità da modellare.
    • Quest'ultima è solo una delle implementazioni della prima. Possono esserci più di una scelta, a seconda dei contesti (ad esempio i rami della matematica interessati).
    • In particolare, è più o meno altrettanto assurdo trattare "funzioni" come "mappature" o sottoinsiemi di prodotti cartesiani come trattare i numeri naturali come codifica Von-Neumann di ordinali (che sembrano un mucchio di {{{}}, {}}...) oltre ad alcuni contesti limitati .
  • Matematicamente, le funzioni possono essere parziali o totali . Diversi linguaggi di programmazione hanno un trattamento diverso qui.
    • Alcuni linguaggi funzionali possono onorare la totalità delle funzioni per garantire che il calcolo all'interno delle chiamate di funzione termini sempre con passaggi finiti. Tuttavia, questo non è essenzialmente completo di Turing, quindi un'espressività computazionale più debole, e non si vede molto nei linguaggi di uso generale oltre alla semantica del typechecking (che dovrebbe essere totale).
    • Se la differenza tra le procedure e le funzioni è significativa, dovrebbero esserci "procedure totali"? Hmm ...
  • I costrutti simili alle funzioni nei calcoli utilizzati per modellare il calcolo generale e la semantica dei linguaggi di programmazione (ad esempio le astrazioni lambda nei calcoli lambda ) possono avere diverse strategie di valutazione sugli operandi.
    • Nella riduzione tradizionale dei calcoli puri e nelle valutazioni delle espressioni in linguaggi funzionali puri , non ci sono effetti collaterali che alterano i risultati dei calcoli. Di conseguenza, gli operandi non devono essere valutati prima del corpo dei costrutti simili a funzioni (perché l'invariante per definire "stessi risultati" è mantenuto da proprietà come l' equivalenza β garantita dalla proprietà di Church-Rosser ).
    • Tuttavia, molti linguaggi di programmazione possono avere effetti collaterali durante la valutazione delle espressioni. Ciò significa che le strategie di valutazione rigorosa come la valutazione applicativa non sono le stesse di quelle di valutazione non rigorosa come la chiamata per necessità . Questo è significativo, perché senza la distinzione, non è necessario distinguere le macro simili a funzioni (ovvero utilizzate con argomenti) da funzioni (tradizionali). Ma a seconda del sapore delle teorie, questo può ancora essere un artefatto. Detto questo, in senso lato, le macro funzionali (specialmente quelle igieniche ) sono funzioni matematiche con alcune limitazioni non necessarie (fasi sintattiche). Senza le limitazioni, potrebbe essere ragionevole trattare le macro funzionali (di prima classe) come procedure ...
    • Per i lettori interessati a questo argomento, considera alcune astrazioni moderne .
  • Le procedure sono generalmente considerate al di fuori dell'ambito della matematica tradizionale. Tuttavia, nei calcoli che modellano la semantica del linguaggio di calcolo e di programmazione, così come i progetti del linguaggio di programmazione contemporaneo, può esserci una grande famiglia di concetti correlati che condividono la natura "richiamabile". Alcuni di questi sono utilizzati per implementare / estendere / sostituire procedure / funzioni. Ci sono anche distinzioni più sottili.

3

Nella maggior parte dei contesti: una funzione restituisce un valore, mentre una procedura no. Entrambi sono pezzi di codice raggruppati insieme per fare la stessa cosa.

Nel contesto di programmazione funzionale (dove tutte le funzioni restituiscono valori), una funzione è un oggetto astratto:

f(x)=(1+x)
g(x)=.5*(2+x/2)

Qui, f ha la stessa funzione di g, ma è una procedura diversa.


3

All'interno della procedura possiamo usare le istruzioni DML (Inserisci / Aggiorna / Elimina), ma all'interno della funzione non possiamo usare le istruzioni DML.

La procedura può avere sia parametri input / output, ma Function può avere solo parametri input.

Possiamo usare il blocco Try-Catch nella Stored Procedure, ma nella funzione non possiamo usare il blocco Try-Catch.

Non è possibile utilizzare la Stored Procedure nell'istruzione Select, ma nella funzione possiamo utilizzare nell'istruzione Select.

La Stored procedure può restituire 0 o n valori (max 1024), ma la funzione può restituire solo 1 valore obbligatorio.

La procedura memorizzata non può essere chiamata dalla funzione, ma possiamo chiamare la funzione dalla procedura memorizzata.

Possiamo usare la transazione in Stored Procedure, ma nella funzione non possiamo usare la transazione.

Non possiamo usare la Stored Procedure nell'istruzione Sql da nessuna parte nella sezione Where / Avere / selezionare, ma possiamo usare la funzione In.

Non possiamo unirci alla Stored Procedure, ma possiamo unirci alla funzione.

per di più .. clicca qui ... http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html


2
Questa risposta è molto specifica per la lingua, mentre la domanda era indipendente dalla lingua. Le affermazioni qui non sono tutte vere nel caso generale, ma sarebbe utile se chiarissi la lingua o l'ambiente per cui le stai affermando.
Mogsdad,

Questa risposta è completamente errata per la stragrande maggioranza dei linguaggi di programmazione. Le procedure hanno solo parametri di input e le funzioni hanno sia input che output.
Dopo il

2

Una funzione restituisce un valore e una procedura esegue semplicemente i comandi.

La funzione name deriva dalla matematica. Viene utilizzato per calcolare un valore basato sull'input.

Una procedura è un insieme di comandi che può essere eseguito in ordine.

Nella maggior parte dei linguaggi di programmazione, anche le funzioni possono avere una serie di comandi. Quindi la differenza sta solo nel restituire una parte di valore.

Ma se ti piace mantenere una funzione pulita (basta guardare i linguaggi funzionali), devi assicurarti che una funzione non abbia effetti collaterali.


1

La funzione può essere utilizzata in un'istruzione sql mentre la procedura non può essere utilizzata in un'istruzione sql.

Le istruzioni Inserisci, Aggiorna e Crea non possono essere incluse nella funzione ma una procedura può avere queste istruzioni.

La procedura supporta le transazioni ma le funzioni non supportano le transazioni.

La funzione deve restituire uno e un solo valore (un altro può essere restituito dalla variabile OUT) ma la procedura restituisce altrettanti set di dati e valori di ritorno.

I piani di esecuzione di entrambe le funzioni e procedure sono memorizzati nella cache, quindi le prestazioni sono le stesse in entrambi i casi.


1

Mi oppongo a qualcosa che continuo a vedere più volte nella maggior parte di queste risposte, che ciò che rende una funzione una funzione è che restituisce un valore.

Una funzione non è solo un vecchio metodo che restituisce un valore. Non è così: Affinché un metodo sia una funzione reale, deve restituire lo stesso valore sempre con un input specifico. Un esempio di un metodo che non è una funzione è il randommetodo nella maggior parte delle lingue, poiché sebbene restituisca un valore, il valore non è sempre lo stesso.

Una funzione quindi è più simile a una mappa (ad es. Dove x -> x'per una funzione unidimensionale). Questa è una distinzione molto importante tra metodi e funzioni regolari perché quando si tratta di funzioni reali i tempi e l'ordine in cui vengono valutati non dovrebbero mai importare dove non è sempre il caso delle non funzioni.

Ecco un altro esempio di un metodo che non è una funzione ma che comunque restituirà comunque un valore.

// The following is pseudo code:
g(x) = {
  if (morning()) {
     g = 2 * x;
  }
  else {
   g = x;
  }
  return g;
}

Mi oppongo ulteriormente all'idea che le procedure non restituiscono valori. Una procedura è solo un modo specifico di parlare di una funzione o di un metodo. Ciò significa che se il metodo sottostante che la procedura definisce o implementa restituisce un valore, indovina quale procedura restituisce un valore. Prendi ad esempio il seguente frammento dal SICP :

// We can immediately translate this definition into a recursive procedure 
// for computing Fibonacci numbers:

(define (fib n)
  (cond ((= n 0) 0)
        ((= n 1) 1)
        (else (+ (fib (- n 1))
                 (fib (- n 2))))))

Hai sentito parlare di procedure ricorsive molto recentemente? Stanno parlando di una funzione ricorsiva (una funzione reale) e sta restituendo un valore e stanno usando la parola "procedura". Allora, qual è la differenza?

Bene, un altro modo di pensare a una funzione (oltre al significato sopra menzionato) è come una rappresentazione astratta di un ideale come il numero 1. Una procedura è quella effettiva attuazione di quella cosa. Personalmente penso che siano intercambiabili.

(Nota, se leggi quel capitolo dal link che fornisco potresti scoprire che un concetto più difficile da comprendere non è la differenza tra una funzione e una procedura, ma un processo e una procedura. Sapevi che una procedura ricorsiva può avere un processo iterativo?)

Un analogo per le procedure sono le ricette. Per esempio; supponiamo di avere una macchina chiamata make-piesquesta macchina prende gli ingredienti (fruit, milk, flower, eggs, sugar, heat)e questa macchina restituisce a pie.

Potrebbe apparire una rappresentazione di questa macchina

make-pies (fruit, milk, flower, eggs, sugar, heat) = {
   return (heat (add fruit (mix eggs flower milk)))
}

Ovviamente non è l'unico modo per fare una torta.

In questo caso possiamo vedere che:

A       function     is to a     machine
as a    procedure    is to a     recipe
as      attributes   are to      ingredients
as      output       is to       product

Tale analogia è OK ma si interrompe quando si considera che quando si ha a che fare con un programma per computer tutto è un'astrazione. Quindi, diversamente dal caso di una ricetta con una macchina, stiamo confrontando due cose che sono esse stesse astrazioni; due cose che potrebbero anche essere la stessa cosa. E ritengo che siano (a tutti gli effetti) la stessa cosa.


2
Una funzione che restituisce sempre lo stesso valore per determinati argomenti è talvolta chiamata "funzione pura". Nella maggior parte dei linguaggi che distinguono tra procedure e funzioni, non è necessario che le funzioni siano pure e il termine "funzione" è correttamente usato per riferirsi a subroutine che possono avere effetti collaterali e che possono restituire risultati diversi su chiamate successive con gli stessi argomenti. (E nei linguaggi simili a C, anche le subroutine che non restituiscono valori sono correttamente chiamate "funzioni".)
Keith Thompson,

D'accordo, ecco perché finisco per dire che le parole sono intercambiabili.
Dkinzer,

1
Sì, ma inizi dicendo che "Una funzione non è solo un vecchio metodo che restituisce un valore", mentre in molte lingue è esattamente ciò che è una funzione.
Keith Thompson,

0

Nel contesto di db : la procedura memorizzata è un piano di esecuzione precompilato dove non lo sono le funzioni.


0

In termini di С # / Java, la funzione è il blocco di codice, che restituisce un valore particolare, ma la procedura è il blocco di codice che restituisce void (niente). In C # / Java entrambe le funzioni e le procedure sono più spesso chiamate solo metodi .

    //This is a function
    public DateTime GetCurrentDate()
    {
        return DateTime.Now.Date;
    }

    //This is a procedure(always return void)
    public void LogMessage()
    {
        Console.WriteLine("Just an example message.");
    }

-3

Procedure: 1. Le procedure sono raccolte di istruzioni che definiscono calcoli con parametri. 2. Le procedure non possono restituire valori.

3. Le procedure non possono essere richiamate dalla funzione.

Funzioni 1. Le funzioni assomigliano strutturalmente alle procedure ma sono semanticamente modellate su funzioni matematiche. 2. Può restituire valori 3. La funzione può essere richiamata dalle procedure.


3. Le procedure non possono essere richiamate dalla funzione. In che lingua è vero? Nessuno in cui ho esperienza ha questa limitazione.
Mogsdad,

È vero. Se si chiama una procedura da una funzione, non è una funzione. Quanto al linguaggio che impone questo, questa è una buona domanda, a cui non conosco la risposta. Può essere funzionale, ma anche allora non ne sono sicuro: la lista pura è funzionale (non esiste un set: nessun effetto collaterale), ma dato che ha lambda è possibile implementare set. Potresti scrivere un compilatore che non impone l'uso di set, dovrebbe rilevare tutte le sue implementazioni. Potresti rimuovere lambda dalla lingua, ma sarebbe peggio.
ctrl-alt-delor,

Ohh ho appena pensato a un linguaggio C ++: un metodo const non può chiamare un metodo not const (anche se avrai bisogno dei corretti controlli del compilatore attivati ​​e non fare di tutto per
aggirarlo

-7

Le procedure e le funzioni sono entrambe le subroutine, l' unica differenza tra loro è che una procedura restituisce più valori (o almeno può fare) mentre una funzione può restituire un solo valore (ecco perché la notazione di funzione viene utilizzata in matematica poiché di solito viene trovato solo un valore contemporaneamente) anche se alcuni linguaggi di programmazione non seguono queste regole, questa è la loro vera definizione


Uhm, no. Una procedura non fa returnnulla. Stai parlando di effetti collaterali, che sono possibili con entrambi (se consentito dalla lingua).
Mogsdad,

Una procedura può restituire qualsiasi quantità di valori, tale importo può essere zero
user2766296

Un effetto collaterale sarebbe se un avesse un array e lo passasse in una funzione o procedura che trovasse il valore più grande, l'array sarebbe passato per riferimento e dopo che la sub-routine ha eseguito l'array viene ordinato, il fatto che sia ordinato è un effetto collaterale, il valore restituito è il valore più grande nell'array
user2766296

Mi piace questa risposta, e mi piacciono anche quelli con diversi voti negativi, perché in qualche modo hanno ragione, quindi paradossalmente, al fine di renderlo molto popolare in SO, gli darò un voto negativo. Una procedura memorizzata in SQL Server restituisce un gruppo di risultati (quelli che hai definito "valori multipli") mentre una funzione può restituire un solo valore (che non è molto preciso poiché puoi anche creare una funzione con valori di tabella).
Ivanzinho,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.