Saya tahu bahwa memiliki variabel global atau kelas tunggal menciptakan kasus yang mungkin sulit untuk diuji / dikelola dan saya telah tertangkap basah dalam menggunakan pola-pola tersebut dalam kode tetapi sering kali Anda harus mengirim.
Jadi apakah ada kasus di mana variabel global atau lajang benar-benar berguna dalam pengembangan game?
software-engineering
design-patterns
Ólafur Waage
sumber
sumber
Jelas daftar yang tidak lengkap, tapi begini:
Cons
Baik pro atau kontra
Pro
Kami banyak menggunakan "struct of singletons global" dalam judul handheld kami. Judul PC dan konsol cenderung kurang mengandalkannya; kami akan beralih lebih banyak ke arsitektur berbasis pesan / event Yang telah dikatakan, judul pc / konsol masih sering menggunakan TextureManager pusat; karena biasanya membungkus satu sumber daya bersama (memori tekstur) ini masuk akal bagi kami.
Jika Anda menjaga API Anda relatif bersih, mungkin tidak terlalu sulit untuk menolak dari (atau ke!) Pola tunggal ketika Anda membutuhkan ...
sumber
Mereka bisa sangat berguna, terutama selama prototyping atau implementasi eksperimental, tetapi secara umum kami lebih suka melewati referensi untuk manajer seperti struktur, dengan cara itu Anda setidaknya memiliki kontrol atas dari mana mereka diakses. Masalah terbesar dengan global dan lajang (menurut saya) adalah bahwa mereka tidak sangat ramah multithread, dan kode yang menggunakannya jauh lebih sulit untuk port ke memori yang tidak dibagi, seperti SPU.
sumber
Saya akan mengatakan bahwa desain singleton itu sendiri tidak berguna sama sekali. Variabel global pasti bisa berguna tetapi saya lebih suka melihatnya tersembunyi di balik antarmuka yang ditulis dengan baik sehingga Anda tidak menyadari keberadaannya. Dengan lajang Anda pasti menyadari keberadaan mereka.
Saya sering menggunakan variabel global untuk hal-hal yang perlu diakses sepanjang mesin. Alat kinerja saya adalah salah satu contoh yang baik yang saya gunakan di seluruh mesin untuk menelepon. Panggilannya sederhana; ProbeRegister (), ProbeHit () dan ProbeScoped (). Akses nyata mereka sedikit lebih rumit dan menggunakan variabel global untuk beberapa hal mereka.
sumber
Masalah utama dengan global, dan lajang yang diimplementasikan dengan buruk adalah bug konstruksi & dekonstruksi yang tidak jelas.
Jadi jika Anda bekerja dengan primitif yang tidak memiliki masalah ini atau sangat menyadari masalah dengan sebuah pointer. Kemudian mereka dapat digunakan dengan aman.
Global memiliki tempat mereka, sama seperti gotos dan tidak boleh diberhentikan begitu saja tetapi digunakan dengan hati-hati.
Ada penjelasan yang bagus tentang hal itu di Panduan Gaya Google C ++
sumber
Global berguna saat dengan cepat membuat prototipe sistem yang membutuhkan beberapa keadaan di antara panggilan fungsi. Setelah Anda menetapkan bahwa sistem bekerja, pindahkan status ke dalam kelas dan buat fungsinya menjadi metode kelas itu.
Lajang berguna untuk menyebabkan masalah pada diri sendiri dan orang lain. Semakin banyak kondisi global yang Anda perkenalkan, semakin banyak masalah yang Anda miliki dengan kebenaran kode, pemeliharaan, ekstensibilitas, konkurensi, dll. Hanya saja, jangan lakukan itu.
sumber
Saya cenderung merekomendasikan menggunakan semacam wadah DI / IoC dengan manajemen seumur hidup khusus alih-alih lajang (bahkan jika Anda menggunakan manajer seumur hidup "satu contoh"). Setidaknya itu mudah untuk menukar implementasi untuk memfasilitasi pengujian.
sumber
Jika Anda ingin fitur hemat memori dari singleton mungkin Anda bisa mencoba pola desain kelas terbang?
http://en.wikipedia.org/wiki/Flyweight_pattern
Sejauh masalah multi-utas yang disebutkan di atas, harus cukup sederhana dengan pandangan ke depan untuk menerapkan mekanisme kunci untuk sumber daya yang dapat dibagi di antara utas. http://en.wikipedia.org/wiki/Read/write_lock_pattern
sumber
Lajang adalah cara yang bagus untuk menyimpan keadaan bersama dalam prototipe awal.
Mereka bukan peluru perak dan datang dengan beberapa masalah, tetapi mereka adalah pola yang sangat berguna untuk negara UI / Logika tertentu.
Misalnya di iOS, Anda menggunakan lajang untuk mendapatkan aplikasi [UIAplikasi dibagikan], di cocos2d Anda dapat menggunakannya untuk mendapatkan referensi ke objek tertentu seperti [CCNotifications sharedManager] dan secara pribadi saya biasanya memulai dengan singleton [Game sharedGame] di mana saya bisa keadaan toko yang dibagi antara banyak komponen yang berbeda.
sumber
Wow, ini menarik bagi saya, karena saya pribadi tidak pernah punya masalah dengan pola tunggal. Proyek saya saat ini adalah mesin game C ++ untuk Nintendo DS, dan saya mengimplementasikan banyak utilitas akses perangkat keras (mis. VRAM Banks, Wifi, dua mesin grafis) sebagai instance tunggal, karena mereka dimaksudkan untuk membungkus global C fungsi di pustaka yang mendasarinya.
sumber
Hanya ketika Anda memiliki item yang hanya memiliki satu pengontrol tetapi ditangani oleh beberapa modul.
Seperti, misalnya, antarmuka mouse. Atau antarmuka joystick. Atau pemutar musik. Atau pemutar suara. Atau layarnya. Atau pengelola file simpan.
sumber
Global jauh lebih cepat! Jadi itu akan sangat cocok untuk aplikasi intensif kinerja, seperti game.
Singletons adalah global yang lebih baik, IMO, dan dengan demikian alat yang tepat.
Gunakan dengan hemat!
sumber