对于我的全新ORM(chibi-ORM),我面临一项设计决定。
我正在为关系构建API,例如:
@interface SamplePerson : DbObject {
NSString *name;
DbObjectRelation *cities;
}
现在,对于DbObjectRelation
我有这个模型:
@interface DbObjectRelation : NSObject {
NSMutableArray *childRows;
DbObject *parent;
BOOL isLoaded;
}
-(void) load;
-(void) addObject:(DbObject *) childRow;
-(void) removeObject:(DbObject *) childRow;
- (id)initWitParent:(DbObject *)parentObject;
所以,我需要一种知道哪种数据库用于加载记录的内部加载方式。
我认为在我的数据库连接中有类似的东西:
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];
}
}
但是想知道是否更好地将DB类构建为单例。这适用于iPhone项目...
答案 0 :(得分:2)
在你正在做的静态变量周围使用一组类访问器/ mutator是非常合理的。如果你不打算更改数据库名称,另一个非常常见的解决方案是将它放在一个单独的文件中,比如Constants.h,以及其他常量字符串,如字典和用户默认密钥。
如果您有与数据库相关的其他代码可以重构到一个地方,那么为数据库内容构建单例类是非常好的一点。我不会创建一个只是为了保持字符串的类。
答案 1 :(得分:1)
对于不变的字符串,您应该将它们创建为常量。
即。在数据库连接文件中:
const NSString *CurrentDbName = @"name of database";
请注意capitlization以传达编译时生成和常量。
它比字符串的单例更有效。当然,您无法使用其他类型的Objective-C对象执行此操作,因为它们无法由编译器创建。对于这些,请使用单身。
如果程序的其他部分需要访问字符串,则应在数据库的头文件中使用extern引用:
extern const NSString *CurrentDbName;