2013-08-23 11 views
5

Çalıştığım şirkette bir tek sınıf olan bir HUGE sınıfı (Globals.m) var. Genellikle NSUserDefaults'a gitmesi gereken bir grup BOOL'u saklar, ancak çeşitli görüntü denetleyicilerine ait video oynatıcılar gibi şeylere de işaret eder. IOS geliştirmede oldukça yeniyim (ve düşük bir stajyerim), ama bağırsağımda kodun yüksek cennete koktuğunu biliyorum. Tüm değişkenleri saklamak için neden bir tekil kullanmanın kötü olduğunu nasıl açıklayabilirim?Neden Küresel Değişkenler sınıfı (tekil) kötü uygulama kullanıyor?

Düzenleme: Tekillerin kötü anlamına gelmez, sadece bu durumda demek istiyorum. Aslında uygulamadaki her önemli değişken bu tek örnekte saklanır.

+1

Bir desen sadece bir kalıptır ... Gerçekten kötü olan şey, bir şeylerin kötü olduğunu söylemek olduğunu zannedersiniz çünkü sadece ... Tekizler kötü değildir, ama elbette kötü singletonları kullanabilir/yaratabilirsiniz ... Bu, onları nasıl tasarladığınıza/kullandığınıza bağlıdır ... – Macmade

+0

Tekton bu bir model ... uygun şekilde kullanmayın kötü ve tek bir kişinin ne zaman beklediğini düşündüğümde tek bir şey beklediğini düşünerek tekil –

+0

Teşekkürler @JoshCaswell, bunu daha önce gördüm ama ben onun tüm noktalarını tam olarak takip etmedim. Tekrarlama için üzgünüm! – Febble

cevap

3

UIKit'te birçok nesne tekildir. UIApplication nesnesi bir singleton'dur. NSUserDefaults, standardUserDefaults tektonuna sahiptir. UIDevice currentDevice, bir tekil döndürür.

Tek kişilik bir şey bunun kötü olduğu anlamına gelmez. Kötü olan şey, diğer sınıflardaki işlevselliği singleton nesnesine bağlamaya başladığınızda, tekil veya etkilenen nesneyi kolayca değiştiremeyeceğiniz kadar derinden kökleşmiş olmasıdır.

CoreData olmayan nesne yapılarımı depolamak için bir singleton kullanıyorum. Ayrıca kütüphane dizini, kodlama verileri ve anahtarlı arşivleme için bazı yardımcı yöntemler tanımladım. Bu yüzden, ihtiyaç duyduğum her yerde bir ana dizi nesnesine başvurabilir veya yalnızca kopyalama ve yapıştırma işlemlerini gerçekleştirecek yöntemlere kolayca erişebilirim.

+0

Yani hepsi bunu kullanıyorsa, değişkenler vardır, o zaman zarar yoktur? – Febble

+0

Tek bakışta, View Controller denetleyicisi içindeki tekil nesnelere erişip değiştiriyorsanız, bu nesneleri Görünüm Denetleyici sınıfının özellikleri olarak atamak yerine, kötü olduğu zaman söylüyorum. ie -viewDidLoad {[[[Singleton shared] array] addObject: newObject]; } 'View Controller'ınızdaki dizi için bir özellik ayarlamaya ve orada değiştirmeye karşı kötü olurdu. – Justin

0

Globals.m, bir singleton'a benzemiyor ve eğer yapılandırılmışsa, yalnızca yapılandırma amacıyla kullanılıyor gibi görünüyor mu? Daha sonra #defines veya extern ile dolu bir dosya aynı şeyi yapardı. Daha fazla ayrıntı olmadan, aradığınızı bilmek zor.

+0

Tekil olarak kurulur ve açık olarak tekil olarak ifade eden bir yorumu vardır. Ve sadece yapılandırma için değil, diğer sınıflara erişmek zorunda olan herhangi bir değişkeni saklamak için aktif olarak kullanılıyor. Kullanıcı Arabirimi'nin yanı sıra, aslında birbirinize başvurmayın. Her şey NSNotificationCenter ve bu Globals örneğiyle yapılır. Çok kötü bir uygulama olduğu sonucuna vardım, dediğim gibi çok deneyimli değilim. – Febble