2009-11-16 16 views
5

como desde el título. ¿Se considera aceptable que dos métodos, digamos foo() y foo (int), realicen dos operaciones no relacionadas? y por qué ?¿Se debe permitir que dos métodos sobrecargados se comporten de una manera completamente diferente?

Editar: gracias. Veo que no soy el único que piensa que es una herejía. :)

+1

eww todos en este hilo deben volver al lenguaje estático del que proceden:) siento que esta pregunta se plantea de forma que se obtenga una respuesta negativa. hay muchas circunstancias en las que la lógica de función dependiendo de una sobrecarga es perfectamente aceptable, como pasar una función de devolución de llamada. – Shawn

+1

pasando una devolución de llamada tal vez se utiliza para tener un canal de entrega de información, o registrar un controlador asincrónico. No veo ninguna razón por la que no pasar una devolución de llamada produce un comportamiento (es decir, desencadenar un evento) y al pasar produce uno completamente diferente (es decir, registrar un controlador para el evento) –

+0

Argumento Ad Populum es una falacia lógica. – Breton

Respuesta

12

No es aceptable.

Porque romperá las expectativas del usuario, lo que generará errores de comunicación.

IMO sería más claro utilizar un nombre de método diferente para diferentes operaciones.

Oh, espera, there is one situation whereby you might want to do this. Si usted piensa que su código es tan preciosa que necesita ofuscación y que la herramienta de ofuscación actual no es lo suficientemente bueno y que absolutamente positivamente debe hacerlo de forma manual, a continuación, sea mi invitado.

+4

Creo que prefiero apuñalarme a mí mismo que ofuscar así –

4

No. Porque el nombre del método debe describir el 'método' - es decir. el método del funcionamiento del código contenido en.

La sobrecarga es por conveniencia.

+1

¿Qué pasa si el nombre igualmente describe ambos métodos? – Breton

+0

¿Cómo puede el mismo nombre de método describir comportamientos contradictorios? –

+0

El ejemplo del que se originó esta pregunta fue .click(), que activaría el evento click, vs. Click (función) que vincularía una función al evento click. – Breton

2

Absolutamente no! ¿Por qué confundiría a los clientes potenciales de su código y sus mantenedores al sobrecargar un método y luego hacer que sus implementaciones realicen tareas no relacionadas? No es como si los nombres fueran una prioridad.

1

El problema puede estar en el esquema de nombres.

Si los nombres de sus métodos son consistentes con su función, entonces no puede tener dos métodos con el mismo nombre haciendo cosas diferentes.

2

¿Por qué no es aceptable?

Dado que diseña clases y métodos a , disminuya la complejidad de un programa, ambos en términos de código y semánticos.

Tener dos métodos con el mismo nombre pero diferentes firmas y el comportamiento rompería la encapsulación semántica y aumentar la complejidad (obligando al usuario a pensar cuidadosamente a la consecuencia real de llamar a una u otra función)

ahí la parte "no aceptable".


De código completo:

punto de vista sintáctico, es relativamente fácil de evitar meter las narices en el funcionamiento interno de otra clase simplemente declarando internalroutines de la clase y los datos * privateù.
Lograr la encapsulación semántica es otro asunto completamente diferente.
[...]

(su ejemplo sería)

hacer depender el código de cliente no en la interfaz pública de la clase, sino en su aplicación privada

(aquí foo() tiene una aplicación significativa diferente, entonces foo(int))

Cada vez que usted se encuentra buscando a una la implementación de la clase para calcular cómo usar la clase, no estás programando en la interfaz; está programando a través de la interfaz a la implementación.
Si está programando a través de la interfaz, la encapsulación está rota; y una vez que la encapsulación comienza a descomponerse, la abstracción no se quedará atrás.

3

El único caso en el que he visto algo así, que no se veía muy mal, era cuando un par getter/setter tenía el mismo nombre. He visto algunas bibliotecas que toman ese estilo. No estoy seguro de que me guste especialmente, pero tampoco parece irracional.
Por supuesto, un getter y setter son en realidad dos funciones extremadamente relacionadas, son solo lados opuestos de la misma moneda.

0

No!

Esta y otras características del lenguaje de programación son para hacer que el código sea más fácil de leer/comprender/mantener/evolucionar. Si tienes dos métodos con el mismo nombre haciendo cosas completamente diferentes, obtienes lo contrario: confusión.

2

Bueno, tan pronto como el nombre del método todavía describa la acción, todavía debería ser válido.

1

Respuesta corta: no.

Respuesta ligeramente más larga: dé vuelta la pregunta: ¿por qué tomar dos métodos que realizan operaciones no relacionadas y darles el mismo nombre?

5

. En ciertos casos, sigue el principio de la menor sorpresa. Considere el operador C++ minus:

operator-(void); 
operator-(const Other & o); 

Cuando se usa solo en una clase numérica, invierte el signo. Cuando se usa con un argumento, realiza una resta.

+0

Buena excepción, bien descubierto. –

0

No!

Los métodos de sobrecarga hacen las cosas lo suficientemente complicadas como son (Idealmente, nunca sobrecargaría los métodos, pero eso es imposible en la práctica).

No hay necesidad de complicar las cosas aún más al hacer que el resultado de esos métodos sea impredecible para las personas que usen el código más adelante.

5

Para pura conveniencia, sí - ejemplo de ello está en la biblioteca jQuery en la que si se invoca un método de controlador de eventos como bind o click internamente se los asigna a dos métodos distintos, en este caso bind o trigger dependiendo si se pasó una función (que se evalúa como verdadera y llama a bind o si no se pasó ningún argumento, undefined es falso y desencadena los manejadores de eventos).

jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick," + 
    "mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," + 
    "change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){ 

    // Handle event binding 
    jQuery.fn[name] = function(fn){ 
     return fn ? this.bind(name, fn) : this.trigger(name); 
    }; 
}); 

espera a downvotes

+0

cierto para jQuery, mantiene api, significa y lógico para la gran mayoría de la base de usuarios que son diseñadores, etc. – redsquare

+0

+1, pero creo que podría haber una mejor solución sin él. Esta respuesta es realmente la motivación detrás de mi pregunta. –

+0

stefano: echa un vistazo al libro 'javascript: the good parts.' creo que lo disfrutarías, y arroja algo de luz sobre estos diseños – Shawn

0

n ...

variaciones

sobrecargas debía ser examinado en un tema. Su funcionalidad general debe ser la misma que la de los demás, y diferir solo en las entradas que aceptan.

A menudo las sobrecargas se utilizan para proporcionar valores de parámetros predeterminados (en C#). p.ej.

// This signature allows for doing special processing 
public void ProcessItem(int index, bool doSpecialProcessing); 

// Most of the time special processing is not required, so call 
// this method 
public void ProcessItem(int index) 
{ 
    ProcessItem(index, false); 
} 
2

Algunas personas usan el nombre "método" cuando significan "operación" (que es parte de una clase 'interfaz pública').

Si quiere decir "método" en el sentido interno "cómo se implementa algo", entonces la respuesta es NO casi por definición porque "cómo" implica "qué".

Si quiere decir "operación", entonces SÍ. Implemente la operación utilizando los métodos que tengan más sentido en relación con la lista de parámetros dada. Por ejemplo, si en lugar de "foo", tiene "save (theOrder)" y "save (thePassenger)", sospecho que se comportarían de manera diferente .

+0

+1 es un buen ejemplo. tal vez sea importante definir el comportamiento del método por su "firma", es decir, el nombre del método y los parámetros. no solo el nombre del método en sí. –

Cuestiones relacionadas