Usando uma propriedade pública e um campo público

8

Onde trabalho, o uso de Propriedades é desencorajado. Temos ferramentas de geração de código para "acelerar as coisas". Todos os dados do objeto acabam sendo campos públicos. Se você solicitar propriedades de qualquer maneira, obterá algo como isto:

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

Não consigo pensar em um argumento razoável para fazer isso. Existem boas razões para usar uma propriedade pública com um campo público?

Daniel
fonte
2
não. altere o gerador de código para gerar a string pública Foo {get; conjunto; } em vez disso
Steven A. Lowe
1
Existe alguma evidência de que isso acelera as coisas? Existe alguma evidência de que o código, quando executado, seja diferente? Por que você está perguntando isso? você claramente já sabe que isso é idiota. O ônus da prova deve recair sobre a pessoa que pratica essa prática. Se eles não puderem justificá-lo e você não conseguir que eles mudem, recomendo um novo emprego!
21813 Dave Hillier
4
Por que um voto negativo? É culpa do autor que, em sua empresa, haja diretrizes estúpidas.
Arseni Mourzenko
Possivelmente, o campo deveria ser privado e devolvido pela propriedade. Talvez alguém meio que conhecesse o conceito, mas estragou tudo. Usar o campo privado exposto como propriedade pública é uma boa prática de codificação e usada mesmo que você não a veja.
Piotr Kula

Respostas:

28

Não.

Não há uma boa razão para isso. Isto:

  1. Confunde outros programadores fazendo algo que não faz sentido,
  2. Expõe as entranhas da sua classe desnecessariamente,
  3. Fornece dois pontos de entrada para a mesma coisa,
  4. ??

Use Propriedades implementadas automaticamente .

Robert Harvey
fonte
5
O downvoter está defendendo seriamente o uso de propriedades e campos públicos ao mesmo tempo? Estou ficando um pouco cansado de ter um único voto negativo em todas as respostas que eu postar ... Se você tiver tempo suficiente para me acompanhar, votando minhas respostas, precisará de um novo hobby.
Robert Harvey
Alguém está te perseguindo, Robert. Não sou eu, porque essa é definitivamente a resposta correta e a pergunta do OP me surpreendeu. Anos de aprendizado e escrevê-lo nem passou pela minha mente para fazer uma coisa dessas ..
Piotr Kula
Também ouvi dizer que alguns usam que as propriedades incorrem em uma penalidade de desempenho ao acessar diretamente os campos, mas em geral isso não é verdade. Em todas as versões do CLR que eu já encontrei, propriedades simples como essa são quase sempre incorporadas pelo otimizador, portanto, mesmo isso não é uma preocupação realista.
Cole Campbell
2

Um dos princípios orientados a objetos fundamentais é chamado de encapsulamento. Ele diz que cada objeto deve proteger seus dados contra modificações externas.

Isso é feito tornando todos os campos privados e, se possível, também torne todos os configuradores de propriedades privados. Em vez disso, você deve introduzir o comportamento adicionando métodos usados ​​para modificar o estado.

O que você está fazendo é muito errado. Em essência, é apenas uma programação funcional, onde todas as classes são apenas contêineres de dados ou uma maneira de agrupar métodos juntos. O primeiro é um anti-padrão chamado Modelo de Domínio Anêmico .

O problema disso é que a lógica de negócios de cada modelo de domínio está espalhada por vários locais do seu aplicativo (ou seja, todos os locais onde o objeto é modificado). Portanto, é difícil encontrar erros relacionados às regras de negócios, pois você precisa analisar todos os lugares em que o objeto é usado, em vez de apenas analisar o próprio objeto.

Eu escrevi sobre isso aqui: http://blog.gauffin.org/2012/06/protect-your-data/

jgauffin
fonte
1

Existem boas razões para usar uma propriedade pública com um campo público?

Resumindo: não , não há justificativa para isso. As propriedades públicas têm mais usos comerciais do que campos públicos.

Alguns dos muitos usos de propriedades são:

  • As propriedades podem validar dados antes de permitir uma alteração
  • Ele pode expor de forma transparente os dados de uma classe na qual esses dados são realmente recuperados de alguma outra fonte, como um banco de dados
  • Ele pode executar uma ação quando os dados são alterados, como aumentar um evento ou alterar o valor de outros campos

Como já sugerido, o uso de propriedades automáticas é outro caminho inteligente a seguir.

Mais detalhes nas propriedades do MSDN - VB.NET

Yusubov
fonte