89 votes

Pourquoi la dernière partie d’un nom de méthode Objective-C doit prendre un argument (quand il n’y a plus d’une partie) ?

En Objective-C, vous ne pouvez pas déclarer les noms de méthode, où le dernier composant ne prend pas un argument. Par exemple, la suite est illégal.

-(void)take:(id)theMoney andRun;
-(void)take:(id)yourMedicine andDontComplain;

Pourquoi était-Objective-C conçu de cette façon? Était-ce simplement un objet de Smalltalk que personne n'a vu un besoin de se débarrasser de?

Cette limitation a de sens que dans Smalltalk, depuis Smalltalk n'a pas de délimiteurs autour de message d'invocation, de sorte que le dernier élément pourrait être interprété comme un message unaire pour le dernier argument. Par exemple, BillyAndBobby take:'$100' andRun serait analysée comme BillyAndBobby take:('$100' andRun). Ce n'est pas grave en Objective-C, où les crochets sont nécessaires.

Soutien sans paramètre sélecteur de composants n'est pas gagner beaucoup de toutes les façons habituelles d'une langue est mesurée, comme le nom de la méthode à un programmeur de prélèvement (par exemple, runWith: plutôt que d' take:andRun) n'affecte pas la fonctionnelle de la sémantique d'un programme, ni l'expressivité de la langue. En effet, un programme sans paramètre composants est l'alpha équivalent à celui sans. Je suis donc pas intéressé par les réponses que l'état une telle fonctionnalité n'est pas nécessaire (à moins que c'était les raisons de l'Objective-C concepteurs; est-ce que quelqu'un arrive à savoir Brad Cox ou Tom Amour? Sont-ils là?) ou que dire de la façon d'écrire les noms de méthode de sorte que la fonctionnalité n'est pas nécessaire. Le principal avantage est de la lisibilité et de writability (qui est comme la lisibilité, seul... vous savez), comme cela signifierait que vous pourriez écrire les noms de méthode que même les plus proches du langage naturel phrases. Les goûts de l' -(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)theApplication (Matt Gallagher points sur les "Cacao Avec l'Amour" est un peu déroutant lorsque vous déposez le paramètre formel) peuvent être nommés -(BOOL)application:(NSApplication*)theApplication shouldTerminateAfterLastWindowClosed, plaçant ainsi le paramètre immédiatement à côté du nom.

Apple Objective-C runtime (par exemple) est tout à fait capable de gérer ce genre de sélecteurs, alors pourquoi ne pas le compilateur? Pourquoi ne pas les soutenir dans les noms de méthode?

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

@interface Potrzebie : NSObject
-(void)take:(id)thing;
@end

@implementation Potrzebie
+(void)initialize {
    SEL take_andRun = NSSelectorFromString(@"take:andRun");
    IMP take_ = class_getMethodImplementation(self, @selector(take:));
    if (take_) {
        if (NO == class_addMethod(self, take_andRun, take_, "@@:@")) {
            NSLog(@"Couldn't add selector '%@' to class %s.", 
                  NSStringFromSelector(take_andRun), 
                  class_getName(self));
        }
    } else {
        NSLog(@"Couldn't find method 'take:'.");
    }
}

-(void)take:(id)thing {
    NSLog(@"-take: (actually %@) %@",NSStringFromSelector(_cmd), thing);
}
@end

int main() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    Potrzebie *axolotl=[[Potrzebie alloc] init];
    [axolotl take:@"paradichloroaminobenzaldehyde"];
    [axolotl performSelector:NSSelectorFromString(@"take:andRun") 
                  withObject:@"$100"];
    [axolotl release];

    [pool release];
    return 0;
}

111voto

Brad Cox Points 1014

Il s’agit de Brad Cox. Ma réponse initiale mal compris la question. J’ai supposé que reallyFast était une extension en dur pour déclencher la messagerie plus vite, non pas une sorte de sucre syntaxique. La vraie réponse est que Smalltalk n’a pas soutenu, peut-être parce que son analyseur ne pouvait pas faire face à l’ambiguïté (supposée). Bien que les crochets d’OC devrait lever toute ambiguïté, je ne pense tout simplement de s’écarter de la structure de mot-clé de Smalltalk.

42voto

bbum Points 124887

21 ans de programmation Objective-C et cette question n'a jamais traversé mon esprit. Compte tenu de la conception de langage, le compilateur est à droite et l'exécution des fonctions sont mauvais ().

La notion de entrelacés arguments avec des noms de méthode a toujours fait en sorte que, s'il y a au moins un argument, le dernier argument est toujours la dernière partie de l'invocation de la méthode de la syntaxe.

Sans penser à elle à travers terriblement bien, j'avais parié il y a quelques syntaxique bugaboos avec de ne pas appliquer le pattern en cours. Au moins, il serait le compilateur le plus difficile à écrire que tout syntaxe qui est facultatif éléments entrelacés avec des expressions est toujours plus difficile à analyser. Il pourrait même être un cas limite qui arrache l'en empêche. Certes, l'Obj-C++, il serait plus difficile, mais ce n'était pas intégrée avec la langue jusqu'à ce que des années après la syntaxe de base a déjà été fixé dans la pierre.

Aussi loin que pourquoi Objective-C a été conçu de cette façon, je serais suspect la réponse est que les concepteurs d'origine de la langue n'a tout simplement pas envisager de permettre à la entrelacés syntaxe pour aller au-delà de ce dernier argument.

C'est une meilleure estimation. Je vais demander à l'un des 'em et mise à jour de ma réponse quand j'en trouve le plus.


J'ai demandé à Brad Cox à ce sujet et il a été très généreux à répondre en détail (Merci, Brad!!):

J'ai été porté à l'époque sur dupliquer autant de Smalltalk comme possible en C et en faire efficacement que possible. Tout de rechange les cycles de produire ordinaire messagerie rapide. Il n'y avait pas pensé spécialisé option de messagerie ("reallyFast?" [bbum: j'ai demandé l'aide de 'doSomething:withSomething:reallyFast' comme l'exemple]) depuis l'ordinaire les messages étaient déjà aussi vite qu'ils pourrait être. Cela a impliqué de la main-tuning l'assembleur de sortie de la C proto-messager, qui était un la portabilité cauchemar que certains, sinon la tout cela a été repris plus tard. Je ne rappel de la main-piraté messager a été très vite, le coût de deux les appels de fonction; de se mettre dans l' messager de la logique et du reste à faire méthode des recherches une fois sur place.
Le typage statique des améliorations ont été plus tard ajouté sur le dessus de Smalltalk est de la pure typage dynamique par Steve Naroff et les autres. Je n'avais qu'une participation limitée dans que.

Allez lire sa réponse!

21voto

Psycho Points 1333

Juste pour votre information, le runtime ne se soucie réellement sur les sélecteurs, n’importe quelle chaîne C est valide, vous pouvez aussi bien faire un sélecteur comme ça : « == += == +---__--¨¨¨ ^ ::: » sans argument le runtime va l’accepter, le compilateur ne peux pas ou qu’il est Impossible d’analyser. Il n’y a absolument aucun test de validation lorsqu’il s’agit de sélecteurs.

6voto

Martin v. Löwis Points 61768

Je suppose qu'ils ne sont pas pris en charge en Objective-C, car ils n'étaient pas disponibles en Smalltalk. Mais une autre raison que vous ne le pensez: ils ne sont pas nécessaires. Ce qui est nécessaire est un soutien pour les méthodes avec 0, 1, 2, 3, ... arguments. Pour chaque nombre d'arguments, il y a déjà un travail de syntaxe pour les appeler. L'ajout de tout autre syntaxe serait juste de provoquer une confusion inutile.

Si vous voulais multi-word sans paramètre sélecteurs, pourquoi s'arrêter avec un seul mot? On peut donc se demander qui

 [axolotl perform selector: Y with object: Y]

devient également pris en charge (c'est à dire qu'un sélecteur est une séquence de mots, certains avec deux points et d'un paramètre, et d'autres non). Tout cela n'aurait été possible, je suppose que personne ne l'estimait utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X