2010-03-12 14 views
12

Duplicar posible:
Properties vs Methods¿Dónde debe estar la línea entre la propiedad y el método?

Para muchas situaciones es obvio si algo debe ser una propiedad o un método sin embargo, hay elementos que podrían considerarse ambigua.

Propiedades obvia:

  • "nombre"
  • "longitud"

métodos obvios:

  • "SendMessage"
  • "Imprimir"

ambiguo:

  • "válido"/"IsValid"/"Validar"
  • /"IsInBounds"/"CheckBounds"
  • "dentro del campo"
  • "AverageChildValue "/" CalcAverageChildValue "
  • " ColorSaturation "/" SetColorSaturation "

Supongo que me inclinaría por los métodos ambiguos, pero ¿alguien sabe de una regla o convención que ayude a decidir esto? P.ej. ¿deberían todas las propiedades ser O (1)? ¿Una propiedad no podría cambiar otros datos (ColorSaturation podría cambiar los valores R, G, B)? ¿No debería ser una propiedad si hay cálculo o agregación?

Solo desde una perspectiva académica, (y no porque crea que sea una buena idea) hay una razón para no volverse loco con las propiedades y simplemente hacer todo lo que es un interrogatorio de la clase sin discutir, y todo lo que se puede cambiar sobre la clase con un solo argumento y no puede fallar, una propiedad?

+0

Wiki de la comunidad? Como esto parece un poco discutible y subjetivo ... o re-etiqueta esto como subjetivo ... pero tu pregunta probablemente terminará cerrada ...?! – t0mm13b

+1

Esta es una pregunta duplicada, ¡probablemente varias veces! Ej: http://stackoverflow.com/questions/601621/properties-vs-methods – mjv

+0

¡Incluso algo tan "obvio" como "largo" no siempre es obvio! Por ejemplo, determinar la longitud de una lista vinculada implica atravesar toda la lista, una operación potencialmente costosa. Por lo tanto, puede elegir hacer que sea un método GetLength en su lugar, porque las personas esperan obtener una propiedad de bajo costo. – itowlson

Respuesta

10

Me suelen convertir una propiedad a una función de si tiene uno de los siguientes comportamientos

  • causa un efecto secundario (que no sea fijando el campo respaldo)
  • La implementación es caro en comparación con decir que un campo acceso
  • Implementación tiene complejidad mayor que log (n)
  • puede lanzar una excepción
+0

@JaredPar: ver http://stackoverflow.com/questions/448575/method-or-property-in-c/448599#448599 Sé que respondes muchas Q en SO, pero cuando aparece este tipo de plantas perennes, sería bueno limitar ese ruido. Dudo que te interesen los representantes, entonces ¿por qué no ayudar a mantenerlo ordenado? Gracias. – mjv

+0

@mjv, ya ha pasado el límite de rep para el día, por lo tanto, no para el representante :). Es interesante saber que he respondido esta pregunta antes. Pero, de nuevo, he dado más de 3000 respuestas en los últimos ~ 15 meses y es difícil tenerlas todas en mente. Esa respuesta particular fue dada hace más de 1 año. – JaredPar

+3

@mjv (cont) En general, no paso mucho tiempo buscando duplicados. Si miro una pregunta y estoy seguro o muy probable que sea un imbécil, me molestaré en buscarla. De lo contrario, no lo hago porque preferiría dedicar más tiempo a ayudar a las personas que darles el equivalente de un tortazo virtual por hacer una pregunta. También en este caso, aunque es probable que esta pregunta sea una estafa, la que está engañada no lo es. Lea atentamente el original y se pregunta cuándo un campo no debe exponerse como una propiedad. – JaredPar

1

Al decidir si usar una propiedad o un método, también debe considerar la cantidad de trabajo que implica el método. Es decir. si es relativamente barato recuperar el valor, conviértalo en una propiedad, si es costoso, conviértalo en un método.

5

he encontró un texto interesante de este

MSDN | Properties vs Methods

EDITAR

Dice cosas como:

Usar una propiedad cuando

  • el miembro es un miembro de datos lógicos

utilizar un método cuando

  • La operación es una conversión, como Object.ToString.
  • La operación es lo suficientemente costosa como para que desee comunicarle al usuario que debe considerar almacenar en caché el resultado.
  • La obtención de un valor de propiedad con el acceso de get tendría un efecto secundario observable.
  • Llamar al miembro dos veces seguidas produce resultados diferentes.
  • El orden de ejecución es importante. Tenga en cuenta que las propiedades de un tipo se deben poder establecer y recuperar en cualquier orden.
  • El miembro es estático pero devuelve un valor que se puede cambiar.
  • El miembro devuelve una matriz. Las propiedades que devuelven matrices pueden ser muy engañosas.
  • Normalmente es necesario devolver una copia de la matriz interna para que el usuario no pueda cambiar el estado interno. Esto, junto con el hecho de que un usuario puede asumir fácilmente que es una propiedad indexada, conduce a un código ineficiente.
4

Otra consideración es la bindabilidad. La mayoría de los marcos pueden vincularse solo a las propiedades. Por ejemplo, si desea que IsValid se pueda utilizar en el enlace (por ejemplo, como fuente de enlace para la propiedad IsEnabled del botón Aceptar), tiene que ser una propiedad en lugar de un método.

0

Si puede calcular algo de lo que ya tiene, use los métodos, si su valor tiene que ser una base para operar o calcular algo más, debería ser una propiedad.

Por ejemplo, si desea comprobar si cierta entrada de usuario está actualizada y puede hacerlo con su algoritmo único patentado, utilice el método Validate(). Si el usuario solo le envía un formulario que envía nis su dirección actual es válida, use la propiedad valid.Pero es solo un enfoque común que puede variar dependiendo de lo que realmente desee.

+0

Los métodos y propiedades no tienen diferencia en el uso de la memoria o la velocidad de ejecución. Una propiedad es solo azúcar sintáctica para un par de métodos (o incluso solo un método único para propiedades de solo lectura o de solo escritura). Puede estar pensando en campos en lugar de propiedades. – itowlson

+0

Tienes razón, mi error. Remoto. –

0

Yo personalmente hago la elección de la complejidad y lo que el método/propiedad va a hacer. Si lo único que hago es establecer un valor, es decir, _name = something ;, entonces voy con una propiedad. Incluso si voy a hacer algunos cálculos muy básicos o declaraciones condicionales, me quedaré con una propiedad. Pero si algo va a necesitar un trabajo serio o incluso un trabajo moderado, usaría un método. Nada me agrega más que establecer una propiedad y de repente se ejecuta un montón más de código de lo que esperaba.

Cuestiones relacionadas