Metodo vs Funzione vs Procedura


107

Domanda semplice, ma sento spesso questi tre termini definiti con tanta ferocia, ma che mi è stato detto che significano cose diverse nel corso degli anni.

Quali sono le definizioni "corrette" di "Procedure", "Metodi", "Funzione", "Subroutine", ecc.?


4
rinunci alla "routine"
mefisto

1
@teresko: penso che la "subroutine" sia più comune.
mk12

Risposte:


108

Vado con una risposta diversa qui: praticamente parlando, non c'è davvero alcuna differenza , con la leggera eccezione che "metodo" di solito si riferisce a una subroutine associata a un oggetto nei linguaggi OO.

I termini "procedura, funzione, sottoprogramma, sottoprogramma e metodo" significano davvero la stessa cosa: un sottoprogramma richiamabile all'interno di un programma più ampio. Ma è difficile trovare una definizione che catturi tutti gli usi varianti di questi termini, perché non sono usati coerentemente in linguaggi di programmazione o paradigmi.

Si potrebbe dire che una funzione restituisce un valore. Bene, la seguente funzione C non restituisce un valore:

void f() { return; }

... ma dubito che troverai qualcuno che lo definirebbe una procedura.

Certo, in Pascal, le procedure non restituiscono valori e le funzioni restituiscono valori, ma questo è semplicemente un riflesso di come Pascal è stato progettato. In Fortran, una funzione restituisce un valore e una subroutine restituisce più valori. Eppure nulla di tutto ciò ci consente davvero di trovare una definizione "universale" per questi termini.

In effetti, il termine "programmazione procedurale" si riferisce a un'intera classe di linguaggi, tra cui C, Fortran e Pascal, solo uno dei quali utilizza effettivamente il termine "procedura" per indicare qualsiasi cosa.

Quindi nulla di tutto ciò è veramente coerente. L'unica eccezione è probabilmente il "metodo", che sembra essere utilizzato quasi interamente con i linguaggi OO, facendo riferimento a una funzione associata a un oggetto. Anche se, anche questo non è sempre coerente. Il C ++, ad esempio, di solito usa il termine "funzione membro" anziché il metodo (anche se il termine "metodo" si è insinuato nel volgare C ++ tra i programmatori).

Il punto è che nulla di tutto ciò è veramente coerente. Riflette semplicemente la terminologia utilizzata da qualunque lingua sia in voga in quel momento.


Questo è esattamente ciò che pensavo fosse la risposta. (Avrei dovuto aggiungere "subroutine" come un'altra variante col senno di poi.) Posso chiedere: perché non dovresti trovare qualcuno che chiama quella funzione C una "Procedura"? Perché è tecnicamente errato o perché il termine "procedura" è attualmente fuori moda?
Django Reinhardt,

7
I programmatori C usano il termine "funzione" semplicemente perché i progettisti di C hanno usato quel termine.
Charles Salvia,

15
Non buttiamo via il bambino con l'acqua del bagno. Solo perché la terminologia non viene utilizzata con piena coerenza, non significa che i diversi termini non abbiano significati diversi. Le definizioni di @ Bruce e @ Frank sono ampiamente riconosciute, non idiosincratiche. Il fatto che i significati non siano universali è importante, ma non giustifica il salto a "praticamente parlando, non c'è davvero alcuna differenza". (@Django)
LarsH,

9
Tipo di dual a C ++, che chiama i metodi "funzioni membro", Java e le funzioni di chiamata C # "metodi statici".
Jörg W Mittag,

2
La risposta di Bruce è sicuramente quella che dovresti cercare se non conosci la programmazione. Le sue definizioni saranno assolutamente corrette, il 99% delle volte. Ma stavo cercando più di una risposta tecnico / teorica. A volte i programmatori più recenti conoscono solo il proprio dominio e insistono sul fatto che è tutto ciò che c'è. In realtà oggi ci sono programmatori che usano ancora lingue più vecchie e che non sono "sbagliati" per usare definizioni diverse. Era quello che mi interessava di più.
Django Reinhardt,

67

Una funzione restituisce un valore, ma una procedura no.

Un metodo è simile a una funzione, ma è interno a una parte di una classe. Il termine metodo è usato quasi esclusivamente nella programmazione orientata agli oggetti.


8
Non esattamente interno. Un metodo è qualsiasi funzione o procedura che fa parte di una classe.
Scott Whitlock,

8
Quindi una "Stored Procedure" in SQL non restituisce alcun valore? Che dire di una "Procedura" in qualcosa come Pascal? Le tue definizioni sono basate sulle tendenze attuali o dovrebbero essere considerate definizioni universali? Grazie!
Django Reinhardt,

3
@ Django: in Pascal una procedura non può avere un valore di ritorno e una funzione deve avere un valore di ritorno. In alcune altre lingue, la terminologia può essere usata più liberamente.
Bruce Alderman,

1
FWIW, FORTRAN aveva SUBROUTINE e FUNZIONI sin dai primi giorni, con la differenza che un SUBROUTINE non ha restituito un valore. Non ricordo ALGOL, da cui discende Pascal.
David Thornley,

2
@ 3p1c_d3m0n È certamente vero che ricopre functionentrambi i ruoli in JS, ma le funzioni JS ritornano tutte. Quando un'istruzione return non ha valore, il valore è implicitamente undefined. Quando un'asserzione di ritorno è assente, l'interprete aggiunge un'istruzione di ritorno implicita. Esoterico, forse, ma è coerente con la definizione fornita qui. Questo è il motivo per cui var x = function() {}();è legale in JS; se non fosse per rendimenti impliciti, questo dovrebbe essere un errore, come sarebbe in Pascal.
Punto

52

Una funzione è qualcosa che accetta un sacco di input e restituisce uno o più valori. Se i valori restituiti sono interamente determinati dagli input e la funzione non ha effetti collaterali (registrazione, forse o causa cambiamenti di stato al di fuori di sé), allora si chiama funzione pura.

Una procedura è una funzione che non restituisce un valore. In particolare, ciò significa che una procedura può causare solo effetti collaterali. (Ciò potrebbe includere la mutazione di un parametro di input!)

Un metodo è una funzione che si chiude su un insieme di variabili, ovvero una chiusura . Prende zero o più parametri di input, ha accesso a questo set di variabili e restituisce zero o più valori. Nei linguaggi OO questi metodi sono associati a oggetti o classi.

Nella maggior parte dei linguaggi OO tradizionali, quelle variabili chiuse sono chiamate campi membri o variabili di istanza di un oggetto. Un metodo può essere una funzione pura, una funzione impura o una procedura.

Quest'ultima definizione porta alla corrispondenza oggetto = struttura + chiusure .


5
Quindi un oggetto è una raccolta di variabili e una raccolta di chiusure su queste variabili comuni. Fondamentalmente, i linguaggi orientati agli oggetti hanno sempre avuto delle chiusure e nessuno lo sapeva? Vista interessante! +1
Giorgio

1
Non credo che la maggior parte dei metodi si avvicini a nulla. foo.doSomething()non è senza parametri. Ha un parametro (l'oggetto foo) con dato con un po 'di zucchero sintattico. Una chiusura sarebbe in grado di fare riferimento al suo oggetto senza che sia necessario un tale parametro. Questo non vuol dire che i metodi non possano essere chiusure, solo che la maggior parte non lo sono e che essere OO non è sufficiente affinché una lingua supporti le chiusure.
8bittree

3
foo.doSomething()si chiude sulla foovariabile. Qualsiasi dichiarazione in doSomethingpuò accedere fooattraverso thiso self, a seconda della lingua. Questa è la definizione stessa di "vicino". Le classi si chiudono sulle loro variabili membro, quindi (ignorando "cos'è OO"), OO è sufficiente. Questo è abbastanza noto in letteratura ...
Frank Shearar,

1
Ehm, no. Vedi quel piccolo foo.davanti foo.doSomething()? Sei tu che passi doSomething()un parametro. Solo perché non è tra parentesi non significa che non sia un parametro. Il thiso selfall'interno del metodo è semplicemente zucchero sintattico fanno riferimento a tale parametro.
8bittree,

1
@FrankShearar, direi che ci sono solo due distinzioni ragionevolmente chiare nell'informatica: dati e istruzioni. Anche quello esce dalla finestra nel caso (insolito) di codice automodificante. In OO, ciò che viene generalmente definito "metodo" (o "funzione membro") non deve necessariamente essere un metodo o una funzione secondo la tua definizione: tutte queste parole in uso generale sono effettivamente sinonimi con un significato generale e intercambiabile. La "funzione impura" di cui alludi l'esistenza, è semplicemente un altro (e anche il più prolisso e gergonico) sinonimo dello stesso concetto generale di "istruzioni".
Steve,

14

Bruce ha una buona risposta . Vorrei aggiungere, semanticamente:

  • Una procedura dovrebbe "fare qualcosa" agli argomenti o causare qualche altro effetto collaterale (ad es. printf)
  • Una funzione dovrebbe (a) rispondere a una domanda sugli argomenti, oppure (b) calcolare un nuovo valore basato sugli argomenti
  • Un metodo di funzione dovrebbe rispondere a una domanda sullo stato dell'oggetto
  • Un metodo di procedura dovrebbe cambiare lo stato dell'oggetto

Bella risposta! Solo una piccola aggiunta: A procedure should "do something" to the arguments- o causare qualche altro effetto collaterale (ad es printf.).
Allon Guralnek,

1
@Allon Nota che printfrestituisce un valore - il numero di caratteri stampati - quindi tecnicamente è una funzione.
Sjoerd,

@Sjoerd Non sono d'accordo che printfsia un valore. Aveva un effetto collaterale specifico al di fuori del suo ambito di invocazione: vale a dire I / O a qualunque output standard si supponesse essere. Anche se Scott non era esplicito in questa distinzione, nelle funzioni di programmazione funzionale non si suppone che abbiano effetti collaterali e dovrebbe essere in grado di rispondere alle domande come se si avessero i dati reali che restituisce.
Alan,

4

buone risposte dettagliate sopra; la storia breve è che avranno tutti i gusti di subroutine; ciò che si intende per ciascun termine varierà in base al contesto del linguaggio di programmazione

in generale, le funzioni restituiscono un valore, ma non è necessario

i metodi sono attualmente termini OOP generici

in SQL, le stored procedure hanno output ma in genere restituiscono solo un codice di errore, mentre le funzioni definite dall'utente devono restituire un valore (che può essere un set di risultati)

di nuovo, la differenza precisa tra questi termini dipende da chi stai parlando!


2

L'80% della competenza è direttamente correlata alla familiarità con la nomenclatura,

Il 95% della produttività è la capacità di identificare ciò che è utile al momento nonostante i termini usati per descriverlo

Preferisco praticamente chiamarli tutti i metodi in c # tranne che quando ho usato MSSQL che avevamo sproc, ma ovviamente ora usiamo Postgres e si chiamano funzioni.


13
L'83,5% di tutte le statistiche è composto in loco ;-P
Django Reinhardt,

1
Devo ammettere che mi innervosisco quando sento qualcuno lanciare il termine "metodo" quando lavoro in un linguaggio non OO. Sembra essere fortemente correlato con l'esecuzione in codice non idiomatico.
Racheet,

Uso 'Metodo' quando mi riferisco al codice C perché molti programmatori OO con cui ho a che fare hanno una crisi mentale nell'udire i termini procedura o funzione. Per divertimento, se volessi davvero fare confusione con loro, potrei scambiare i termini in modo casuale. Non è buono, un po 'come invitare un poltergeist a casa tua ... :)
mattnz
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.