11 de dezembro de 2008

Getters e Setters


Em OO (Orientação a Objetos), aprendemos que cada objeto deve ser independente e esconder detalhes de sua implementação. Você não precisa ver o projeto do motor do carro ou saber quais materiais foram usados na confecção do mesmo, para dirigi-lo: basta saber os detalhes básicos sobre condução. A esta técnica dá-se o nome de encapsulamento e ela permite distinguir entre a especificação e a implementação das operações (métodos) de um objeto, além de prover a modularidade, que permite uma melhor estruturação de aplicações ditas complexas, bem como a segurança dentro do sistema.

Desta forma, um objeto não pode ser capaz de acessar diretamente os atributos de outro, sob pena de violar os conceitos da OO e poder deixar estes atributos com valores inconsistentes. Tomemos como exemplo a classe Clock, apresentada na figura 1. Esta classe possui três atributos do tipo inteiro, que representam a hora, minuto e segundo de um relógio. Suponha que o atributo hour, aceite valores entre 0 e 23 e os outros dois, entre 0 e 59. Caso o acesso de outros objetos a estes atributos seja possível, pode ocorrer do valor de um deles ser alterado de forma errada, como o atributo hour receber o valor 29 ou mesmo um valor não inteiro.

Figura 1. Classe Clock.

Neste cenário, surgem os chamados métodos get e métodos set (getters e setters). Estes dois tipos de métodos podem ser criados para prover acesso externo a atributos de objetos, sem que estes sejam acessados diretamente de fora do objeto. Assim, em vez de uma entidade externa ao objeto, acessar os atributos deste, ela acessa um getter ou setter, que, por sua vez, acessará o atributo, realizando a operação adequada, da forma correta, sem colocar em risco a integridade do objeto. Como os próprios nomes dizem, métodos get (obter), servem para se acessar o valor de determinado atributo e métodos set (alterar), servem para mudar o valor do atributo, neste caso, implementando todas as formas de controle sobre sobre a consistência do atributo, ou seja, evitando que valores inválidos sejam passados ao atributo.

Em Java, temos os seguintes padrões para estes métodos: getAttribute() e setAttribute(value), onde Attribute corresponde ao nome do atributo e value, ao novo valor para o atributo. Acontece que muitos programadores pensam que obrigatoriamente deve haver um get e um set para cada atributo do objeto. Assim, caso um objeto possua 50 atributos, ele terá, no mínimo, 100 métodos! Levando em consideração que cada atributo seja declarado em uma linha e que cada método get ou set possua duas linhas, tem-se 250 linhas de código apenas para declaração e acesso a atributos (isso sem contar que, provalmente, muitos desses métodos jamais serão usados).

A dica neste ponto é: crie getters e setters apenas para atributos que precisem ser acessados fora de um objeto e evite ao máximo, classes fantoches.

De acordo com Blog Caelum, uma classe fantoche é a que não possui responsabilidade alguma, a não ser carregar um punhado de atributos.


Algumas vezes pode ser mais vantajoso criar um novo objeto, do que alterar os valores de um existente, sem contar que muitas vezes é desnecessário prover acesso a determinados atributos. Isso elimina a criação de getters e setters desnecessários, poupando tempo do programador e tornando mais objetiva a implementação da classe.

Apesar de parecer tedioso para iniciantes, os getters e os setters permitem que o encapsulamento, seja preservado. Isso é importante para manter a integridade de objetos e permite que em versões futuras da classe, o comportamento da mesma seja alterado, sem prejudicar a compatibilidade com versões anteriores.


Série Orientação a Objetos: Acesso a Atributos

Leia Também

5 comentários:

  1. Fala brother!

    Só uma dica, como vc fará uma TRIlogia(tri-brasileiro, hauahuahaua), acredito que fica interessante informar uma estimativa da próxima publicação e haver também um prazo entre elas, pois senão sua trilogia torna-se-ia em um único post. Agora vamos ao tema.

    A grande vantagem do seu texto é que foi escrito por quem aprendeu OO sozinho, vendo na marra sua usabilidade, como todo programador deve ser senão vira arrastador de botão.

    Eu particulamente sempre programei sobre o paradigma estruturado e agora com Python estou aprendendo OO, não vejo muita dificuldade na migração entre esses paradigmas, estruturado e OO.

    Seu texto foi feito de um programador para outro isso eu gostei MUITO nele.Os conceitos dos métodos get e set, da forma que você apresentou nenhum livro apresenta, todos citam o encapsulamento a nível de atributo, a partir dai fica a cargo do programador/leitor.

    Seu texto vem a esclarecer dúvidas claras da OO, a maior qualidade existe na mesma, você citou que é a reusailidade do código, não sei se 100%, mas grande parte que é feito com a OO pode ser feito de forma estruturada, porém perdendo a reutilização do código e compromentendo o encapsulamento, sem contar as referências ciclicas entre os módulos.

    Bom é isso inicialmente que eu tenho a falar.

    Abraço brow.

    Só mais um detalhe o CR foi uma ótima idéia, hoje apareceu uma mulher da Claro oferendo 3G para o proprietário da loja, deixei a mulher doido.kkkk

    ResponderExcluir
  2. Salve, salve!

    A minha idéia é de fazer uma trilogia, mas não pretendo manter muitas ligações entre os textos, para que possam ser lidos separadamente, sem perda de informações. Mais ou menos como eu fiz com a série MP3 no Linux.

    Fico grato pelos seus comentários positivos! Infelizmente, na faculdade, peguei uma das piores professoras em OO. Com isso, tive que correr atrás por fora, para aprender e o aprendizado tem sido constante.

    Não creio que seja fácil migrar para a programação OO. Um termo que o Deitel usa é a Programação Baseada em Objetos e, segundo ele, neste estilo de programação, utiliza-se a OO superficialmente. Isso é fácil. Creio que o grande desafio seja ver objetos em tudo, desde a especificação do problema, até a concepção. Isso é mais complicado, pois exige o uso de várias técnicas de OO, como abstração, encapsulamento, herança e polimorfismo.

    Realmente este texto está mais claro que em alguns livros, por ser prático. Nos livros, normalmente, eles apresentam os getters e os setters e dizem: "Use!". Só que eles não dizem que cada caso é um caso e, às vezes, esses métodos podem ser descartáveis. Nas próximas postagens, vou trazer esses conceitos para Python!

    Abraço!

    PS: Nós estamos o CR ser uma boa idéia! A mulher deve ter pirado... hehehe

    ResponderExcluir
  3. Pra variar o Deitel e suas frases. kkk

    Com certeza ele está certo sim, mas o processo varia de pessoa a pessoa pois cada um tem uma esperiencia diferente.

    Acredito que estejamos no caminho certo e que em breve poderemos utilizar os estudos para ganhar dinheiro.

    Abraço brow.

    ResponderExcluir
  4. Os Deitel são foda! xD
    Claro, o dinheiro pode ser consequência disso tudo, mas tem aquilo que ninguém tira de nós, jamais...
    []!

    ResponderExcluir
  5. ótima definição de get e set, era oq eu estava procurando, vlw!

    ResponderExcluir