2010-04-14 12 views
19

he visto a menudo en este código, pero cuando hablo de lo que no sé el nombre de tales 'patrón'¿Es este un patrón de diseño bien conocido? ¿Cual es su nombre?

tengo un método con 2 argumentos que llama a un método sobrecargado que tiene 3 argumentos e intencionalmente establece el tercero para cadena vacía.

public void DoWork(string name, string phoneNumber) 
{ 
    DoWork(name, phoneNumber, string.Empty) 
} 

private void DoWork(string name, string phoneNumber, string emailAddress) 
{ 
    //do the work 
} 

La razón por la que estoy haciendo esto es para no duplicar el código, y para permitir que las personas que llaman existentes siguen llamando al método que tiene sólo 2 parámetros.

¿Es este un patrón y tiene un nombre?

+4

¿No ha dicho DoWork (name, phoneNumber, string.Empty)? – Andrey

+0

sí Andrey, lo he editado ahora, gracias por señalarlo, y disculpe por cualquier confusión que esto pueda haber causado – GenEric35

+0

Gracias a todos por las respuestas rápidas, esperaré en caso de que alguien tenga un nombre para esto, ya que lo he visto bastante a menudo y quiere ponerle un nombre. Aceptaré una respuesta antes del final del día, gracias. – GenEric35

Respuesta

34

De hecho, es algo más que la sobrecarga de métodos (donde generalmente el mismo nombre de método tiene diferentes argumento tipos), este patrón específico - donde las sobrecargas son básicamente el mismo método, y el más corto invoca el más largo con valor predeterminado para emular parámetros opcionales: se denomina patrón telescópico/telescópico, generalmente se ve en los constructores, pero, por supuesto, se puede generalizar a cualquier método.


Para una cotización más autorizada, aquí es un extracto de eficaz de Java 2ª Edición, Tema 2: Considere un Builder cuando se enfrentan a muchos parámetros del constructor (excerpt online)

Tradicionalmente, los programadores han utilizado el constructor telescópico patrón, en el que se proporciona un constructor con solo los parámetros necesarios, otro con un solo parámetros opcionales, un tercero con dos parámetros opcionales, y así en ...

Nuevamente, por lo general, el patrón telescópico se discute dentro del contexto de los constructores (donde, por ejemplo, un constructor 2-arg tendría una línea this(arg1, arg2, ARG3_DEFAULT); para invocar el constructor 3-arg, etc.), pero no veo por qué no se puede generalizar a otros métodos también.


Otra cita autorizada, por desgracia con ninguna definición del patrón: Sun Developer Network: How to Write Doc Comments for the Javadoc Tool:

Aviso los métodos y constructores están en orden "telescópica", que significa el "no arg" forma primero, entonces la forma "1 arg", luego la forma "2 arg", y así sucesivamente.


Y otra cita al azar, con una definición más explícita del patrón: I Am Hate Method Overloading (And So Can You!):

Métodos telescópicos

que puede tener una función que toma un número de argumentos . Los últimos argumentos pueden no ser tan importantes, y la mayoría de los usuarios se sentirían molestos al tener que descubrir qué transmitirles. De modo que crea algunos métodos más con el mismo nombre y menos argumentos, que atraviesan el método "maestro".

Esta última cita propone directamente que el soporte de idiomas para los argumentos predeterminados es una alternativa mucho mejor.

+0

excelente respuesta, gracias – GenEric35

+1

@polygenelubricants: ¡Realmente aprecio sus comentarios, gracias! Mi punto es que, aunque estoy 100% de acuerdo con la idea general, no estoy muy convencido de este caso específico. El hecho de que teníamos OOP por 40 años y patrones de diseño por 30 años y por una situación tan común que apenas encontramos 3 referencias en el mundo llamando a eso un "patrón de diseño" (o al menos generalizando la idea), no te hace ¿Piensas que no hay un patrón de diseño aceptado y probablemente porque no es necesario? ¿Crees que es suficiente con los datos proporcionados que decir: este es el "patrón telescópico"? –

+1

@Claudio: _maybe_ el nombre aún no se ha difundido ampliamente, pero se usa en _Effective Java_, que creo que es un libro ampliamente leído. En cualquier caso, comencemos a usar el nombre en lugar de no nombrarlo en absoluto. Estamos usando el patrón (bueno o malo), así que en lugar de dejarlo sin nombre, bien podríamos llamarlo algo. Y lo que sabes, algunas personas ya lo hicieron. – polygenelubricants

20

El nombre del que está sobrecargando y no es un patrón de diseño, pero una característica POO

http://en.wikipedia.org/wiki/Method_overloading

+0

Ok, debería haber puesto el segundo método en privado, este es el caso donde el método sobrecargado está oculto para la persona que llama, y ​​los métodos sobrecargados son llamados por el padre. Ajustaré mi código, gracias. ¿Hay algún nombre para esta función o uso de método sobrecargado? – GenEric35

+1

IMO, la sobrecarga podría considerarse un patrón de diseño compatible con OOP y otros idiomas. – kenny

+0

Decir que esto es "solo sobrecarga de método" es como decir, p. el patrón de visitante es "solo despacho dinámico". Describe perfectamente la mecánica OOP, pero no aborda la noción completa de lo que es un patrón de diseño. – polygenelubricants

3

supongo bien sus DoWork métodos debería llamarse CreateContact o su llamada a CreateContact debería ser DoWork. ..

Pero esto no es realmente un patrón. Es solo un uso común de method overloading.

+0

Sí, podría haberlo llamado Crear contacto pero no quería involucrar a los constructores, ya que en mi ejemplo real esos son métodos estáticos, así que lo llamé DoWork. Entiendo que se llama sobrecarga de método, tal vez debería haber puesto esto en la pregunta para dejar en claro que sé que esas son versiones sobrecargadas del mismo método. Es el caso donde la persona que llama no puede llamar al método sobrecargado directamente, debería haber hecho el segundo privado, que editaré ahora. ¿Hay un nombre para este uso de método sobrecargado donde se llaman entre sí y solo uno de ellos es público? – GenEric35

+0

Hasta donde yo sé, eso es solo un uso de la sobrecarga en lugar de uno de los patrones aceptados. –

7

No, este no es un patrón de diseño en el grupo de los cuatro sentidos, pero es común en muchos idiomas que no permiten los parámetros predeterminados.

En un lenguaje como el rubí que podría hacer algo similar como sigue

def dowork(name, phoneNumber, emailAddress = '') 
    # code here 
    end 
4

Yo diría que esto es más o menos un C# 4 < trabajo en torno a la falta de argumentos por defecto. si prescribes a la escuela de pensamiento de "patrones carecen de características del lenguaje", supongo que podrías decir que es un patrón, aunque no uno que comúnmente se nombra.

editar: bien, su actualización realmente me ha echado, no veo lo que está tratando de hacer con un método público llamando a un método privado. en lo que concierne a la API pública, podría mover todo el código de métodos privados al método público y tener una variable local para el valor 'predeterminado'. o ambos métodos también son llamados desde otros lugares en la clase?

3

Se llama como Función de sobrecarga. En la función Sobrecarga, el nombre de una función es el mismo, pero difieren en el tipo de parámetro o en el número de parámetro. También se llama como falso polimorfismo. No es un patrón, es un concepto básico de OOP.

5

Es un ejemplo de un método de ayuda. La gente de Sheesh, al no estar en el libro de Gang of Four, no impide que sea un patrón. En el caso específico donde there helper es público y el método ayudado es privado, es un ejemplo de encapsulación. Posiblemente un poco demasiado encapsulado en este caso.

+0

que también me ayudó, gracias: D – GenEric35

2

Estoy de acuerdo con @polygenelubricants, pero me gustaría señalar que el patrón telescópico se puede utilizar aparte de la sobrecarga. Un ejemplo se encuentra en Objective-C, donde los selectores de métodos (firmas) deben ser únicos y no pueden sobrecargarse.

- (id)init { 
    return [self initWithParam:0]; 
} 

- (id)initWithParam:(int)param { 
    // Do real initialization here! 
    return self; 
} 
Cuestiones relacionadas