sinder un fichier source

wiskywisky 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

Réponses

  • Eddy58Eddy58 Membre
    février 2006 modifié #2
    Plutôt que de longues explications tu trouveras un mini projet d'exemple ici. :)

    Sinon, mis à  part ça, tu as un boulot important qui t'attend ici.:P
  • wiskywisky Membre
    23:10 modifié #3
    Le coup des outlet pour la communication entre les class me convient.
    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?:
  • wiskywisky Membre
    23:10 modifié #4
    Bon voilà  ce que j'ai déjà  fait:

    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??
  • LeChatNoirLeChatNoir Membre, Modérateur
    février 2006 modifié #5
    Plusieurs choses à  mon avis :
    * 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
  • wiskywisky Membre
    février 2006 modifié #6
    Pour les warning, j'ai simplement ajouter [tt]#import "monFichier.h"[/tt] là  ou j'utilise les méthodes d'une autre class (je suis fâché avec les fichiers d'entête). :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 ;)
  • Eddy58Eddy58 Membre
    23:10 modifié #7
    dans 1139997793:

    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?

    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. :)
  • ChachaChacha Membre
    23:10 modifié #8
    dans 1139997793:

    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 ;) )


    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.
    <br />extern int globalx;<br />extern float  globalf;<br />...<br />
    

    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 ;-) ?
  • Eddy58Eddy58 Membre
    23:10 modifié #9
    Je ne dis pas que c'est inefficace, mais cette pratique n'est guère conforme aux règles de conception objet. :o
  • ChachaChacha Membre
    23:10 modifié #10
    dans 1140027992:

    Je ne dis pas que c'est inefficace, mais cette pratique n'est guère conforme aux règles de conception objet.

    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
  • AliGatorAliGator Membre, Modérateur
    février 2006 modifié #11
    Je n'aimerai pas voir le code de Macintosh_plus, vu comment il en cause et comment il a l'air de s'embrouiller ça doit être un vrai fouilli loin des guidelines et d'une conception facile à  lire  :) ;D ;) :o
  • wiskywisky Membre
    février 2006 modifié #12
    Justement c'est ce que j'ai passé mon temps à  rectifier aujourd'hui mon cher AliGator. Quand tu a un fichier de plus de 3000 lignes qui sert à  tout et n'importe quoi c'est vite le fouillis.

    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) <3 <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]
  • LeChatNoirLeChatNoir Membre, Modérateur
    23:10 modifié #13
    Ah, ce que j'aimerai être étudiant et en vacances !  ::)
    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+
  • wiskywisky Membre
    23:10 modifié #14
    C'est clair je fait du sur place à  par la correction de bug que je voit sur le tas...
    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
  • LeChatNoirLeChatNoir Membre, Modérateur
    23:10 modifié #15
    Ah ben excuses, vu ton âge, le nombre de posts que tu produits en ce moment et la période, je croyais que t'étais en vacances...

    Pour ma part, je n'arrive à  me dégager que 1h30 de code par jour de semaine...

    Bouh, ca va pas vite....  :'(

  • AliGatorAliGator Membre, Modérateur
    février 2006 modifié #16
    Et moi en ce moment encore moins...
    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 :)  :o

    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  :-*
  • fouffouf Membre
    23:10 modifié #17
    dans 1140087406:

    Quand je pense que y'en a qui ont 2 semaines de vacances en ce moment... Ah que c'était bien d'être étudiant :)  :o


    8) ::) :fouf):
  • wiskywisky Membre
    février 2006 modifié #18
    Pour la petite infos je vient de créer une application très simple pour mon usage perso en moins de 4 heures chose que je n'arrivait pas a faire avant sauf sur REALbasic. Il y a donc du progrès. 8)


    Ali : ne t'inquiète pas je ne l'ai pas mal pris c'est la vérité (enfin c'était) :P
  • olofolof Membre
    23:10 modifié #19
    dans 1139986461:

    Le coup des outlet pour la communication entre les class me convient.


    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 ?
  • BruBru Membre
    23:10 modifié #20
    dans 1141111188:

    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".

    .
  • olofolof Membre
    23:10 modifié #21
    Super, merci Bru !

    J'ai fait un petit projet de test et ça fonctionne impec !

Connectez-vous ou Inscrivez-vous pour répondre.