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.