Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se
Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Pessoa.Telefone.GetTelefone() é prática ruim?

No exemplo do curso temos duas classes mais ou menos assim:

Pessoa Nome GetTelefone()

Telefone DDD Numero * GetTelefone()

O instrutor ensina criar dois método GetTelefone(), um para cada classe, e quando necessário saber o telefone da pessoa, utilizar o Pessoa.GetTelefone().

Nos meus projetos eu não costumo criar dois métodos, nesse caso pegaria o telefone da pessoa por Pessoa.Telefone.GetTelefone(). Por acaso esse meu jeito de escrever chega a ser uma prática ruim?

5 respostas

Boa tarde Tiago!

Até onde eu sei, o seu jeito de fazer está correto.

Você tem duas entidades, Pessoa e Telefone. Uma Pessoa tem um atributo Telefone, que na realidade é um Objeto da Classe Telefone, logo, não faria sentido ter o método getTelefone() na Classe Pessoa, mas apenas na Classe Telefone.

Se alguém tiver uma visão diferente, sou todo ouvidos. Rsrs

solução!

Olá, Tiago

O problema com pessoa.Telefone.GetTelefone() é o "odor" no código (code smell) chamado de "Message Chains", que ocorre quando um objeto é usado para acessar outro, que acessa outro, que acessa outro, até obtermos uma informação desejada. Veja um exemplo extremo disso:

a.GetB().GetC().GetD().GetE().GetInformacao();

O que vemos aí é um caso de Message Chains: uma "cadeia de mensagens" usada para acessar uma informação mais profunda. Isso quebra a chamada "Lei de Demeter" (Law of Demeter), que diz que "Cada unidade deve conversar somente com seus amigos, e nunca falar com estranhos": https://en.wikipedia.org/wiki/Law_of_Demeter

A Lei de Demeter visa manter o "Princípio de Ocultação de Informação" (Encapsulamento).

Aparentemente não há nada de errado com pessoa.Telefone.GetTelefone(), mas o princípio diz que seu código instancia a classe Pessoa porque confia nela. Portanto, pessoa.GetTelefone() é seguro porque é uma chamada "confiável". Já quando você usa pessoa.Telefone.GetTelefone(), seu código agora depende de um "estranho", que é a classe Telefone. Quanto maior dessa "cadeia de mensagens", maior o número de classes e comportamentos diferentes e "estranhos" que o cliente tem que lidar, introduzindo riscos para o funcionamento de um programa.

É claro que todo mundo já violou essas leis e princípios, mas é algo que precisamos saber.

Show de bola Marcelo! Obrigado pela resposta!

Show! Muito obrigado Marcelo! =D

Opa, eu que agradeço, Tiago e Jonas! Obrigado por participarem do fórum. Abraços!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software