Lorsque je divise de grandes méthodes (ou procédures ou fonctions - cette question n'est pas spécifique à la POO, mais comme je travaille dans les langues de POO 99% du temps, c'est la terminologie avec laquelle je suis le plus à l'aise) en beaucoup de petites , Je suis souvent mécontent des résultats. Il devient plus difficile de raisonner sur ces petites méthodes que lorsqu'elles n'étaient que des blocs de code dans la grande, car lorsque je les extrait, je perds beaucoup d'hypothèses sous-jacentes qui viennent du contexte de l'appelant.
Plus tard, quand je regarde ce code et que je vois des méthodes individuelles, je ne sais pas immédiatement d'où elles sont appelées et je les considère comme des méthodes privées ordinaires qui peuvent être appelées de n'importe où dans le fichier. Par exemple, imaginez une méthode d'initialisation (constructeur ou autre) divisée en une série de petites: dans le contexte de la méthode elle-même, vous savez clairement que l'état de l'objet est toujours invalide, mais dans une méthode privée ordinaire, vous passez probablement de l'hypothèse que cet objet est déjà initialisé et est dans un état valide.
La seule solution que j'ai vue pour cela est la where
clause de Haskell, qui vous permet de définir de petites fonctions qui ne sont utilisées que dans la fonction "parent". Fondamentalement, cela ressemble à ceci:
len x y = sqrt $ (sq x) + (sq y)
where sq a = a * a
Mais d'autres langues que j'utilise n'ont rien de tel - la chose la plus proche est de définir un lambda dans une portée locale, ce qui est probablement encore plus déroutant.
Donc, ma question est - rencontrez-vous cela, et voyez-vous même que c'est un problème? Si vous le faites, comment le résolvez-vous généralement, en particulier dans les langages de POO "grand public", comme Java / C # / C ++?
Modifier les doublons: Comme d'autres l'ont remarqué, il y a déjà des questions sur les méthodes de fractionnement et les petites questions qui sont à une ligne. Je les ai lus et ils ne discutent pas de la question des hypothèses sous - jacentes qui peuvent être dérivées du contexte de l'appelant (dans l'exemple ci-dessus, objet en cours d'initialisation). C'est le point de ma question, et c'est pourquoi ma question est différente.
Mise à jour: Si vous avez suivi cette question et cette discussion ci-dessous, vous pourriez apprécier cet article de John Carmack sur le sujet , en particulier:
Outre la connaissance du code en cours d'exécution, les fonctions en ligne ont également l'avantage de ne pas permettre d'appeler la fonction depuis d'autres endroits. Cela semble ridicule, mais il y a un point à cela. Au fur et à mesure qu'une base de code se développe au fil des années d'utilisation, il y aura de nombreuses opportunités de prendre un raccourci et d'appeler simplement une fonction qui ne fait que le travail qui, selon vous, doit être fait. Il peut y avoir une fonction FullUpdate () qui appelle PartialUpdateA () et PartialUpdateB (), mais dans certains cas particuliers, vous pouvez réaliser (ou penser) que vous n'avez besoin que de faire PartialUpdateB (), et vous êtes efficace en évitant les autres travail. Beaucoup, beaucoup de bugs en découlent. La plupart des bogues sont dus au fait que l'état d'exécution n'est pas exactement ce que vous pensez qu'il est.