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.
programming-practices
coding-standards
terminology
Django Reinhardt
fuente
fuente
Respuestas:
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:
... 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.
fuente
Una función devuelve un valor, pero un procedimiento no.
Un método es similar a una función, pero es
interno aparte de una clase. El término método se usa casi exclusivamente en la programación orientada a objetos.fuente
function
cumple ambos roles en JS, pero todas las funciones de JS regresan. Cuando una declaración de retorno no tiene valor, el valor es implícitamenteundefined
. 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 esovar 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.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 .
fuente
foo.doSomething()
No es sin parámetros. Tiene un parámetro (el objetofoo
) 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.foo.doSomething()
se cierra sobre lafoo
variable. Cualquier declaracióndoSomething
puede acceder afoo
través dethis
oself
, 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 ...foo.
frentefoo.doSomething()
? Ese es usted pasandodoSomething()
un parámetro. El hecho de que no esté entre paréntesis no significa que no sea un parámetro. Elthis
oself
dentro del método es simplemente azúcar sintáctico para hacer referencia a ese parámetro.Bruce tiene una buena respuesta . Yo agregaría, semánticamente:
printf
)fuente
A procedure should "do something" to the arguments
- o causar algún otro efecto secundario (por ejemploprintf
).printf
devuelve un valor, el número de caracteres impresos, por lo que técnicamente es una función.printf
sea 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.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.
fuente
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.
fuente