Existe el clásico problema OOP de encadenamiento de métodos versus métodos de "punto de acceso único":
main.getA().getB().getC().transmogrify(x, y)
vs
main.getA().transmogrifyMyC(x, y)
La primera parece tener la ventaja de que cada clase solo es responsable de un conjunto más pequeño de operaciones, y hace que todo sea mucho más modular : agregar un método a C no requiere ningún esfuerzo en A, B o C para exponerlo.
La desventaja, por supuesto, es una encapsulación más débil , que resuelve el segundo código. Ahora A tiene el control de cada método que lo atraviesa y puede delegarlo en sus campos si así lo desea.
Me doy cuenta de que no hay una solución única y, por supuesto, depende del contexto, pero realmente me gustaría escuchar algunos comentarios sobre otras diferencias importantes entre los dos estilos, y en qué circunstancias debería preferir cualquiera de ellos, porque ahora, cuando lo intento para diseñar un código, siento que simplemente no estoy usando los argumentos para decidir de una forma u otra.