Há o problema clássico de POO do encadeamento de métodos versus métodos de "ponto de acesso único":
main.getA().getB().getC().transmogrify(x, y)
vs
main.getA().transmogrifyMyC(x, y)
A primeira parece ter a vantagem de que cada classe é responsável apenas por um conjunto menor de operações e torna tudo muito mais modular - adicionar um método a C não requer nenhum esforço em A, B ou C para expô-lo.
A desvantagem, é claro, é o encapsulamento mais fraco , que o segundo código resolve. Agora, A tem controle de todos os métodos que passam por ele e pode delegá-lo a seus campos, se desejar.
Percebo que não há uma solução única e, é claro, depende do contexto, mas eu realmente gostaria de ouvir algumas opiniões sobre outras diferenças importantes entre os dois estilos e sob quais circunstâncias devo preferir um deles - porque agora, quando tento Para projetar algum código, sinto que não estou usando os argumentos para decidir de uma maneira ou de outra.