Aqui estão alguns argumentos para propriedades e meus contra-argumentos:
Mais fácil de usar do que escrever métodos getter e setter
Os pares de métodos getter e setter são cheiros de código. Tornar mais fácil escrever isso é como tornar mais fácil a reprovação em um teste de matemática usando um formulário Scantron e preenchendo todos os 'C'. Objetos que contêm apenas estado, por persistência, não devem usar getters / setters e devem criar objetos imutáveis no momento da persistência.
O que é importante para um consumidor de um objeto é o que ele faz, não como ele faz. Seu comportamento é o que faz; seu estado é como ele faz isso. Se você se preocupa com o estado de um objeto (exceto pela persistência, embora isso também interrompa o OO), você simplesmente não está fazendo POO e perdendo suas vantagens.
Eles fornecem uma indicação aproximada do desempenho para os consumidores
Isso é algo que pode mudar no futuro, para qualquer propriedade. Suponha que na versão 1.0, acessar o PropertyX simplesmente retorne um campo. Na liberação 1.5, se o campo for nulo, o PropertyX usa o padrão Objeto Nulo para criar um novo objeto nulo. Na versão 2.0, o campo está sendo validado ainda mais pelo método getter no PropertyX.
À medida que a propriedade se torna cada vez mais complexa, a indicação de desempenho do uso de uma propriedade parece cada vez menos verdadeira.
Eles são melhores que os campos públicos
Isso é verdade. Mas o mesmo acontece com os métodos.
Eles representam um aspecto fundamentalmente diferente de um objeto que um método, e todos os consumidores do objeto devem se preocupar com isso.
Tem certeza de que ambas as afirmações acima são verdadeiras?
Eles são mais fáceis de digitar, cara
Claro, digitar myObject.Length
é mais fácil do que digitar myObject.Length()
, mas isso não poderia ser corrigido com um pouco de açúcar sintático?
Por que usar métodos em vez de propriedades?
Sem garantias de desempenho. A API permanecerá verdadeira, mesmo que o método fique mais complexo. O consumidor precisará criar um perfil de seu código se estiver enfrentando problemas de desempenho e não confiar na palavra da API.
Menos para o consumidor pensar. Esta propriedade possui um setter? Um método certamente não.
O consumidor está pensando a partir de uma mentalidade OOP adequada. Como consumidor de uma API, estou interessado em interagir com o comportamento de um objeto. Quando vejo propriedades na API, ela se parece muito com o estado. De fato, se as propriedades fizerem muito, elas nem deveriam ser propriedades; na verdade, as propriedades em uma API SÃO como elas aparecem para os consumidores.
O programador da API pensará mais profundamente sobre métodos com valores de retorno e evitará modificar o estado do objeto nesses métodos, se possível. A separação de comandos das consultas deve ser aplicada sempre que possível.
Então, pergunto: por que usar propriedades em vez de métodos? A maioria dos pontos no MSDN são odores de código por si só e não pertencem a propriedades ou métodos.
(Esses pensamentos vieram a mim depois de pensar no CQS.)
type GetFoo() void SetFoo()
dez mil vezes. Durante todo o meu tempo escrevendo código C #, nunca fui confundido com uma propriedade.