Avez-vous des astuces ou des techniques pour casser des classes de contrôleur de cacao en petits morceaux? Je trouve que ce que je fais que les contrôleurs finissent par être l'une des classes les plus complexes de ma conception. Les trucs de base sont simples, mais une fois que plusieurs feuilles pop-doutes ou des feuilles d'action fonctionnent, les choses deviennent inconfortablement complexes. Ce n'est pas que em> mauvais, mais j'aimerais toujours refroidir le code en plusieurs parties autonomes. P>
J'ai pensé à des catégories, mais le code n'est pas si indépendant (beaucoup de fois, il doit appuyer sur la viewwillappear, par exemple) et je trouve que je passe beaucoup de temps à combattre le compilateur. J'ai également pensé à ajouter de la fonctionnalité dans les couches utilisant l'héritage, mais cela ressemble à un hack. P>
3 Réponses :
Catégories est la voie à suivre. L'astuce (pour votre «non si indépendant») est de déclarer les méthodes de catégorie dans votre contrôleur principal .h Fichier (pas un fichier de contrôleur distinct + catégorie.h, il n'y en aura plus) puis mettez-les dans votre contrôleur + catégorie. m dossier. Comme ceci: évidemment, je n'ai pas inclus "myController.m", où vous mettez le "@synthesize" et quel que soit l'autre nécessaire pour le contrôleur principal / éveil-from- nib / autre chose. Quoi qu'il en soit, cela donne à vos méthodes de contrôleur l'accès aux méthodes de catégorie et à Vise-Versa, et les méthodes de catégorie ont accès à toutes les propriétés. P> P>
Le problème n'est pas une taille, mais la responsabilité. Votre contrôleur porte-t-il plus d'un chapeau? Si tel est le cas, soufflez-le dans plusieurs contrôleurs d'un emploi-par classe. P>
Catégories Aide avec la taille, mais pas la responsabilité. Si vous faites toujours plusieurs choses dans une classe (amalgametée), vous avez toujours un problème. les déplacer dans des fichiers séparés ne le résolvez pas. p>
Avoir de nombreuses catégories sur une seule classe apporte un risque de collision de méthodes: mettre en œuvre la même méthode dans plusieurs catégories, probablement en la mettant en œuvre dans la catégorie B tout en oubliant que la catégorie A est déjà une. Cela entraînera un problème lorsque l'objet vous envoie un message, en attendant la réponse d'une catégorie à ce message et à obtenir l'autre. P>
déclarant tous les em> des catégories dans l'en-tête de la classe principale atténue ce risque, comme vous pouvez le constater qu'une autre catégorie a déjà une méthode par le nom à laquelle vous êtes sur le point d'entrer. Cependant, chaque méthode que vous ajoutez, allonge ainsi le fichier d'en-tête, atténue l'atténuation. P>
Si votre contrôleur porte plus d'un chapeau, soufflez-le dans plusieurs classes. P>
Je recommande le livre de Martin Fowler "Refactoring". Le refactoring Votre code est en train de le nettoyer et de souffler trop gros classes (et des procédés et des fonctions) est un sous-ensemble de ce nettoyage. P>
Bien sûr, plusieurs classes qui étaient autrefois une fois une nécessité d'un remplacement de la communication précédemment interne dans la classe. Cocao fournit un certain nombre de solutions: P>
Vous n'avez pas besoin de choisir exactement un, et vous n'avez pas besoin de les utiliser tous. Quelles solutions sont appropriées dépendra exactement de quelle communication nécessite que vos nouvelles classes auront l'un avec l'autre. P>
Les blocs ont rendu ma vie beaucoup plus facile, car je peux supprimer les méthodes de délégation telles que celles requises par les pop-ovettes et les feuilles d'action (par exemple en utilisant GITUB.COM/ZOUL/LAMBDA-ALERT ). Je ne peux pas attendre que des blocs apparaissent sur iPad, je n'aurais pas dit qu'ils font une telle différence.
Dans le cacao ordinaire, NsviewController peut être utilisé pour gérer la complexité du contrôleur en permettant aux "composants" dans une fenêtre d'avoir ses propres contrôleurs globaux. P>
Vous pourrez peut-être faire quelque chose de similaire avec UIViewController, ou vous voudrez peut-être créer des "contrôleurs de coordonnage" en dehors de votre hiérarchie d'affichage / contrôleur d'affichage afin de gérer les comportements d'objets de votre modèle séparément. P>
Je ne connais pas le cacao, mais j'ai le même "problème" dans PHP à l'aide de la configuration MVC, alors je suppose que cela s'applique également à différentes langues. J'ai réfléchi à des sous-contrôleurs pour différentes parties, mais cela ne ferait que rendre l'ensemble beaucoup plus complexe. Et de cette façon, vous pouvez continuer à continuer de forer jusqu'à ce que vous ayez un sous-sous-sous-contrôleur lorsque vous écrivez quelque chose de gros et que cela ne devient vraiment pas difficile à maintenir. Curieux de voir quelles solutions viennent :)