“ResourceManager” sınıfları kötü kabul edilirse, alternatifler nelerdir?


19

Şu gibi çelişkili görüşler duyuyorum:

  • "Özel Yönetici sınıfları neredeyse hiçbir zaman doğru mühendislik aracı değildir"
  • "Özel Yönetici sınıfları (şu anda) binlerce kaynakla büyük bir projede hayatta kalmanın en iyi yoludur"

Aşağıdaki işlevselliğe sahip klasik bir ResourceManager sınıfı alalım:

  • Varlıkları yükler (dokular, ses, 3B modeller, vb.)
  • Önbelleği koruyarak varlıkların yalnızca bir kez yüklenmesini sağlar
  • Referans, yeniden konumlandırılabilecek olup olmadığını belirlemek için varlıkları sayar
  • Gerçek varlıkların nereden geldiğini gizler (örneğin, varlık başına bir dosya olabilir veya tek bir paket dosyasındaki tüm varlıklar veya varlıklar ağ üzerinden yüklenebilir)
  • Programı yeniden başlatmadan varlıkları yeniden yükleyebilir, bu da oyunda çalışan sanatçılar için son derece yararlıdır.

Ayrıca, bu ResourceManager nesnelerinin tekil değilmiş gibi davranarak ve bunun yerine bağımlılık enjeksiyonu yoluyla aktarıldığını varsayarak "singletonlar kötü" argümanını tablodan çıkaralım .

Sonra "fabrika kullan" veya "fabrika olarak adlandır" argümanı vardır. Benim sorunum, evet, bu bir fabrika, ama aynı zamanda bir önbellek ve bir yeniden yükleyici (daha iyi bir kelime eksikliği için). Bir fabrika olarak adlandırmak, onu düzgün bir şekilde tanımlamaz ve uygun bir fabrika yaparsam önbellekleme ve yeniden yükleme nerede uygulanır?

"Yönetici" sınıflarının genellikle kötü mimarinin bir belirtisi olduğunu kabul ediyorum, ancak bu özel durumda nasıl yeniden yapılandırılabilir ve hala tüm işlevselliği koruyabilir ? Bu bir "Yönetici" sınıfının gerçekten uygun olduğu bir durum mudur?


3
Belki fabrika yerine depo diyebiliriz? : P
yavaşladı

Yanıtlar:


9

Bence sorun bunun kötü bir tasarım olmaması. Sorun "Yönetici" adının "Güncelleme" ve "Süreç" ve "Aktör" gibi sıradan olmasıdır. Bu sistemi anlamaya çalışan biri için yararsızdır ve varlıklar üzerinde işlem yapan başka sınıflarınız varsa karışıklık yaratır.

Bununla birlikte, şeyleri amaçlarını verimli bir şekilde iletecek şekilde adlandırmak gerçekten, gerçekten zordur . Çoğu sistem, isimleriyle açıklığa kavuşturulamayacak kadar karmaşıktır. Yapabileceğiniz en iyi şey, belirli bir fikrin bunu bir sınıf uyumlu hale getirmesini ve diğer sınıfların açıkça farklı olması gerekenleri daraltmaya çalışmak ve bu türden uyan benzersiz bir kelime seçmek.

İyi bir ismin en önemli özelliği olan IMHO, insanların onu (kod tabanı) göreceği bağlamda benzersiz olması ve hatırlanması kolaydır. Test, neye atıfta bulunduğunuzu açıklığa kavuşturmak zorunda kalmadan koda aşina olan takım arkadaşlarınızla konuşabilmeniz olmalıdır. Bu, referans belgeleri yazmanız gerektiğinde de yardımcı olacaktır.

Son olarak, bu uyumlu fikri tanımlayamıyorsanız, bunun çok uyumlu olmayabilir. Örneğin, bir AssetCache'deki önbellek ve başvuru sayımını ayırabilir ve yüklemeyi bir AssetLoader'da tutabilirsiniz. Ancak bu, kodun ne kadar karmaşık ve iç içe olduğuna bağlıdır.

Ancak AssetManager'ınız yeterince uyumluysa ve oyununuzdaki başka hiçbir şey AssetManagery değilse, o zaman mükemmel bir isim olabilir.


AssetLoader / AssetCache ayırması kötü bir fikir değildir.
Tom Dalling

4

"Bunu tek bir yerde mi yaparım yoksa çok mu yaparım?"

Yükleme mantığı genellikle tek bir erişim noktasına merkezileştirilir, çünkü uygulamada yalnızca kilit noktalarda çalıştırılma eğilimindedir, burada ASAP'den çıkarmaya çalışıyoruz. Bu genellikle uygulama başlangıcında, oyun seviyesinde başlatıldığında veya oyuncu dünyasının konumu, deneyimi sorunsuz tutmak için yeni bir yığın yüklemeyi gerektirdiğinde gerçekleşir. Bunun bir toplu işlem olarak yapıldığını düşünürsek (büyük bir yığında veya daha küçük olanlarda gerçekten önemli değildir), bu işlemi başlatmak için bir yöntem veya çağrılacak bir dizi yöntem olması mantıklıdır.

Çoğu platformda yükleme eşzamansızdır, bu nedenle yükleme ve diğer uygulama mantığı için kod akışlarını ayrı tutmaktan başka seçeneğiniz yoktur, kaynak yönetimi işlevlerinin kendi sınıflarına soyutlanmasının bir başka nedeni.

Son olarak, üzerinde düşünülmesi gereken birkaç nokta:

Kaynak yüklemesi, ör. oyun mantığı, bunu yapmak için bireysel oyun nesnelerinize karmaşıklık katmaya değer mi? Oyun nesneleri genellikle mümkün olduğunca hafif tutulur ve yalnızca simülasyon sırasında ihtiyaç duyulanlar için tasarlanmıştır.

Bir nesne kendi yaratılışından ve yıkımından sorumlu olmalı mıdır? Bu, varlık yönetimi sırasında büyük baş ağrılarına neden olabilir. Bir nesnenin kendi yaratma sürecini (kaynak bağımlılıklarını almak dahil) gerçekleştirmesini bekliyorsanız, aynı şekilde kendisini yok etme sorumluluğuna sahip olacaktır. Bu sarkan / boş göstergelere neden olabilir, bu yüzden gerçekten dışarıdan yönetilmelidir. Bu sorunun ana hatlarıyla açıklandığı bu cevaba bakınız .


PS Her zamanki "Singletons korkunç" tip argümanların (korkunç derecede dogmatik) dışında, hiç ResourceManagers'a karşı iyi bir argüman gördünüz mü? "Dedicated Manager sınıfları neredeyse hiçbir zaman doğru mühendislik aracı değildir" bu özel durum için hiç bir tartışma yoktur .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.