Si vos classes sont si grandes que vous envisagez de les découper en fichiers source distincts, vous avez probablement un problème de conception.
Le modèle de conception modèle-vue-contrôleur (meilleur, modèle-contrôleur-vue) crée un petit code modulaire presque automatiquement.
Le modèle gère tout ce qui concerne les données. La vue gère l'interface utilisateur visuelle réelle et le contrôleur colle les deux ensemble. Chacun est une classe distincte et, idéalement, le modèle et la vue doivent être si indépendants qu'ils peuvent être facilement branchés dans une autre application.
La clé est d'être totalement impitoyable dans la fonction de séparation. Il est toujours tentant de parquer les données dans le contrôleur. Cela est particulièrement vrai lorsque vous apprenez et écrivez de petits programmes avec très peu de données. Cependant, à mesure que la complexité des données augmente, votre contrôleur explose rapidement avec la complexité.
Toute bonne conception commence par le modèle de données. Le modèle doit gérer toutes les relations logiques avec les données, c'est-à-dire créer, modifier, vérifier, enregistrer, etc. Un modèle de données correctement conçu est totalement indépendant de l'interface utilisateur. Idéalement, un modèle de données devrait fonctionner avec des vues standard, des vues Web, une ligne de commande ou une URL exportée.
Je commence toujours un projet en créant le modèle de données dans une application de test avec l'interface minimale absolue. (Souvent, il ne s'agit que d'une application vierge qui se lance, manipule par programmation le modèle de données, imprime vers la console et se ferme.) Ce n'est que lorsque le modèle de données fonctionne indépendamment que je me tourne vers le reste du programme.
Maintenant que je comprends les opérations de données et de données, je peux concevoir une interface utilisateur pour chaque environnement que je vais utiliser. L'interface utilisateur comprend uniquement comment créer des éléments d'interface utilisateur et comment réagir aux événements. Il ne contient aucune donnée ou même logique reliant les éléments les uns aux autres.
Le contrôleur colle la vue et le modèle de données ensemble. Le contrôleur ne sait que les messages à envoyer au modèle de données pour obtenir les données qui vont dans un élément d'interface utilisateur particulier en réponse à un événement particulier. Il ne valide pas les données et n'effectue aucune opération logique sur celles-ci. Il achemine simplement l'information entre le modèle de données et la vue du moment.
Toute opération, telle que l'impression, qui crée une autre interface doit avoir son propre objet contrôleur. Par exemple, lors de l'impression, seul le modèle de données comprend comment toutes les données s'emboîtent sur une page. Il n'y a aucune raison pour que le même contrôleur qui contrôle la vue de l'interface utilisateur contrôle l'impression. Au lieu de cela, un contrôleur d'impression demande simplement au modèle de données les données à imprimer. Le contrôleur de l'interface utilisateur n'a rien d'autre à faire que d'appeler le contrôleur d'impression et de le diriger vers les données sélectionnées par l'utilisateur. Dans votre exemple, les méthodes de calcul se trouvent dans le modèle de données, les méthodes d'impression dans un contrôleur d'impression, etc. Avec model-view-controller, vous obtenez de nombreuses classes modulaires étonnamment faciles à gérer , testé et porté.
Merci beaucoup pour les extraits de code, Costique! Il me faudra un peu de temps pour étudier le code Apple (et lire aussi les 'catégories'), donc je ne pourrai pas l'essayer tout de suite, mais je devrais réussir à le finir ce week-end. Je reviendrai à vous alors. En attendant, merci encore pour votre aide :-) – Bender
De rien. – Costique