Il y a le problème classique de POO de chaînage de méthodes vs méthodes de "point d'accès unique":
main.getA().getB().getC().transmogrify(x, y)
contre
main.getA().transmogrifyMyC(x, y)
La première semble avoir l'avantage que chaque classe n'est responsable que d'un ensemble plus petit d'opérations, et rend tout beaucoup plus modulaire - l'ajout d'une méthode à C ne nécessite aucun effort en A, B ou C pour l'exposer.
L'inconvénient, bien sûr, est une encapsulation plus faible , que le deuxième code résout. A contrôle maintenant toutes les méthodes qui la traversent et peut la déléguer à ses champs s'il le souhaite.
Je me rends compte qu'il n'y a pas de solution unique et cela dépend bien sûr du contexte, mais j'aimerais vraiment entendre des commentaires sur d'autres différences importantes entre les deux styles, et dans quelles circonstances devrais-je préférer l'un ou l'autre - parce qu'en ce moment, quand j'essaie pour concevoir du code, j'ai l'impression de ne pas utiliser les arguments pour décider d'une manière ou d'une autre.