2012-01-03 2 views
5

저는 일반적으로 데이터 저장이 필요한 앱을 만들고이 데이터는 전체 프로그램에서 사용됩니다. 그렇다고 많은 것이 아니기 때문에이 데이터를로드/저장하려면 보통 NSUserDefaults을 사용합니다. 그러나 저장/로딩 코드는 데이터의 패킹/언팩과 함께 공간을 차지합니다.이 코드를 글로벌 싱글 톤 내부의 재사용 가능한 메서드로 옮기는 것이 좋습니다. 잘 된 것 같습니다.데이터 관리자 클래스로 싱글 톤을 사용하고 있습니까?

그렇지만 최근에 싱글 톤과 글로벌 객체의 악의에 대해 많이 읽었습니다. 그리고 나는 두 번째 생각을 갖기 시작했습니다. 사람들은 종종 싱글 톤 사용이 거의 항상 잘못된 설계의 징조라고 말합니다. 대부분의 경우, 저는 동의하지 않을 것입니다. (저는이 간단한 사용법이 좋은 디자인 패턴이라고 생각합니다.) 그러나 저는 확실히이 문제에 대해 전문가가 아닙니다.

이렇게 단순한 방법으로도 싱글 톤을 사용하고 있습니까? 그렇다면 더 나은 대안은 무엇입니까?

+1

아니요, 나쁘지 않습니다. 전혀 나쁘지 않습니다. Apple에서 제공하는 여러 iOS SDK 클래스는 싱글 톤으로 구현됩니다. Apple 코드가 자동으로 좋은 코드라는 것을 말하는 것은 아니지만, 싱글 톤 패턴이 자질을 되찾지 않는 것이 아니라는 것을 강하게 암시합니다. – aroth

답변

3

나는 싱글 톤이 악하다고 분명히 동의하지 않습니다. 때로는 너무 많이 사용되는 경우도 있지만 때로는 업무에 적합하기도합니다. 일부 응용 프로그램에서는 일종의 일반 데이터 관리자를 사용하는 것이 좋습니다. 싱글 톤 패턴은 SDK 자체 (앱 대리자, 공유 관리자, 기본 센터 등)에서 광범위하게 사용됩니다. 대부분 공유 인스턴스에 액세스 할 수 있지만 필요에 따라 새 인스턴스를 만들 수 있기 때문에 이러한 인스턴스는 "순수한"단일 인스턴스가 아닙니다.

언제든지 어디에서든지 데이터 관리자의 단일 인스턴스에 액세스하는 것이 유용 할 것인지 여부를 묻는 질문이 필요합니다. 그렇지 않은 경우에는 아마도 싱글 톤이 필요하지 않을 것입니다. 그러나 멀티 스레드 환경에서 싱글 톤을 사용하려는 경우 경쟁 조건 (한 스레드가 다른 스레드가 리소스에 액세스하는 동안 리소스를 수정할 수 있는지)에 대해 걱정할 필요가 있습니다. 설명서에는 코코아에서이를 달성하는 최선의 방법에 대한 좋은 설명이 있습니다 .

예를 들어 설명해 보겠습니다. 제가 작성한 게임의 일부 코드를 사용하고 있습니다. GameMap 클래스와 Tile 클래스가 있다고 가정 해 보겠습니다. GameMapTile 개체의 2 차원 눈금을 나타냅니다.

GameMap *gameMap = [[GameMap alloc] init]; 
NSArray *theTiles = gameMap.tiles; 

GameMap의 인스턴스는 타일의 그리드를 소유, 게임 맵을 만들 때 타일을 만듭니다. 싱글 톤은 필요하지 않습니다.

"하지만 한 번에 GameMap 개가 있습니다. 큰 차이가 있습니까?"라고 말할 수 있습니다. 저장된 게임을로드하거나 새로운 레벨을로드하는 것은 어떻습니까? 글쎄 그것은 다음과 같이 쉽게됩니다 :

// In whatever class object owns the game map 
self.gameMap = [[GameMap alloc] initWithSaveData:saveData]; 

결론적으로, 사물의 다른 인스턴스를 관리하는 코드가있는 인스턴스를 생성하십시오. 최대한 글로벌 화를 유지하면 코드의 확장 성 및 유지 관리가 향상됩니다.

+0

고마워, 그건 일반적으로 내 의견 뿐이야. 나는 싱글 톤 패턴이 모든 악마가 아니었다는 확인에 조금만 더 필요했다. 왜냐하면 내가 한 모든 독서 후에도, 그들은 피해야 할 피할 수없는 것처럼 들렸 기 때문이다. –

+0

글쎄, 도와 줘서 기뻐. 나는 내 사건을 위태롭게했다. 그게 좋아, 알코올은 건강에 좋지는 않지만 적당히 마셔도 좋습니다. 여기 같은거야. –

관련 문제