2009-01-12 6 views
0

Pour mon tout nouveau ORM (chibi-ORM), je suis confronté à une décision de conception.Quoi de mieux: Chaîne globale ou singleton?

Je construis l'API pour les relations, comme:

@interface SamplePerson : DbObject { 
    NSString *name; 
     DbObjectRelation *cities; 
} 

Maintenant, pour DbObjectRelation Je cette mockup:

@interface DbObjectRelation : NSObject { 
    NSMutableArray *childRows; 
    DbObject *parent; 
    BOOL isLoaded; 
} 

-(void) load; 

-(void) addObject:(DbObject *) childRow; 
-(void) removeObject:(DbObject *) childRow; 

- (id)initWitParent:(DbObject *)parentObject; 

, je dois donc un chemin à l'intérieur de la charge savoir base de données utiliser pour charger les enregistrements.

Je pense que dans ma connexion ont à DB quelque chose comme:

static NSString *currentDbNameSingleton = nil; 

+(NSString *)currentDbName { 
    @synchronize(self) { 
     if (currentDbNameSingleton == nil) { 
      currentDbNameSingleton = [[NSString alloc] 
     } 
    } 
    return sharedInst; 
} 

+(void) setCurrentDbName(NSString *)name { 
    @synchronize(self) { 
     currentDbNameSingleton = [name copy]; 
    } 
} 

Mais se demander si est mieux construire la classe DB comme un singleton. Ceci est pour les projets iPhone ...

Répondre

2

L'utilisation d'un ensemble d'accesseurs/mutateurs de classe autour d'une variable statique comme vous le faites actuellement est assez raisonnable. Une autre solution assez courante si vous ne voulez pas changer le nom de la base de données serait de le mettre dans un fichier séparé, disons Constants.h, avec d'autres chaînes constantes comme les clés par défaut du dictionnaire et de l'utilisateur.

Si vous avez un code supplémentaire lié à votre base de données que vous pouvez recréer dans un seul endroit, alors c'est un bon point de construire une classe singleton pour votre base de données. Je ne créerais pas une classe juste pour tenir une chaîne si.

1

Pour les chaînes qui ne changent pas, vous devez les créer en tant que constantes.

savoir dans votre fichier de connexion de base de données:

const NSString *CurrentDbName = @"name of database"; 

Notez le capitlization pour transmettre la génération de compilation et ness constante.

Il est légèrement plus efficace qu'un singleton pour une chaîne. Bien sûr, vous ne pouvez pas le faire avec d'autres types d'objets Objective-C car ils ne peuvent pas être créés par le compilateur. Pour ceux-ci, utilisez un singleton.

Si d'autres parties de votre programme doivent avoir accès à la chaîne, vous devez utiliser une référence externe dans le fichier d'en-tête de votre base de données:

extern const NSString *CurrentDbName; 
+1

Je ferais ce peu différemment: extern NSString * const CurrentDbName dans l'en-tête fichier. et NSString * const CurrentDbName = @ "nom de la base de données" dans l'implémentation. La position de const rend le pointeur lui-même constant. – Abizern

Questions connexes