Usar una propiedad pública y un campo público

8

Donde trabajo, se desaconseja el uso de Propiedades. Tenemos herramientas de generación de código para "acelerar las cosas". Todos los datos del objeto terminan siendo campos públicos. Si solicita propiedades de todos modos, obtendrá algo como esto:

Public sFoo as String

Public Property Foo as String
  Get
    Return sFoo
  End Get
  Set(ByVal value as String)
    sFoo = value
  End Set
End Property

No puedo pensar en un argumento razonable para hacer esto. ¿Hay alguna buena razón para usar tanto una propiedad pública con un campo público?

Daniel
fuente
2
No. cambie el generador de código para generar la cadena pública Foo {get; conjunto; } en cambio
Steven A. Lowe
1
¿Hay alguna evidencia de que acelere las cosas? ¿Hay alguna evidencia de que el código cuando se ejecuta es diferente? Por qué estás preguntando esto; claramente ya sabes que esto es tonto. La carga de la prueba debe recaer en la persona que realiza esta práctica. Si no pueden justificarlo y no puedes hacer que cambien, ¡te recomendaría un nuevo trabajo!
Dave Hillier
44
¿Por qué un voto negativo? Es culpa del autor que en su empresa, hay pautas estúpidas.
Arseni Mourzenko
Posiblemente el campo estaba destinado a ser privado y devuelto por la Propiedad. Tal vez alguien conocía el concepto pero se equivocó a lo grande. Usar un campo privado expuesto como propiedad pública es una buena práctica de codificación y se usa incluso si no lo ve.
Piotr Kula

Respuestas:

28

No.

No hay una buena razón para esto. Eso:

  1. Confunde a otros programadores al hacer algo que no tiene sentido,
  2. Expone las entrañas de tu clase innecesariamente,
  3. Proporciona dos puntos de entrada para la misma cosa,
  4. ??

Utilice las propiedades implementadas automáticamente en su lugar.

Robert Harvey
fuente
55
¿El downvoter aboga seriamente por el uso de propiedades públicas y campos al mismo tiempo? Me estoy cansando de tener un solo voto negativo en cada respuesta que publico ... Si tiene tiempo suficiente para seguirme votando mis respuestas, necesita un nuevo pasatiempo.
Robert Harvey
Alguien te está acosando, Robert. No a mí porque esta es definitivamente la respuesta correcta y la pregunta del OP me ha sorprendido. Años de aprendizaje y escritura nunca se me pasó por la cabeza hacer algo así ...
Piotr Kula
También escuché que algunos argumentan que el uso de propiedades incurre en una penalización de rendimiento sobre el acceso directo a los campos, pero en general eso no es cierto. En cada versión del CLR que he encontrado, el optimizador casi siempre integra propiedades simples como esta, por lo que ni siquiera eso es una preocupación realista.
Cole Campbell
2

Uno de los principios orientados a objetos fundamentales se llama encapsulación. Dice que cada objeto debe proteger sus datos de modificaciones externas.

Esto se hace haciendo que todos los campos sean privados y, si es posible, también que todos los establecedores de propiedades sean privados. En su lugar, debe introducir el comportamiento agregando métodos que se utilizan para modificar el estado.

Lo que estás haciendo está muy mal. En esencia, es solo una programación funcional donde todas las clases son solo contenedores de datos o una forma de agrupar métodos juntos. El primero es un antipatrón llamado Modelo de dominio anémico .

El problema con eso es que la lógica de negocios para cada modelo de dominio se extiende por varios lugares en su aplicación (es decir, cada lugar donde se modifica el objeto). Por lo tanto, es difícil encontrar errores relacionados con las reglas de su negocio, ya que debe analizar cada lugar donde se usa el objeto, en lugar de analizarlo solo.

He blogueado sobre esto aquí: http://blog.gauffin.org/2012/06/protect-your-data/

jgauffin
fuente
1

¿Hay alguna buena razón para usar tanto una propiedad pública con un campo público?

En resumen: no , no hay justificación para eso. Las propiedades públicas tienen más usos comerciales que los campos públicos.

Algunos de los muchos usos de las propiedades son:

  • Las propiedades pueden validar datos antes de permitir un cambio
  • Puede exponer datos de forma transparente en una clase donde esos datos se recuperan realmente de alguna otra fuente, como una base de datos
  • Puede tomar una acción cuando se modifican los datos, como generar un evento o cambiar el valor de otros campos

Como ya se sugirió, usar las propiedades automáticas es otra forma inteligente de hacerlo.

Más detalles en MSDN - Propiedades de VB.NET

Yusubov
fuente