Question

Diriez-vous que les catégories Objective-C sont une mise en œuvre des ?

Était-ce utile?

La solution

Non, les catégories Objective-C ne sont pas une implémentation du modèle des visiteurs. Les catégories ne sont pas vraiment une correspondance exacte dans le monde du modèle de conception, la technique consistant à injecter des méthodes dans les classes existantes sans sous-classes est impossible dans la plupart des langues. Je dirais qu'il est plus proche de la , mais ce modèle est généralement mis en œuvre avec la composition, à savoir en enveloppant une instance de l'objet que vous voulez « améliorer ».

Le motif de visiteur est utile pour l'encapsulation logique de l'algorithme qui peut être appliqué à une variété d'objets, struct, etc. Par exemple, si vous voulez créer une sortie HTML pour un graphique d'objets, vous pouvez (A) écrire un htmlString procédé de chaque objet et l'appeler pour chaque objet, ou (B) en utilisant le motif de visiteur et de créer un visiteur béton qui sait comment produire une sortie HTML pour chaque noeud il rend visite.

La première approche est plus générique, et la logique pour la tâche T est dispersée en petits morceaux dans toutes les classes X, Y et Z. Cette dernière approche met tout le code lié à un seul objet de visiteur, qui tend à simplifier la maintenance et éviter le problème «J'ai oublié que l'on classe ... ». Cependant, le modèle des visiteurs est sans doute un peu pénalisantes pour des situations simples - où il est vraiment utile est quand vous avez plusieurs fonctionnalités parallèles différentes et que vous souhaitez faire abstraction de la logique des classes où la fonctionnalité est en cours d'exécution. Par exemple, vous pourriez mettre en œuvre d'autres visiteurs qui produisent une sortie PDF ou RTF, etc. Chaque visiteur peut prendre soin de récursivité et d'appeler ses propres méthodes de visite dans l'ordre nécessaire, et les visiteurs distincts peuvent utiliser un ordre tout à fait distinct.

Il convient de noter que dans de nombreuses langues, le motif de visiteur utilise la surcharge de méthode (même nom, différentes signatures / arguments). Étant donné que Objective-C ne permet pas la surcharge de méthode, vous devez utiliser les noms de méthodes distinctes, mais cela peut effectivement aider à éviter les bugs causés par ne pas savoir qui surcharge est appelé.

Autres conseils

Les catégories peuvent être utilisées pour mettre en œuvre le modèle des visiteurs.

@protocol Visit
- (void)acceptVisitor:(MyVisitor *)visitor;
@end

@interface Foo (Visit) <Visit>
@end

@interface Bar (Visit) <Visit>
@end

@implementation MyVisitor

- (void)visit:(id)someObject {
    if ([someObject conformsToProtocol:@protocol(Visit)]) {
        [(id<Visit>)someObject acceptVisitor:self];
    }
}

- (void)visitFoo:(Foo *)foo { ... }

- (void)visitBar:(Bar *)bar { ... }

@end

@implementation Foo (Visit)
- (void)acceptVisitor:(MyVisitor *)visitor {
    [visitor visitFoo:self];
} 
@end

@implementation Bar (Visit)
- (void)acceptVisitor:(MyVisitor *)visitor {
    [visitor visitBar:Self];
}
@end

Ceci est l'OMI que la conception plus soignée classique GoF des visiteurs, car il n'y a pas de pollution des classes visitées interfaces publiques et l'ensemble peut être encapsulées dans l'unité de compilation de la catégorie des visiteurs.

scroll top