2012-01-03 17 views
5

Genellikle veri depolamayı gerektiren uygulamalar oluşturur ve bu veriler tüm program boyunca kullanılır. Çok fazla değil, bu yüzden bu verileri yüklemek/kaydetmek için genellikle NSUserDefaults kullanıyorum. Bununla birlikte, kaydetme/yükleme kodu, verilerin paketlenmesi/paketinin açılması ile birlikte yer kaplar ve bu kodu küresel bir tektonun içinde yeniden kullanılabilir yöntemlere taşımanın iyi bir fikir olacağını düşünmüştüm. İyi çalışmış gibi görünüyor. Yine de, son zamanlarda, singletonların ve küresel nesnelerin kötülüklerine çok şey okudum ve ikinci düşüncelere sahip olmaya başladım. İnsanlar genellikle, tekillerin kullanımının neredeyse her zaman kötü tasarımın bir göstergesi olduğunu söylüyorlar. Çoğunlukla, katılmıyorum (bunun gibi basit kullanımların iyi bir tasarım deseni olduğunu düşünüyorum), ama kesinlikle bu konuda uzman değilim.Tekil bir veri yöneticisi sınıfı kötü mü kullanıyor?

Yani, bu kadar basit bir şekilde bile tekil kullanmaktadır? Eğer öyleyse, daha iyi bir alternatif nedir?

+1

Hayır, fena değil, hiç de fena değil. Apple tarafından sağlanan bir dizi iOS SDK sınıfının singleton olarak uygulandığını unutmayın. Bu, Apple kodunun otomatik olarak iyi bir kod olduğunu söylemez, ancak singleton şablonunun, kullanmadan kaliteden ödün vermediği anlamına gelir. – aroth

cevap

3

Kesinlikle singletonların kötülük olduğuna katılıyorum. Bazen çok fazla kullanılıyorlar ama bazı durumlarda iş için sadece mükemmel. Bazı uygulamalarda, bir çeşit genel veri yöneticisine sahip olmak mantıklıdır. Tekil desen, SDK'nın kendisinde (uygulama delegeleri, paylaşılan yöneticiler, varsayılan merkezler vb.) Yaygın olarak kullanılır. Çoğu zaman, bunlar paylaşılan bir örneğe erişebildiğiniz gibi, ancak bunlar da gerekirse yeni örnekler oluşturabildiğinden, "saf" tekil değildir.

Kendinize sormanız gereken soru, bir veri yöneticisinin tek bir örneğine herhangi bir zamanda herhangi bir yerden erişebilmenin yararlı olup olmayacağıdır, eğer o zaman tek bir olasılıkla gerekli değilse. Bununla birlikte, çoklu iş parçacıklı ortamlarda singleton kullanacaksanız, yarış koşulları hakkında endişelenmeniz gerekir (bir konu başka bir kaynağa erişirken bir iş parçacığını değiştirebilir), bu belgenin en iyi şekilde Kakao'da nasıl elde edileceğine dair açıklamaları vardır. .

Bir örnekle açıklamaya çalışalım - Yazdığım bir oyundan bazı kodları kullanıyorum. Bir GameMap sınıf ve Tile sınıfınız olduğunu varsayalım. GameMap, Tile nesnelerinin 2 boyutlu bir ızgarasını temsil eder.

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

GameMap örneği karoların grid sahibi ve oyun haritası oluşturulduğunda fayans oluşturur. Tek kişilik ihtiyaç yok.

"Ama bir seferde sadece bir tane GameMap sahibiyim, ne büyük bir anlaşma var?" Diyebilirsiniz. Kaydedilen oyunları yükleme veya yeni düzeyler yükleme hakkında ne dersiniz? Sonuç olarak

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

şeylerin diğer örneklerini yönetmek için kodu vardır bir sınıfın örneğini oluşturmak: Eh o kadar kolay olur. Mümkün olduğunca az küresel kalsın ve kodunuz daha ölçeklenebilir ve sürdürülebilir olacak.

+0

Teşekkürler, bu genellikle şeyler hakkında benim düşüncem. Tek benekli desenin bütün kötülük olmadığını teyit etmem gerekti, çünkü üzerinde yaptığım tüm okumalardan sonra, her ne pahasına olursa olsun kaçınılması gereken bir şey gibiydi. –

+0

iyi, yardım etmekten memnun. davamı yukarıda yaptım. Onun bu hakkı gibi, alkolün sağlık için kötü olduğu ancak ılımlılık içinde içmek güzel. Aynı şey burada. –

İlgili konular