Método vs Función vs Procedimiento

107

Pregunta simple, pero a menudo escucho estos tres términos definidos con tanta ferocidad, pero que sé que significan cosas diferentes a lo largo de los años.

¿Cuáles son las definiciones "correctas" de "Procedimientos", "Métodos", "Función", "Subrutinas", etc.

Django Reinhardt
fuente
44
renuncia a la "rutina"
mefisto
1
@teresko: Creo que "subrutina" es más común.
mk12

Respuestas:

108

Voy con una respuesta diferente aquí: prácticamente hablando, realmente no hay diferencia , con la ligera excepción de que "método" generalmente se refiere a una subrutina asociada con un objeto en lenguajes OO.

Los términos "procedimiento, función, subrutina, subprograma y método" realmente significan lo mismo: un subprograma invocable dentro de un programa más grande. Pero es difícil llegar a una definición que capture todos los usos variantes de estos términos, porque no se usan de manera consistente en los lenguajes o paradigmas de programación.

Se podría decir que una función devuelve un valor. Bueno, la siguiente función C no devuelve un valor:

void f() { return; }

... pero dudo que encuentres a alguien que lo llame un procedimiento.

Claro, en Pascal, los procedimientos no devuelven valores y las funciones devuelven valores, pero eso es simplemente un reflejo de cómo se diseñó Pascal. En Fortran, una función devuelve un valor y una subrutina devuelve múltiples valores. Sin embargo, nada de esto realmente nos permite llegar a una definición "universal" para estos términos.

De hecho, el término "programación procesal" se refiere a toda una clase de lenguajes, incluidos C, Fortran y Pascal, de los cuales solo uno realmente utiliza el término "procedimiento" para significar algo.

Entonces nada de esto es realmente consistente. La única excepción es probablemente el "método", que parece usarse casi por completo con los lenguajes OO, refiriéndose a una función asociada con un objeto. Aunque, incluso esto no siempre es consistente. C ++, por ejemplo, usualmente usa el término "función miembro" en lugar de método (aunque el término "método" se ha infiltrado en la lengua vernácula C ++ entre los programadores).

El punto es que nada de esto es realmente consistente. Simplemente refleja la terminología empleada por cualquier idioma que esté en boga en ese momento.

Charles Salvia
fuente
Eso es precisamente lo que pensé que era la respuesta. (Debería haber agregado "subrutina" como otra variante en retrospectiva.) Puedo preguntar: ¿Por qué no encontrarías a alguien que llame a esa función C un "Procedimiento"? ¿Porque es técnicamente incorrecto o porque el término "procedimiento" está actualmente fuera de moda?
Django Reinhardt
77
Los programadores de C usan el término "función" simplemente porque los diseñadores de C usaron ese término.
Charles Salvia el
15
No arrojemos al bebé con el agua del baño. El hecho de que la terminología no se use con total coherencia no significa que los diferentes términos no tengan significados diferentes. Las definiciones de @ Bruce y @ Frank son ampliamente reconocidas, no idiosincrásicas. El hecho de que los significados no sean universales es importante, pero no justifica el salto a "prácticamente hablando, realmente no hay diferencia". (@Django)
LarsH
99
Tipo de dual a C ++, que llama a los métodos "funciones miembro", Java y C # llama a las funciones "métodos estáticos".
Jörg W Mittag
2
La respuesta de Bruce es definitivamente la que debes elegir si eres nuevo en la programación. Sus definiciones serán absolutamente correctas, el 99% del tiempo. Pero estaba buscando una respuesta más técnica / teórica. A veces, los programadores más nuevos solo conocen su propio dominio e insisten en que eso es todo lo que hay. En realidad, hay programadores trabajando hoy que todavía usan idiomas antiguos y que no están "equivocados" para usar diferentes definiciones. Eso era lo que más me interesaba.
Django Reinhardt
67

Una función devuelve un valor, pero un procedimiento no.

Un método es similar a una función, pero es interno a parte de una clase. El término método se usa casi exclusivamente en la programación orientada a objetos.

Bruce Alderman
fuente
8
No exactamente interno. Un método es cualquier función o procedimiento que es parte de una clase.
Scott Whitlock
8
Entonces, ¿un "Procedimiento almacenado" en SQL no devuelve ningún valor? ¿Qué pasa con un "Procedimiento" en algo como Pascal? ¿Sus definiciones se basan en las tendencias actuales o deberían considerarse definiciones universales? ¡Gracias!
Django Reinhardt
3
@Django: en Pascal, un procedimiento no puede tener un valor de retorno, y una función debe tener un valor de retorno. En algunos otros idiomas, la terminología se puede usar más libremente.
Bruce Alderman el
1
FWIW, FORTRAN tenía SUBROUTINAS y FUNCIONES desde los primeros días, la diferencia es que una SUBROUTINA no devolvió un valor. No me acuerdo de ALGOL, del que desciende Pascal.
David Thornley el
2
@ 3p1c_d3m0n Es cierto que functioncumple ambos roles en JS, pero todas las funciones de JS regresan. Cuando una declaración de retorno no tiene valor, el valor es implícitamente undefined. Cuando no hay una declaración de retorno, el intérprete agrega una declaración de retorno implícita. Esotérico, tal vez, pero es consistente con la definición dada aquí. Por eso var x = function() {}();es legal en JS; de no ser por retornos implícitos, esto debería ser un error, como lo sería en Pascal.
Punto
52

Una función es algo que toma un montón de entradas y devuelve uno o más valores. Si los valores devueltos están completamente determinados por las entradas, y la función no tiene ningún efecto secundario (registro, tal vez, o causar cambios de estado fuera de sí misma), entonces se llama una función pura.

Un procedimiento es una función que no devuelve un valor. En particular, esto significa que un procedimiento solo puede causar efectos secundarios. (¡Eso podría incluir mutar un parámetro de entrada!)

Un método es una función que se cierra sobre un conjunto de variables, es decir, un cierre . Toma cero o más parámetros de entrada, tiene acceso a este conjunto de variables y devuelve cero o más valores. En los lenguajes OO, estos métodos están unidos a objetos o clases.

En la mayoría de los lenguajes OO convencionales, esas variables cerradas se denominan campos miembros, o variables de instancia, de un objeto. Un método puede ser una función pura, una función impura o un procedimiento.

La última definición lleva a la correspondencia objeto = estructura + cierres .

Frank Shearar
fuente
55
Entonces, un objeto es una colección de variables y una colección de cierres sobre estas variables comunes. Básicamente, los lenguajes orientados a objetos siempre han tenido cierres y nadie lo sabía. Interesante vista! +1
Giorgio
1
No creo que la mayoría de los métodos se cierren sobre nada. foo.doSomething()No es sin parámetros. Tiene un parámetro (el objeto foo) dado con algo de azúcar sintáctico. Un cierre podría hacer referencia a su objeto sin necesidad de dicho parámetro. Eso no quiere decir que los métodos no puedan ser cierres, solo que la mayoría no lo son, y que ser OO no es suficiente para que un lenguaje respalde los cierres.
8bittree
3
foo.doSomething()se cierra sobre la foovariable. Cualquier declaración doSomethingpuede acceder a footravés de thiso self, según su idioma. Esta es la definición misma de "close over". Las clases se cierran sobre sus variables miembro, por lo tanto (ignorando "lo que es OO"), OO es suficiente. Esto es bastante conocido en la literatura ...
Frank Shearar
1
Er, no ¿Ves ese pequeño foo.frente foo.doSomething()? Ese es usted pasando doSomething()un parámetro. El hecho de que no esté entre paréntesis no significa que no sea un parámetro. El thiso selfdentro del método es simplemente azúcar sintáctico para hacer referencia a ese parámetro.
8bittree
1
@FrankShearar, diría que solo hay dos distinciones razonablemente claras en informática: datos e instrucciones. Incluso eso se va por la ventana en el caso (inusual) de código auto modificable. En OO, lo que generalmente se conoce como un "método" (o una "función miembro") no necesita ser un método o una función según su definición; todas estas palabras de uso general son efectivamente sinónimos con un significado general e intercambiable. La "función impura" a cuya existencia se alude, es simplemente otro (y también el sinónimo más largo y jerárquico) para el mismo concepto general de "instrucciones".
Steve
14

Bruce tiene una buena respuesta . Yo agregaría, semánticamente:

  • Un procedimiento debe "hacer algo" a los argumentos o causar algún otro efecto secundario (por ejemplo printf)
  • Una función debe (a) responder una pregunta sobre los argumentos, o (b) calcular un nuevo valor basado en los argumentos
  • Un método de función debería responder una pregunta sobre el estado del objeto
  • Un método de procedimiento debería cambiar el estado del objeto.
Scott Whitlock
fuente
¡Gran respuesta! Solo una pequeña adición: A procedure should "do something" to the arguments- o causar algún otro efecto secundario (por ejemplo printf).
Allon Guralnek
1
@Allon Note que printfdevuelve un valor, el número de caracteres impresos, por lo que técnicamente es una función.
Sjoerd
@Sjoerd No estoy de acuerdo con que printfsea ​​un valor. Tuvo un efecto secundario específico fuera de su alcance de invocación: es decir, E / S a cualquier salida estándar que se supone que es. Aunque Scott no fue explícito con esta distinción, en las funciones de programación funcional no se supone que tengan efectos secundarios, y deberían poder responder preguntas como si tuviera los datos reales que devuelve.
Alan
4

buenas respuestas detalladas arriba; la historia corta es que todos sabores de subrutinas; lo que significa cada término variará según el contexto del lenguaje de programación

en general, las funciones devuelven un valor, pero no tienen que

los métodos son términos genéricos de OOP en la actualidad

en SQL, los procedimientos almacenados tienen salidas, pero generalmente solo devuelven un código de error, mientras que las funciones definidas por el usuario deben devolver un valor (que puede ser un conjunto de resultados)

de nuevo, la diferencia precisa entre estos términos depende de con quién estés hablando.

Steven A. Lowe
fuente
2

El 80% de la competencia está directamente relacionada con la familiaridad con la nomenclatura,

El 95% de la productividad es la capacidad de identificar lo que es útil en este momento a pesar de los términos utilizados para describirlo.

Prefiero llamarlos todos los métodos en C #, excepto cuando usé MSSQL, teníamos sproc, pero por supuesto ahora usamos Postgres y se llaman funciones.

MvcCmsJon
fuente
13
El 83.5% de todas las estadísticas se componen sobre el terreno ;-P
Django Reinhardt
1
Tengo que admitir que me pongo nervioso cuando escucho a alguien que usa el término "método" cuando trabaja en un idioma que no es OO. Parece estar fuertemente correlacionado con encontrarse con un código no idiomático.
Racheet
Uso 'Método' cuando me refiero al código C porque muchos programadores de OO con los que trato tienen un colapso mental al escuchar los términos procedimiento o función. Por diversión, si realmente quiero meterme con ellos, podría intercambiar los términos al azar. No es bueno, es como invitar a un poltergeist a tu casa ... :)
mattnz