Что лучше: глобальная строка или синглтон? - PullRequest
0 голосов
/ 13 января 2009

Для моего нового 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];
    }
}

Но подумайте, а лучше ли строить класс БД как синглтон? Это для проектов iPhone ...

Ответы [ 2 ]

2 голосов
/ 13 января 2009

Использование набора аксессоров / мутаторов классов вокруг статической переменной, как вы делаете в настоящее время, вполне разумно. Другое довольно распространенное решение, если вы не собираетесь изменять имя базы данных, - это поместить его в отдельный файл, скажем, Constants.h, вместе с другими константными строками, такими как словарь и ключи пользователя по умолчанию.

Если у вас есть дополнительный код, связанный с вашей базой данных, который вы можете реорганизовать в одном месте, то это хороший момент для создания одноэлементного класса для вашей базы данных. Я бы не стал создавать класс только для хранения строки.

1 голос
/ 13 января 2009

Для строк, которые не изменяются, вы должны создавать их как константы.

т.е. В вашем файле подключения к базе данных:

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

Обратите внимание на прописную букву, чтобы передать генерацию во время компиляции и постоянство.

Это немного более эффективно, чем синглтон для струны. Конечно, вы не можете сделать это с другими типами объектов Objective C, потому что они не могут быть созданы компилятором. Для этого используйте синглтон.

Если другим частям вашей программы нужен доступ к строке, вам следует использовать внешнюю ссылку в заголовочном файле базы данных:

extern const NSString *CurrentDbName;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...