sinder un fichier source
wisky
Membre
J'ai actuellement un contrôleur principale qui a un fichier de plus de 2500 lignes (il contient toutes les IBActions et d'autre fonctions).
J'aimerais sinder le fichier mais certaines variables doivent être accessible de partout.
Je comptait créer d'autre contrôleur pour d'autre fonction mais comment accéder à ses nouveau contrôleur à partir de l'ancien? et comment faire pour accéder à une fonction étant dans un autre contrôleur?
[tt][MonControleur1 maFonction1];[/tt] fonctionne-t-il?
J'ai par ailleurs un fichier .h de configuration de l'application (il contient les DEFINE) puis-je ajouter mes variables globale dedans?
Je compte triée mes fonctions en les regroupant par type d'action et zone d'appel :
NotificationCenterMethodes
IBActionsForToolBar
IBActionsForPreferences
IBActionsForOtherMethodes
IBActionsForMenu
AnotherFonction
ListDelegateMethodes
PopupDelegateMethodes
L'avantage de ce regroupement est que la compilation est plus rapide (moins de fichier modifier et moins long)
Si je divague dite moi comment faire? :P
J'aimerais sinder le fichier mais certaines variables doivent être accessible de partout.
Je comptait créer d'autre contrôleur pour d'autre fonction mais comment accéder à ses nouveau contrôleur à partir de l'ancien? et comment faire pour accéder à une fonction étant dans un autre contrôleur?
[tt][MonControleur1 maFonction1];[/tt] fonctionne-t-il?
J'ai par ailleurs un fichier .h de configuration de l'application (il contient les DEFINE) puis-je ajouter mes variables globale dedans?
Je compte triée mes fonctions en les regroupant par type d'action et zone d'appel :
NotificationCenterMethodes
IBActionsForToolBar
IBActionsForPreferences
IBActionsForOtherMethodes
IBActionsForMenu
AnotherFonction
ListDelegateMethodes
PopupDelegateMethodes
L'avantage de ce regroupement est que la compilation est plus rapide (moins de fichier modifier et moins long)
Si je divague dite moi comment faire? :P
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Sinon, mis à part ça, tu as un boulot important qui t'attend ici.:P
Mais mon gros problème vient quand même des variables. Mon contrôleur faite 2500 lignes à cause de ça.
Oups non il fait maintenant 3000 lignes :P
Comment faire ça commence à ramer grave :why?:
Pour les fonctions globales j'ai créé une class AnotherFonction et je met les fonctions en fonction de méthode (+) et j'ajoute le fichier AnotherFonction.h là ou j'en est besoin. ça marche nikel.
Pour les autres c'est galère mais je comment à m'y faire. J'ai cependant des alertes du type "no maMethode: method found" quand j'appelle une fonction d'un parent d'une instance.
création de l'instance de la class
[tt]maNouvelleInstance = [MaClass init];
[maNouvelleInstance setParent:self]
[/tt]
dans la class, un accès à une fonction du parent:
[tt]
- (void)setParent:(id)sender{
parent = sender;
}
- (void)methode1{
[...]
[parent maMethodeAppeler]; // <--- c'est ici qu'il me fait l'aterte
[...]
}[/tt]
Comment faire pour enlever l'alerte??
* quand tu parles de regrouper tes méthodes "fonctionnellement", c'est une bonne idée. Peut être faire une catégories par "fonctionnalité" (genre une catégorie pour la toobar, une pour ...),
* pour tes variables, tu peux utiliser la directive extern pour qu'elles soient visibles de partout.
Attention cependant. Si l'utilisation des variables globales pour des constantes ne pose pas de problème (les #define dans ce cas là vont très bien), pour des variables vraiemnt variables, méfiance.
Ca rend le code difficilement maintenable car le moindre changement dans ces variables a des effets de bord non maitrisés.
En effet, quand tu modifies une variable locale à une méthode, tu analyses directement l'impact dans la dite méthode.
Pour une variable globale, faut se taper tout le code... :-\\
a+
[edit]
Ah oui, pour les warnings, tu peux utiliser les cast operator, à savoir [(type *)parent maMethodeAppeler]. Ca devrait te faire sauter l'warning :P
En ce moment je bouge les sourcesData de mes listes.
Comment faire pour avoir une fonction [tt]- (int)numberOfRowsInTableView:(NSTableView *)aTableView[/tt] (et les autres qui vont avec) par liste?
Créer une surcharge de NSTableView pour chaque liste suffit (en re-dirigant le delegate et le dataSource bien sûr)?
Pour les variables globales je les ai mise dans un fichier .h qui est inclue là ou j'en ai besoin (j'ai fait en sorte qu'elle ne soit pas déclaré plusieurs fois )
Je suis bon ou complètement à la rue?
[edit]
Pour :
Comment faire pour avoir une fonction [tt]- (int)numberOfRowsInTableView:(NSTableView *)aTableView[/tt] (et les autres qui vont avec) par liste?
Créer une surcharge de NSTableView pour chaque liste suffit (en re-dirigant le delegate et le dataSource bien sûr)?
J'ai créer un contrôleur par TableView et ça marche comme je veut
Choix numéro 2...;)
Pour bien faire les choses, il faut encapsuler et accessoriser tes variables globales pour qu'elles deviennent des variables d'instances.
Pour avoir des variables globales (des fois, on peut en avoir besoin), ce n'est pas la bonne technique.
La bonne technique, c'est de les déclarer dans un fichier .h (global.h ?) avec "extern" devant.
Ceci *déclare* les variables mais ne les *instancie* pas. De ce fait, tout fichier .c qui inclut le .h connaà®t l'existence des variables et peut les utiliser.
Les variables sont *instanciées* dans un fichier .c quelconque, de ton choix (global.c ?).
Tout marchera bien grâce à l'édition de liens.
Instancier des variables dans un fichier .h, c'est s'exposer à du "Duplicate Symbol". Idem pour le corps des fonctions : jamais dans le .h (sauf fonctions inline...)
+
Chacha
PS : et sinon, on peut pas changer le titre du thread en "scinder", des fois ;-) ?
Certes, mais c'est notamment pour les constantes qu'on peut avoir à s'en servir.
exemples : NSOrderedAscending, NSPDFPboardType, NSUTF8StringEncoding, ou toutes sortes de clef qu'on crée pour les notifications ou les userdefaults.
Après, il faut savoir de quoi a besoin macintosh_plus, ça dépend ce qu'il fait avec ses variables globales !
+
Chacha
Maintenant mon fichier de 3000 lignes est passé à 1100 lignes :P
Pour l'épurer j'ai créer environ 10 nouveau objet (par exemple pour les DataSources) <br />
Le travail n'est pas fini et loin de là , il me reste encore environ 5 objets à créer et à remplir.
Ensuite il me faudra me débarrasser de mes variables globales et tester sir toutes les fonctions fonctionnent correctement. Pour le moment elle sont là pour éviter de devoir trop réécrire d'un coup.
Ce petit remaniement me permet de ne plus avoir de warning lors de la compilation (contre ma centaine de warning habituel). J'ai l'impression d'avoir plus appris aujourd'hui que tout ce que j'ai appris depuis que je programme en Cocoa.
Accrochez-vous il va y avoir du travail pour vous dans pas longtemps :adios!: :adios!: :adios!:
En tout cas merci pour les réponses à mes questions bêtes ::)
[Fichier joint supprimé par l'administrateur]
Bravo pour la remise en question de ton propre code. C'est toujours un peu énervant de s'arrêter et de reprendre ce qu'on a fait.
On a l'impression de faire du sur place...
Mais tu l'as constaté toi même, c'est loin d'être une perte de temps et ça permet de tout réorganiser mieux vu que ta vision devient plus globale après tout le temps que t'as passé dessus.
Bref, bonne continuation dans tes remaniements et a+
Pour infos je suis en alternance et les vacances c'est le même régime que tout le monde. En ce moment je suis en partiel ce qui me donne un peut plus de temps. Je te rassure les nuits sont très très courte parfois inexistante.
A l'heure actuelle il ma fallut 15h de travail pour remanier le code et c'est pas fini J'en vois pas le bout, enfin si quand même 60% de réduction du fichier principal c'est pas mal Maintenant je vais très vite pour créer et remplir un objet j'ai déjà tester et je sais se que veut dire le compilateur quand il crie :P
Pour ma part, je n'arrive à me dégager que 1h30 de code par jour de semaine...
Bouh, ca va pas vite....
Ca avance carrément pas vite (le pire étant d'avoir Adium de lancé en plus d'Xcode, c'est antiproductif
Quand je pense que y'en a qui ont 2 semaines de vacances en ce moment... Ah que c'était bien d'être étudiant
Macintosh_plus : bien sûr ma remarque était à prendre au second degré
C'est évidemment justement très bien et louable de ta part que de vouloir faire du tri dans ton code pour justement le rendre plus clair, surtout qu'en général c'est pas super motivant de le faire car comme le dit leChatNoir, on a l'impression de faire du sur-place... Mais bon c'est très enrichissant 8) Et c'est comme ça qu'on apprend à mieux structurer ses futurs programmes :-*
8) ::) :fouf):
Ali : ne t'inquiète pas je ne l'ai pas mal pris c'est la vérité (enfin c'était) :P
J'ai lu ce fil ce matin et j'y ai réfléchis en me rendant à mon travail...
Comment faire si on a plusieurs fichiers nib (par exemple, un mainMenu.nib qui contient les 2-3 fenêtres princiaples d'une appli et un preferences.nib qui contient une fenêtre pour gérer les préférences), et qu'on a besoin d'accéder à la même instance du moteur depuis ces deux fichiers nib ???
Faut-il passer par des notifications dans ce cas ?
Tous les fichiers nib, que ce soit MainMenu chargé automatiquement au démarrage de l'appli ou les autres fichiers nib chargés plus tard, ont un point commun : le file's owner.
Le file's owner représente une instance d'un objet.
Pour le MainMenu, le file's owner est par défaut l'instance NSApplication stocké dans NSApp. Mais pour les autres fichiers, c'est paramétrable.
Par exemple, le MainMenu peut avoir un objet "super contrôleur" que tu utiliseras comme file's owner pour tes autres nibs. Comme ça, tous tes nibs auront connaissance du même objet (e verront les mêmes outlets et les mêmes actions).
C'est ainsi le moyen idéal pour faire communiquer tous tes nibs ensemble via ce "super contrôleur".
.
J'ai fait un petit projet de test et ça fonctionne impec !