Objective C 2.0 Accès direct à  un membre d'une classe par pointeur

kangourou38kangourou38 Membre
09:43 modifié dans API AppKit #1
Bonsoir
J'ai vu que depuis la version 2.0 de objective-c, on pouvait accéder d'une nouvelle façon à  un membre d'une classe. Juste un exemple :

voici pour le .h :
@interface Person : NSObject {
    NSString *name;
    int age;
}
@property NSString *name;
@property int age;
@end

et pour le point .m :

@implementation Person
@synthesize name, age ;
@end


ensuite on peut accéder au membre "age" de la façon suivante :
aPerson.age = 18 ;
plutôt que :
[aPerson setAge: 18 ];

Personnellement, je trouve que ça allège le code. Mais qqchose me gêne : aPerson est défini comme un pointeur ! et il aurait été plus logique (si on veut être fidèle à  la syntaxe du c) d'écrire :
aPerson -> age = 18 ;
Ce qui d'ailleurs est valide même avec l'objective C 1.0 (à  condition de déclarer le membre "age" @public pour éviter un warning du compilateur)

Pour conclure, je pense que la syntaxe de l'objective C risque de devenir de moins en moins claire pour le débutant surtout s'il apprend le c (avec des beaux pointeurs) en même temps que l'objective C !

Réponses

  • schlumschlum Membre
    09:43 modifié #2
    ça a déjà  été discuté à  plusieurs endroits  ;)
    Mais tu as raison, cette syntaxe est débile.
  • psychoh13psychoh13 Mothership Developer Membre
    décembre 2008 modifié #3
    dans 1230252393:

    Bonsoir
    J'ai vu que depuis la version 2.0 de objective-c, on pouvait accéder d'une nouvelle façon à  un membre d'une classe. Juste un exemple :

    voici pour le .h :
    @interface Person : NSObject {
        NSString *name;
        int age;
    }
    @property NSString *name;
    @property int age;
    @end

    et pour le point .m :

    @implementation Person
    @synthesize name, age ;
    @end


    ensuite on peut accéder au membre "age" de la façon suivante :
    aPerson.age = 18 ;
    plutôt que :
    [aPerson setAge: 18 ];

    Personnellement, je trouve que ça allège le code. Mais qqchose me gêne : aPerson est défini comme un pointeur ! et il aurait été plus logique (si on veut être fidèle à  la syntaxe du c) d'écrire :
    aPerson -> age = 18 ;
    Ce qui d'ailleurs est valide même avec l'objective C 1.0 (à  condition de déclarer le membre "age" @public pour éviter un warning du compilateur)

    Pour conclure, je pense que la syntaxe de l'objective C risque de devenir de moins en moins claire pour le débutant surtout s'il apprend le c (avec des beaux pointeurs) en même temps que l'objective C !


    Justement, la syntaxe "->" n'a pas été reprise parce que ça ne veut pas du tout dire la même chose.
    La syntaxe "." est strictement équivalent à  l'envoie de message, il n'y a pas d'accès direct en soit...
    L'opérteur "->" offre un accès direct, c'est-à -dire que tu modifies la valeur directement là  où elle se trouve, alors que le point "." passe par la méthode que tu as définie pour accéder à  la variable, d'où la syntaxe différente.

    Et sinon, ouais ça déjà  été débattu. :D
  • Philippe49Philippe49 Membre
    décembre 2008 modifié #4
    La notation aPerson.age n'est pas interprétée par le compilateur comme la notation C de l'accès à  un élément d'une structure.
    Pour répéter ce que dit Psycho, la notation aPerson.age=18 est en fait une notation pour l'appel d'une méthode [aPerson setAge:18] qui ne fait pas forcément qu'une seule affectation, mais peut par exemple provoquer l'envoi de notifications de changement à  des observateurs (il me semble que le ch de Hillegass que tu es en train de parcourir, ou le suivant, utilise ces notifications via un addObserver:...)

    Même si, en gros, un objet Objective-C est sous le capot un pointeur vers une structure C qui comprend différents champs, la déclaration de cette structure est loin d'être celle que l'on voit dans l'interface. Ainsi la notation -> ne devrait être utilisée en Objective-C que lorsqu'on manipule des pointeurs sur des structures C standards, toute autre utilisation demandant des connaissances plus élaborées de la nature "sous le capot" d'un objet Objective-C.
  • schlumschlum Membre
    09:43 modifié #5
    Ne pas utiliser "->" qui serait confusion aussi, je suis d'accord, mais pourquoi ce choix lamentable de "."  :fouf):
    Y a pas assez de caractères dans l'ASCII ? :o
  • psychoh13psychoh13 Mothership Developer Membre
    09:43 modifié #6
    dans 1230303259:

    Ne pas utiliser "->" qui serait confusion aussi, je suis d'accord, mais pourquoi ce choix lamentable de "."  :fouf):
    Y a pas assez de caractères dans l'ASCII ? :o


    Bah non justement, il n'y en a pas assez.
    Il faut que ce soit lisible par le compilateur et compréhensible par l'utilisateur. Tous les caractères sont déjà  utilisés dans la table ASCII. Si tu retires tous les caractères pouvant être utilisé dans les symboles et les non-imprimables voilà  ce qu'il reste :
    !, ", #, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \, ], ^, `, {, |, }, ~.

    Il n'y a que 127 caractères dans la table ASCII. ;)
  • schlumschlum Membre
    09:43 modifié #7
    Je sais combien il y a de caractères dans la table ASCII merci  :P
    Dans tout ceux là , y en a plusieurs qui auraient été plus adéquats...
    Le @ pour "access" par exemple ; me dis pas que le compilateur serait incapable de le différencier des @ existant déjà  en Obj-C
  • Philippe49Philippe49 Membre
    décembre 2008 modifié #8
    dans 1230336110:

    Le @ pour "access" par exemple ; me dis pas que le compilateur serait incapable de le différencier des @ existant déjà  en Obj-C

    ou une combinaison de caractères : <-> ou <> ou @.
Connectez-vous ou Inscrivez-vous pour répondre.