Quando utilizar propriedades ou métodos?

Comments
oo
04 August 2008

A partir do momento que aceitamos ou escolhemos utilizar orientação a objetos acredito que devemos fazer de tudo para utilizá-la da melhor forma, ou seja, criar modelos simples (não simples demais) e que comuniquem seu objetivo de maneira clara e com fácil entendimento.

No entanto, poucas são as pessoas que realmente se preocupam se seu modelo está com o mínimo possível de qualidade (não é?), vista a quantidade de modelos orientados a banco de dados que vemos por ai. Menos pessoas ainda, são as que procuram entender e se aproveitar das sutilezas existentes nos objetos para tornar o modelo mais claro e ter como boa conseqüência a comunicação de suas intenções facilitada.

Bons designers utilizam-se da linguagem pra facilitar seu trabalho.

O ponto que me motivou a escrever sobre isso é o motivador para utilização de propriedades e métodos. Desde a teoria mais básica de orientação a objetos aprendemos que objetos são classes (entidades) que possuem estado (propriedades) e comportamento (métodos) próprio.

Em .NET possuímos propriedades nativamente. Em java obtemos propriedades através de métodos get() e set(), por exemplo. Diretamente ou não, todas as linguagens orientadas a objetos fornecem mecanismos para utilização de propriedades. Mas quando devemos utilizar propriedades ao invés de métodos?

Conforme a própria teoria, propriedades devem refletir o estado de um objeto, ou seja, as características que o definem naquele exato momento de sua vida. Como exemplo simples teríamos dentro de um objeto do tipo Cliente as propriedades: Nome, Telefone, Idade, Sexo, etc. No entanto, a partir do momento em que para responder a uma pergunta sobre seu estado o objeto precise efetuar algum tipo de processamento deveremos transformar a então propriedade em um método, pois propriedades devem ser utilizadas para descrever estado que seja sabido "de bate pronto" pelo objeto em questão. Qualquer outro tipo de resposta a perguntas feitas para o objeto deve ser respondida através de métodos.

Um exemplo um pouco mais concreto: vamos imaginar que estamos desenvolvendo um sistema de controle de usuários e que no momento de uma exclusão de usuário precisamos saber se ele possui ou não emails.

Podemos modelar desta maneira:

Utilizando propriedades

Claro que existem exceções, mas normalmente um usuário não sabe se possui emails (a não ser que fique de 5 em 5 minutos apertando o botão send/receive do outlook! :D) e no caso desta pergunta teria que sair de onde está, ir até sua mesa, abrir seu programa de email e verificar se possui ou não algum email. O administrador poderia checar, mas deveria também executar uma série de operações até descobrir se o usuário possui ou não emails. Sendo assim, acredito que essa operação deveria ser comunicada de forma explicita por meio de um método para que quem estivesse utilizando essa API soubesse que uma operação (processamento) irá ocorrer para checar se existem ou não emails.

Outro motivo para utilização de métodos nesses casos é a possível necessidade de passagens de parâmetros para essas verificações. Ainda no nosso cenário de controle de usuários, vamos assumir que um novo requisito deve ser implementado: somente os usuários que não receberam emails na última hora podem ser removidos. Se utilizarmos propriedades como no exemplo acima como iríamos fazer? Criar outra propriedade chamada "RecebeuEmailNaUltimaHora"? Ou poderíamos modelar dessa forma:

Desta maneira, acredito que o mundo real seja mais bem representado e o utilizador da API irá utilizar os métodos com mais cuidado, pois o modelo comunica que para fazer essa verificação é necessário processamento (que pode ou não ser pesado). Outro ponto a favor é que podemos ter (quanto menos melhor) diversos métodos para execução de operações, mas caso esse tipo de checagem deva ser feito de diversas maneiras não podemos sair criando uma propriedade para cada um dos cenários senão corremos um sério risco de desconfigurar a identidade do objeto por ter propriedades demais.

Como tudo em OO, não devemos ter isso como uma regra, mas sim verificar o que é melhor para cada cenário. Acredito que mais do que a sugestão apresentada nesse post, o mais importante é a mensagem de que devemos modelar com cuidado procurando abstrair nosso domínio da maneira mais fiel possível e comunicando o máximo através das ferramentas que a OO nos oferece.


<< Dica de Blog!
Agilidade na confecção de roupas!>> 
comments powered by Disqus
tucaz

tucaz

.NET Software Developer
About
All Posts
RSS
@tucaz
GitHub