design - metodos - ¿Cuál es el uso/ventaja de la sobrecarga de funciones?
sobrecarga de metodos en python (10)
- Múltiples comportamientos para la misma función basados en los parámetros.
Su función puede querer trabajar con algunos detalles opcionales. Por ejemplo, el siguiente ejemplo desea agregar un miembro al objeto Members, con cualquier detalle que el usuario conozca. Aquí la edad es el detalle mínimo para crear un miembro, la edad y memberOf son opcionales. [Nota: la definición de funciones no se proporciona en el fragmento de código.]
public class Members { public System.Collections.Generic.List<Member> TeamMembers; public AddMember(Member m) {} public AddMember(string name) {} public AddMember(string name, int age) {} public AddMember(string name, int age, string[] memberOf) {} public class Member { public string Name { get; set; } public int Age { get; set; } public string[] MemberOf { get; set; } } }
Es posible que desee que su método sea adecuado para múltiples tipos de objetos. ex. El método Console.WriteLine () es capaz de escribir líneas vacías, bool, int, string, char [], float, etc. en la consola. Esto fue posible debido a la sobrecarga de funciones.
¿Cuál es el uso / ventaja de la sobrecarga de funciones?
A veces tiene múltiples formas de lograr lo mismo en función del contexto y las entradas disponibles. En el caso de los lenguajes estáticos estrictos, las definiciones de las funciones pueden ser bastante rígidas y deben definirse explícitamente de antemano.
Los constructores son generalmente el mejor ejemplo clásico de esto. Si está construyendo un objeto complejo y no tiene todas las piezas, aún desea poder pasar lo que tiene a un constructor y dejar que complete el resto. Y lo que tiene puede variar enormemente y debe definirse de diferentes maneras como parámetros para los constructores.
Es el mecanismo de función con el mismo nombre pero realiza tareas diferentes en diferentes instancias. Recordamos fácilmente los nombres que se usan comúnmente.
Es posible que desee hacer cosas similares en el código con diferentes parámetros. Si tuviera que darle a cada función un nombre diferente, la legibilidad del código sería muy mala.
La sobrecarga es una forma de polimorfismo. Le permite al programador escribir funciones para hacer conceptualmente lo mismo en diferentes tipos de datos sin cambiar el nombre. (También le permite al programador escribir funciones para hacer cosas conceptualmente diferentes dependiendo de los parámetros, pero esa es una idea realmente mala).
Esto permite consistencia en la notación, lo cual es bueno tanto para leer como para escribir código. I / O es un uso muy común. En la mayoría de los lenguajes de uso común, hay una función u operador que generará lo que desee, como printf()
y kin en C, operator<<()
en C ++, PRINT
en los viejos BASICS que solía usar, lo que sea. Los idiomas que requieren funciones como printint()
, printstring()
, printfloat()
y similares nunca se han puesto de printfloat()
.
Funciona muy bien con las plantillas de C ++ y cualquier otra construcción en la que no necesariamente se sepa cuál es el tipo de variable en el momento de escribir el código.
OMI, el beneficio principal es la consistencia en el nombramiento de métodos / funciones que lógicamente realizan tareas muy similares, y difieren ligeramente al aceptar diferentes parámetros. Esto permite reutilizar el mismo nombre de método en múltiples implementaciones.
por ejemplo, las sobrecargas: (Bueno)
function Person[] FindPersons(string nameOfPerson) { ... }
function Person[] FindPersons(date dateOfBirth) { ... }
function Person[] FindPersons(int age, string dogsName) { ... }
Son preferibles a las funciones de ''nombre único'': (Peor)
function Person[] FindPersonsByName(string nameOfPerson) { ... }
function Person[] FindPersonsByDOB(date dateOfBirth) { ... }
function Person[] FindPersonsByAgeAndDogsName(int age, string dogsName) { ... }
De esta forma, el programador que escribe un cliente que llama / consume estas funciones puede operar a un nivel superior de pensamiento conceptual ("Necesito encontrar a una persona") y no necesita recordar / localizar un nombre de función artificial.
Con el tipado estático, el compilador quedará para que coincida con la sobrecarga aplicable en función de los parámetros de uso. Para el tipado dinámico, este mismo emparejamiento ocurrirá en tiempo de ejecución, lo que posiblemente resulte en una falla si no se encuentra una coincidencia adecuada.
Pregunta muy válida
Obtienes consistencia al nombrar, pero a costa de la ambigüedad sobre la implementación exacta .
El verdadero problema es la memoria humana para los nombres de los métodos, ¿verdad? nos resulta más fácil recordar los nombres que se usan comúnmente.
y economía de tipeo, lo que permite nombres de método más cortos? menos nombres diferentes significa (matemáticamente) que el nombre en sí contenga menos información.
Estos dos problemas no deberían ser motivo de preocupación, con IDE que encuentran / adivinan / insertan nombres de método rápidamente en función de los primeros caracteres y tipos de parámetro / retorno.
Pero creo que hay un costo, en la precisión de la codificación, así como un beneficio.
Proporciona comportamiento múltiple al mismo objeto con respecto a los atributos del objeto.
Por ejemplo, un método llamado addUs(a,b)
agrega a
y b
.
Entonces la definición será:
int addUs(int a, int b){
return a+b;
}
Pero ahora si quieres que tus argumentos sean Objetos de una clase, di:
class Demo{
int height;
int width;
}
Desea la misma función addUs()
para devolver un nuevo objeto que tendría los atributos alto y ancho teniendo valores como suma del alto y ancho de los 2 argumentos pasados.
Entonces ahora la definición sería:
Demo addUs(Demo a Demo b){
Demo this;
this.height = a.height + b.height;
this.width = a.width + b.width;
return this;
}
Una función / método a veces puede tomar diferentes tipos de parámetros para hacer su trabajo. Este es el momento de la sobrecarga de funciones. De lo contrario, tendría que tener diferentes funciones para la misma funcionalidad , lo cual es confuso y una mala práctica.
- Los constructores son funciones, por lo que pueden estar sobrecargados. Esto es muy útil.
- Cuando se sobrecarga por primera vez, es fácil volverse demasiado elegante, pensando que le está haciendo un favor a los futuros desarrolladores al brindarles opciones más convenientes. Intenta evitar esto Las sobrecargas innecesarias pueden confundir a los futuros desarrolladores y causar códigos innecesarios para mantener.
polimorfismo ad-hoc es bueno!