[Bonnes pratiques] Comment s'y retrouve-t-on dans les @property ?

Comment vous organisez-vous quand vos classes ont plusieurs dizaines (par exemple ≥ 20) de @property ?


 


Avez-vous mis en place une sorte de "Design Pattern"â„¢  :-* pour les classer/les organiser et vous y retrouver ?


 


Merci !


Réponses

  • muqaddarmuqaddar Administrateur

    Moi, en gros c'est d'abord les property avec outlets (UI) puis les property "classiques" sans outlet.


    J'essaie de grouper dans la mesure du possible par type (ex: tous les UIBarButtonItems ensemble), tous les NSArray ensembles...etc.


  • AliGatorAliGator Membre, Modérateur
    Oui j'ai un template de fichier custom que j'ai rajouté aux templates de Xcode et c'est mon template custom que j'utilise quand je fais File > New File dans Xcode.

    Dans ce template que j'ai créé, j'ai des "#pragma mark" pour séparer chaque section et grouper un peu mes éléments, séparer les #import des déclarations de constantes, de l'interface privée et les de @property, des méthodes publiques, des méthodes privées, des méthodes de delegate...
    Je déclare tout ça toujours dans le même ordre du coup, puisque mon template de fichier a déjà  les "en-têtes" (via ces "#pragma mark") dans le bon ordre pour ces section que je me suis imposé.
  • @Ali :


     


    et, concernant juste les @property, est-ce que tu les sépares en sous-groupes et, si oui, lesquels ?


     


    Pour l'instant, je les sépare plus ou moins en IBOutlets, weak, strong, mais je me demandais s'il y avait pas plus malin.


  • Voilà  ce que je fais, plus ou moins...


    J'aimerais pouvoir appliquer toujours les mêmes critères pour classer mes @property.


    Pour l'instant, ce n'est pas très formel.


     


    Je n'ai pas créé de template.


    Je vais peut-être attendre Xcode 5 (que je n'ai toujours pas vu!) pour le faire.



    //
    // GenericViewAndSelectTreeStructureVC.m
    //
    //

    #import "GenericViewAndSelectTreeStructureVC.h"


    /*
    Classes moteur
    */
    #import "Document.h"


    /*
    Classes singleton
    */


    /*
    Classes modèle
    */
    #import "Word.h"


    /*
    Catégories
    */
    #import "NSString+CBDCapitalizeFirstLetter.h"



    typedef BOOL(^BlockTestingObject)(id);


    @interface GenericViewAndSelectTreeStructureVC ()
    /*
    Pseudo-properties
    */
    @property (nonatomic, readonly) NSArray * rootObjects ;
    @property (nonatomic, readonly) NSString * subObjects ;
    @property (nonatomic, readonly) NSString * superObjects ;


    /*
    Properties strong
    */
    @property (nonatomic, readwrite, strong) id selectedObject ;
    @property (nonatomic, readwrite, strong) NSMutableArray * selectedObjects ;
    @property (nonatomic, strong) NSArray * arrayOfAllObjects ;
    @property (nonatomic, readonly) NSSortDescriptor *nameDescriptor ;
    @property (nonatomic, strong) Word * nameObject ;
    @property (nonatomic, copy) NSString * nameDescriptionMethod ;
    @property (nonatomic, copy) NSString * nameClass ;
    @property (nonatomic, strong) Document * document ;
    @property (nonatomic, copy) BlockTestingObject blockForCondition ;

    /*
    IBOutlets
    */
    @property (weak) IBOutlet NSOutlineView *outlineViewObjects;
    @property (weak) IBOutlet NSTableView *tableViewObjects;
    @property (weak) IBOutlet NSSearchField *searchField;
    @property (strong) IBOutlet NSArrayController *arrayControllerOfObjects;
    @property (weak) IBOutlet NSView *viewForSelection;

    /*
    Gestion de l'interface
    */
    @property (weak) IBOutlet NSTextField *labelChosenObjects;
    @property (weak) IBOutlet NSButton *buttonAddToList;
    @property (weak) IBOutlet NSButton *buttonRemoveLastFromList;

    @end
  • CéroceCéroce Membre, Modérateur
    septembre 2013 modifié #6

    Utilise les balises



    #pragma mark Section

    ou



    // MARK: Section

    Tu les retrouveras alors en cliquant en haut à  droite, sur le nom de méthode/fonction, à  droite du nom du fichier.


  • Encore mieux : 



    #pragma mark - Section

    Il va dessiner une ligne horizontale dans le menu des pragma mark !!


  • AliGatorAliGator Membre, Modérateur
    J'utilise les "#pragma mark - Imports" par exemple, par contre je ne vais pas jusqu'à  séparer en sous-groupes. Ca fait un peu too-much je trouve, perso.

    J'essaye de mettre quand même les imports dans l'ordre (Frameworks Apple, puis classe parente & co, puis classe métier/modèle...) et je sépare quand même mes @property IBOutlet des aurtes @property par un espace (ligne vide), mais sans #pragma mark pour autant. D'ailleurs une classe avec trop de @property c'est probablement/potentiellement aussi le signe qu'il faut peut-être découper en plusieurs fichiers et plusieurs classes (bon après c'est possible que tu n'aies pas le choix, mais ça devrait au moins te faire réfléchir)


  • D'ailleurs une classe avec trop de @property c'est probablement/potentiellement aussi le signe qu'il faut peut-être découper en plusieurs fichiers et plusieurs classes (bon après c'est possible que tu n'aies pas le choix, mais ça devrait au moins te faire réfléchir)




     


    Oui ça parait louche. 

  • colas_colas_ Membre
    janvier 2014 modifié #10

    Je vous propose la séparation de @properties comme ceci :


    • Properties de paramétrage
    • Properties strong
    • Properties-référence (weak)
    • Properties de convenance
    • IBOutlets

    Si vous voyez comment améliorer le classement, n'hésitez pas !



    @interface MyClass ()

    #pragma mark -


    #pragma mark Properties de paramétrage
    @property ;CGFloat height ;


    ​#pragma mark Properties strong
    @property (strong) Helper * myHelper ;


    #pragma mark Properties-référence
    @property (weak) id refObject ;


    #pragma mark Properties de convenance
    @property (readonly) NSString *fullName;


    #pragma mark IBOutlets
    @property (weak) IBOutlet NSTextField *labelChosenObjects;
    @property (weak) IBOutlet NSButton *buttonAddToList;
    @property (weak) IBOutlet NSButton *buttonRemoveLastFromList;

    @end

    PS : par où commence-t-on pour créer un template pour xcode5 ?


  • AliGatorAliGator Membre, Modérateur

    PS : par où commence-t-on pour créer un template pour xcode5 ?

    Tu va chercher un template fourni dans le bundle de Xcode (/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates), tu en choisis un qui t'inspire, tu dupliques son dossier ".xctemplate" dans "~/Library/Developer/Xcode/Templates/File Templates" (dans TON dossier ~/Library de ta home donc ; tu auras peut-être à  créer les dossiers "Templates" et "File Templates" s'ils n'existent pas) et tu t'en inspire pour le dériver un peu :
    - tu édites le PLIST pour choisir un autre identifiant unique pour ce template et éventuellement un nom " tu peux aussi faire mumuse avec les options du template mais bon ça tu feras ça dans un 2e temps hein car c'est moins simple à  maà®triser
    - tu édites les fichiers .h et .m qui sont fournis dans ce template pour les adapter au modèle de document et d'organisation de code que tu veux.
  • On peut aussi trouver les templates là  :


     


    /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates


     


    Je n'ai pas vraiment trouvé de clé pour l'identifiant unique. À quoi faisais-tu allusion ?


    cf. 

  • Voici ma proposition de template.


     


    Elle doit être copiée dans le dossier :  ~/Library/Developer/Xcode/Templates/My Templates


     


    Si vous avez des idées de comment la compléter, je suis intéressé. ça sera peut-être pour moi l'occasion d'apprendre de bonnes pratiques.


     


    Merci !


     

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