function - procedimientos - ¿Cuál es la diferencia entre un método y una función?
metodo y funcion c# (30)
¿Puede alguien proporcionar una explicación simple de métodos vs. funciones en el contexto de la POO?
Diferencia entre métodos y funciones
De leer este documento en Microsoft
Los miembros que contienen código ejecutable se conocen colectivamente como miembros de la función de una clase. La sección anterior describe los métodos, que son el tipo principal de miembros de funciones. Esta sección describe los otros tipos de miembros de función admitidos por C #: constructores, propiedades, indizadores, eventos, operadores y finalizadores.
Así que los métodos son el subconjunto de las funciones. Cada método es una función, pero no todas las funciones son un método, por ejemplo, un constructor
no puede decirse como un método, sino que es una función.
A mi entender, un método es cualquier operación que se puede realizar en una clase. Es un término general utilizado en la programación.
En muchos idiomas los métodos están representados por funciones y subrutinas. La distinción principal que la mayoría de los lenguajes usa para estos es que las funciones pueden devolver un valor a la persona que llama y una subrutina no. Sin embargo, muchos idiomas modernos solo tienen funciones, pero estos pueden opcionalmente no devolver ningún valor.
Por ejemplo, supongamos que desea describir un gato y le gustaría poder bostezar. Crearía una clase Cat, con un método de bostezo, que probablemente sería una función sin ningún valor de retorno.
Aquí hay una explicación para el método vs. función usando ejemplos de JavaScript:
test(20, 50);
Esta función define y utiliza para ejecutar algunos pasos o devolver algo que se puede almacenar / usar en algún lugar.
Puede reutilizar el código: defina el código una vez y utilícelo varias veces.
Puede usar el mismo código muchas veces con diferentes argumentos para producir resultados diferentes.
var x = myFunction(4, 3); // Function is called, return value will end up in x
function myFunction(a, b) {
return a * b; // Function returns the product of a and b
}
var test = something.test();
aquí test () puede ser un método de algún objeto o un prototipo personalizado definido para objetos incorporados, aquí hay más explicación:
Los métodos de JavaScript son las acciones que se pueden realizar en los objetos.
Un método de JavaScript es una propiedad que contiene una definición de función.
Propiedad / método incorporado para cadenas en javascript:
var message = "Hello world!";
var x = message.toUpperCase();
//Output: HELLO WORLD!
Ejemplo personalizado:
function person(firstName, lastName, age, eyeColor) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
this.eyeColor = eyeColor;
this.changeName = function (name) {
this.lastName = name;
};
}
something.changeName("SomeName"); //This will change ''something'' objject''s name to ''SomeName''
Puede definir propiedades para String, Array, etc. también, por ejemplo.
String.prototype.distance = function (char) {
var index = this.indexOf(char);
if (index === -1) {
console.log(char + " does not appear in " + this);
} else {
console.log(char + " is " + (this.length - index) + " characters from the end of the string!");
}
};
var something = "ThisIsSomeString"
// now use distance like this, run and check console log
something.distance("m");
Algunas referencias: Método de objeto Javascript , Functions , Más información sobre el prototipo
Como mencionó Python, la siguiente podría ser una ilustración útil de la relación entre los métodos y los objetos en la mayoría de los lenguajes orientados a objetos modernos. En pocas palabras, lo que llaman "método" es solo una función a la que se le pasa un argumento adicional (como han señalado otras respuestas), pero Python lo hace más explícito que la mayoría de los idiomas.
# perfectly normal function
def hello(greetee):
print "Hello", greetee
# generalise a bit (still a function though)
def greet(greeting, greetee):
print greeting, greetee
# hide the greeting behind a layer of abstraction (still a function!)
def greet_with_greeter(greeter, greetee):
print greeter.greeting, greetee
# very simple class we can pass to greet_with_greeter
class Greeter(object):
def __init__(self, greeting):
self.greeting = greeting
# while we''re at it, here''s a method that uses self.greeting...
def greet(self, greetee):
print self.greeting, greetee
# save an object of class Greeter for later
hello_greeter = Greeter("Hello")
# now all of the following print the same message
hello("World")
greet("Hello", "World")
greet_with_greeter(hello_greeter, "World")
hello_greeter.greet("World")
Ahora compare la función greet_with_greeter
y el método greet
: la única diferencia es el nombre del primer parámetro (en la función lo llamé "greeter", en el método lo llamé "self"). Así que puedo usar el método de greet
exactamente de la misma manera que uso la función greet_with_greeter
(usando la sintaxis de "punto" para obtenerlo, ya que lo greet_with_greeter
dentro de una clase):
Greeter.greet(hello_greeter, "World")
Así que efectivamente he convertido un método en una función. ¿Puedo convertir una función en un método? Bueno, como Python te permite meterte con las clases una vez que están definidas, intentemos:
Greeter.greet2 = greet_with_greeter
hello_greeter.greet2("World")
Sí, la función greet_with_greeter
ahora también se conoce como el método greet2
. Esto muestra la única diferencia real entre un método y una función: cuando se llama a un método "en" un objeto llamando a object.method(args)
, el lenguaje lo convierte mágicamente en method(object, args)
.
(Los puristas de OO pueden argumentar que un método es algo diferente de una función, y si te metes en Python o Ruby avanzado - ¡o Smalltalk! - comenzarás a ver su punto. Además, algunos lenguajes dan a los métodos acceso especial a los bits de un objeto. Pero La principal diferencia conceptual sigue siendo el parámetro extra oculto.)
Digamos que una función es un bloque de código (generalmente con su propio alcance, y algunas veces con su propio cierre) que puede recibir algunos argumentos y también puede devolver un resultado.
Un método es una función que es propiedad de un objeto (en algunos sistemas orientados a objetos, es más correcto decir que es propiedad de una clase). Ser "propiedad" de un objeto / clase significa que se refiere al método a través del objeto / clase; por ejemplo, en Java, si desea invocar un método "open ()" propiedad de un objeto "door", debe escribir "door.open ()".
Por lo general, los métodos también obtienen algunos atributos adicionales que describen su comportamiento dentro del objeto / clase, por ejemplo: visibilidad (relacionado con el concepto de encapsulación orientado al objeto) que define de qué objetos (o clases) se puede invocar el método.
En muchos lenguajes orientados a objetos, todas las "funciones" pertenecen a algún objeto (o clase), por lo que en estos lenguajes no hay funciones que no sean métodos.
En C ++, a veces, el método se utiliza para reflejar la noción de función miembro de una clase. Sin embargo, recientemente encontré una declaración en el libro «The C ++ Programming Language 4th Edition», en la página 586 "Clases derivadas"
Una función virtual a veces se llama un método.
Esto es un poco confuso, pero dijo que a veces , por lo que tiene sentido, el creador de C ++ tiende a ver los métodos, ya que las funciones pueden invocarse en los objetos y comportarse como polimórficos.
En el mundo OO, los dos se usan comúnmente para significar lo mismo.
Desde una perspectiva de matemáticas y CS puras, una función siempre devolverá el mismo resultado cuando se llame con los mismos argumentos (f (x, y) = (x + y)). Por otro lado, un método generalmente se asocia con una instancia de una clase. Sin embargo, una vez más, la mayoría de los lenguajes OO modernos ya no usan el término "función" en su mayor parte. Muchos métodos estáticos pueden ser bastante similares a las funciones, ya que normalmente no tienen estado (no siempre es cierto).
En general: los métodos son funciones que pertenecen a una clase, las funciones pueden estar en cualquier otro ámbito del código, por lo que podría indicar que todos los métodos son funciones, pero no todas las funciones son métodos:
Tomemos el siguiente ejemplo de Python:
class Door:
def open(self):
print ''hello stranger''
def knock_door:
a_door = Door()
Door.open(a_door)
knock_door()
El ejemplo dado le muestra una clase llamada "Puerta" que tiene un método o acción llamada "abrir", se llama método porque se declaró dentro de una clase. Hay otra parte del código con "def" justo debajo que define una función, es una función porque no está declarada dentro de una clase, esta función llama al método que definimos dentro de nuestra clase como puede ver y finalmente la función está siendo Llamado por si mismo.
Como puede ver, puede llamar a una función en cualquier lugar, pero si desea llamar a un método, debe pasar un nuevo objeto del mismo tipo que la clase en que se declara el método (Class.method (objeto)) o tiene que invocar el método dentro del objeto (object.Method ()), al menos en python.
Piense en los métodos como cosas que solo puede hacer una entidad, por lo que si tiene una clase de Perros, tendría sentido tener una función de ladrido solo dentro de esa clase y ese sería un método. Si tiene también una clase de Persona, podría tener sentido escriba una "fuente" de función para que no pertenezca a ninguna clase, ya que tanto los humanos como los perros pueden ser alimentados y usted podría llamar a esa función una función ya que no pertenece a ninguna clase en particular.
En lenguajes OO como Object Pascal o C ++, un "método" es una función asociada con un objeto. Entonces, por ejemplo, un objeto "Perro" podría tener una función de "ladrido" y esto se consideraría un "Método". En contraste, la función "StrLen" está sola (proporciona la longitud de una cadena proporcionada como un argumento). Por lo tanto, es sólo una "función". Javascript es técnicamente orientado a objetos también, pero enfrenta muchas limitaciones en comparación con un lenguaje completo como C ++, C # o Pascal. No obstante, la distinción aún debe mantenerse.
Algunos datos adicionales: C # está totalmente orientado a objetos, por lo que no puede crear "funciones" independientes. En C #, cada función está vinculada a un objeto y, por lo tanto, es técnicamente un "método". El factor clave es que pocas personas en C # se refieren a ellos como "métodos", simplemente usan el término "funciones" porque no hay ninguna distinción real para hacer.
Finalmente, solo para que los gurús de Pascal no me busquen aquí, Pascal también diferencia entre "funciones" (que devuelven un valor) y "procedimientos" que no lo hacen. C # no hace esta distinción explícitamente, aunque puede, por supuesto, elegir devolver un valor o no.
En mi humilde opinión, las personas solo querían inventar nuevas palabras para facilitar la comunicación entre los programadores cuando querían referirse a funciones dentro de los objetos.
Si estás diciendo métodos, te refieres a funciones dentro de la clase. Si está diciendo funciones, quiere decir simplemente funciones fuera de la clase.
La verdad es que ambas palabras se usan para describir funciones. Incluso si lo usaste mal, no pasa nada malo. Ambas palabras describen bien lo que quieres lograr en tu código.
La función es un código que tiene que desempeñar un papel ( una función ) para hacer algo. El método es un método para resolver el problema.
Hace la misma cosa. Es la misma cosa. Si desea ser súper preciso e ir de acuerdo con la convención, puede llamar a los métodos como funciones dentro de los objetos.
Históricamente, puede haber una diferencia sutil con un "método" que es algo que no devuelve un valor, y una "función" que sí lo hace. Cada lenguaje tiene su propio léxico de términos con un significado especial.
En "C" , la palabra "función" significa una rutina de programa .
En Java , el término "función" no tiene ningún significado especial. Mientras que "método" significa una de las rutinas que forman la implementación de una clase.
En C # que se traduciría como:
public void DoSomething() {} // method
public int DoSomethingAndReturnMeANumber(){} // function
Pero en realidad, reitero que realmente no hay diferencia en los 2 conceptos. Si usa el término "función" en discusiones informales sobre Java, la gente asumirá que usted quiso decir "método" y continuará. No lo use en documentos o presentaciones sobre Java, o parecerá tonto.
La función es el concepto que pertenece principalmente a la programación orientada a procedimientos, donde una función es una entidad que puede procesar datos y le devuelve valor.
Método es el concepto de programación orientada a objetos donde un método es un miembro de una clase que principalmente procesa en los miembros de la clase.
La función es un conjunto de lógica que se puede utilizar para manipular datos. Mientras que, Método es una función que se utiliza para manipular los datos del objeto al que pertenece. Así que técnicamente, si tiene una función que no está completamente relacionada con su clase pero que fue declarada en la clase, no es un método; Se llama un mal diseño.
La función es un conjunto de lógica que se puede utilizar para manipular datos.
Mientras que, Método es una función que se utiliza para manipular los datos del objeto al que pertenece. Así que técnicamente, si tiene una función que no está completamente relacionada con su clase pero que fue declarada en la clase, no es un método; Se llama un mal diseño.
La función o un método es una pieza de código con nombre que realiza algunas operaciones y, opcionalmente, devuelve un valor.
En lenguaje C se usa el término función. La gente de Java y C # diría que es un método (y una función en este caso se define dentro de una clase / objeto).
Un programador de C ++ podría llamarlo una función o, a veces, un método (dependiendo de si está escribiendo código de estilo de procedimiento en C ++ o si está haciendo un modo orientado a objetos de C ++, también un programador de C / C ++ probablemente lo llamaría una función porque el término ''método'' menos utilizado en la literatura C / C ++).
Usas una función simplemente llamando su nombre como,
result = mySum(num1, num2);
Usted llamaría a un método haciendo referencia a su objeto primero como,
result = MyCalc.mySum(num1,num2);
Los métodos en una clase actúan en la instancia de la clase, llamada el objeto.
class Example
{
public int data = 0; // Each instance of Example holds its internal data. This is a "field", or "member variable".
public void UpdateData() // .. and manipulates it (This is a method by the way)
{
data = data + 1;
}
public void PrintData() // This is also a method
{
Console.WriteLine(data);
}
}
class Program
{
public static void Main()
{
Example exampleObject1 = new Example();
Example exampleObject2 = new Example();
exampleObject1.UpdateData();
exampleObject1.UpdateData();
exampleObject2.UpdateData();
exampleObject1.PrintData(); // Prints "2"
exampleObject2.PrintData(); // Prints "1"
}
}
Los métodos son funciones de las clases. En la jerga normal, las personas intercambian método y función por todas partes. Básicamente, puede pensar en ellos como lo mismo (no estoy seguro de si las funciones globales se denominan métodos).
No compliquemos lo que debería ser una respuesta muy simple. Métodos y funciones son lo mismo. Llamas a una función una función cuando está fuera de una clase, y llamas método a una función cuando está escrita dentro de una clase.
No soy un experto, pero esto es lo que sé:
La función es un término del lenguaje C, se refiere a un fragmento de código y el nombre de la función será el identificador para usar esta función.
Método es el término OO, normalmente tiene un puntero en el parámetro de función. No puede invocar este fragmento de código como C, necesita usar el objeto para invocarlo.
Los métodos de invocación también son diferentes. Aquí invoca significado para encontrar la dirección de este fragmento de código. C / C ++, el tiempo de enlace utilizará el símbolo de la función para localizar.
Objecive-C es diferente. Invoque una función de C para usar la estructura de datos para encontrar la dirección. Significa que todo se conoce en tiempo de ejecución.
Para una aproximación de primer orden, un método (en C ++ estilo OO) es otra palabra para una función miembro, que es una función que forma parte de una clase.
En lenguajes como C / C ++ puede tener funciones que no son miembros de una clase; no llamas a una función no asociada con una clase un método.
Sé que muchos otros ya han respondido, pero descubrí que lo siguiente es una respuesta simple y efectiva de una sola línea. Aunque no se ve mucho mejor que otras respuestas aquí, pero si lo lees con cuidado, tiene todo lo que necesitas saber sobre la función método vs.
Un método es una función que tiene un receptor definido, en términos de POO, un método es una función en una instancia de un objeto.
Si tienes ganas de leer aquí está "Mi introducción a los métodos OO"
La idea detrás del paradigma orientado a objetos es "amenazar" a que el software se compone de ... objetos "bien". Los objetos en el mundo real tienen propiedades, por ejemplo, si tiene un empleado, el empleado tiene un nombre, una identificación de empleado, una posición, pertenece a un departamento, etc., etc.
El objeto también sabe cómo tratar con sus atributos y realizar algunas operaciones en ellos. Digamos que si queremos saber qué está haciendo un empleado en este momento, le preguntaremos.
employe whatAreYouDoing.
Ese "whatAreYouDoing" es un "mensaje" enviado al objeto. El objeto sabe cómo responder a esas preguntas, se dice que tiene un "método" para resolver la pregunta.
Entonces, la forma en que los objetos tienen que exponer su comportamiento se llaman métodos. Los métodos así son el objeto artefacto que tiene que "hacer" algo.
Otros métodos posibles son
employee whatIsYourName
employee whatIsYourDepartmentsName
etc.
Por otro lado, las funciones son formas en que un lenguaje de programación tiene que computar algunos datos, por ejemplo, podría tener la función addValues (8, 8) que devuelve 16
// pseudo-code
function addValues( int x, int y ) return x + y
// call it
result = addValues( 8,8 )
print result // output is 16...
Desde que los primeros lenguajes de programación populares (como fortran, c, pascal) no cubrieron el paradigma OO, solo llaman a estos artefactos "funciones".
por ejemplo, la función anterior en C sería:
int addValues( int x, int y )
{
return x + y;
}
No es "natural" decir que un objeto tiene una "función" para realizar alguna acción, porque las funciones están más relacionadas con las cosas matemáticas, mientras que un empleado tiene poca matemática, pero puede tener métodos que hagan exactamente lo mismo que las funciones, por ejemplo, en Java, esta sería la función addValues equivalente.
public static int addValues( int x, int y ) {
return x + y;
}
¿Luce familiar? Eso es porque Java tiene sus raíces en C ++ y C ++ en C.
Al final, es solo un concepto, en la implementación pueden parecer iguales, pero en la documentación de OO se les llama método.
Aquí hay un ejemplo del objeto Employee anteriormente en Java.
public class Employee {
Department department;
String name;
public String whatsYourName(){
return this.name;
}
public String whatsYourDeparmentsName(){
return this.department.name();
}
public String whatAreYouDoing(){
return "nothing";
}
// Ignore the following, only set here for completness
public Employee( String name ) {
this.name = name;
}
}
// Usage sample.
Employee employee = new Employee( "John" ); // Creates an employee called John
// If I want to display what is this employee doing I could use its methods.
// to know it.
String name = employee.whatIsYourName():
String doingWhat = employee.whatAreYouDoint();
// Print the info to the console.
System.out.printf("Employee %s is doing: %s", name, doingWhat );
Output:
Employee John is doing nothing.
La diferencia entonces, está en el "dominio" donde se aplica.
AppleScript tiene la idea de "lenguaje natural" matphor, que en algún momento tuvo OO. Por ejemplo Smalltalk. Espero que le resulte más fácil comprender los métodos en los objetos después de leer esto.
NOTA: El código no debe compilarse, solo sirve como ejemplo. Siéntase libre de modificar la publicación y agregar el ejemplo de Python.
Un método está en un objeto.
Una función es independiente de un objeto.
Para Java, solo hay métodos.
Para C, solo hay funciones.
Para C ++ dependería de si estás o no en una clase.
Una función es una pieza de código que se llama por su nombre. Se pueden pasar datos para operar (es decir, los parámetros) y, opcionalmente, se pueden devolver datos (el valor de retorno). Todos los datos que se pasan a una función se pasan explícitamente.
Un método es una pieza de código que se llama con un nombre que está asociado con un objeto. En la mayoría de los aspectos, es idéntico a una función, excepto por dos diferencias clave:
- A un método se le pasa implícitamente el objeto sobre el que fue llamado.
- Un método puede operar con datos que están contenidos dentro de la clase (recordando que un objeto es una instancia de una clase - la clase es la definición, el objeto es una instancia de esos datos).
(Esta es una explicación simplificada, ignorando temas de scope etc.)
Una definición muy general de la diferencia principal entre una función y un método :
Las funciones se definen fuera de las clases, mientras que los Métodos se definen dentro y son parte de las clases.
Una forma sencilla de recordar:
- F unción → F ree (Libre significa que no pertenece a un objeto o clase)
- M ethod → M ember (Un miembro de un objeto o clase)
Una función es un concepto matemático. Por ejemplo:
f(x,y) = sin(x) + cos(y)
dice que la función f () devolverá el pecado del primer parámetro agregado al coseno del segundo parámetro. Es sólo matemáticas. Como sucede, sin () y cos () también son funciones. Una función tiene otra propiedad: todas las llamadas a una función con los mismos parámetros deben devolver el mismo resultado.
Un método, por otro lado, es una función que está relacionada con un objeto en un lenguaje orientado a objetos. Tiene un parámetro implícito: el objeto sobre el que se actúa (y su estado).
Entonces, si tienes un objeto Z con un método g (x), es posible que veas lo siguiente:
Z.g(x) = sin(x) + cos(Z.y)
En este caso, el parámetro x se pasa al mismo que en el ejemplo de función anterior. Sin embargo, el parámetro para cos () es un valor que vive dentro del objeto Z. Z y los datos que viven dentro de él (Zy) son parámetros implícitos del método g () de Z.
para mí: la función de un método y una función es la misma si estoy de acuerdo en que:
- una función puede devolver un valor
- puede esperar parámetros
Al igual que cualquier pieza de código, puede tener objetos que coloque y puede tener un objeto que se presente como resultado. Al hacerlo, podrían cambiar el estado de un objeto, pero eso no cambiaría su funcionamiento básico para mí.
Puede haber una diferencia de definición en las funciones de llamada de objetos u otros códigos. ¿Pero no es eso algo para una diferenciación verbal y es por eso que las personas los intercambian? Las menciones de ejemplo de cómputo con las que tendría cuidado. Porque contrate empleados para hacer mis cálculos:
new Employer().calculateSum( 8, 8 );
Al hacerlo de esa manera, puedo confiar en que un empleador es responsable de los cálculos. Si él quiere más dinero, lo libero y permito que la función del recolector de carbage de deshacerse de los empleados no utilizados haga el resto y obtenga un nuevo empleado.
Incluso argumentar que un método es una función de objetos y una función no conectada, la computación no me ayudará. El descriptor de la función en sí e idealmente la documentación de la función me dirá qué necesita y qué puede devolver. El resto, como manipular el estado de algún objeto, no es realmente transparente para mí. Espero que tanto las funciones como los métodos proporcionen y manipulen lo que dicen sin tener que saber en detalle cómo lo hacen. Incluso una función computacional pura podría cambiar el estado de la consola o agregarse a un archivo de registro.
''método'' es la palabra orientada a objetos para ''función'' . Eso es prácticamente todo lo que hay (es decir, no hay una diferencia real).
Desafortunadamente, creo que muchas de las respuestas aquí están perpetuando o promoviendo la idea de que hay una diferencia compleja y significativa.
Realmente, no hay mucho para eso, solo palabras diferentes para la misma cosa.
[adición tardía]
De hecho, como señaló Brian Neal en un comentario a esta pregunta , el estándar de C ++ nunca usa el término ''método'' cuando se refiere a funciones miembro. Algunas personas pueden tomar eso como una indicación de que C ++ no es realmente un lenguaje orientado a objetos; sin embargo, prefiero tomarlo como una indicación de que un grupo bastante inteligente de personas no creía que hubiera una razón particularmente fuerte para usar un término diferente.
Una clase es la recopilación de algunos datos y funciones, opcionalmente, con un constructor.
Mientras crea una instancia (copia, replicación) de esa clase en particular, el constructor inicializa la clase y devuelve un objeto.
Ahora la clase se convierte en objeto (sin constructor) y las funciones se conocen como método en el contexto del objeto.
Así que básicamente
Clase <== nuevo ==> Objeto
Función <== nuevo ==> Método
En java, generalmente se dice que el nombre del constructor es el mismo que el nombre de la clase, pero en real ese constructor es como el bloque de instancia y el bloque estático, pero con un usuario define el tipo de retorno (es decir, el tipo de clase)
Mientras que la clase puede tener un bloque estático, un bloque de instancia, un constructor, una función, el objeto generalmente solo tiene datos y método.