Mesinnya sudah menggunakan banyak lajang. Jika seseorang menggunakannya, maka mereka harus terbiasa dengan beberapa di antaranya:
Ketidaktahuan bukanlah alasan mengapa lajang perlu dihindari.
Ada banyak alasan bagus mengapa Singleton diperlukan atau tidak dapat dihindari. Kerangka permainan sering menggunakan lajang karena merupakan konsekuensi yang tidak terhindarkan dari hanya memiliki satu perangkat keras stateful. Tidak masuk akal untuk pernah ingin mengendalikan perangkat keras ini dengan beberapa contoh penangan masing-masing. Permukaan grafik adalah perangkat keras stateful eksternal dan secara tidak sengaja menginisialisasi salinan kedua dari subsistem grafis tidak kekurangan bencana, karena sekarang dua subsistem grafis akan bertengkar satu sama lain tentang siapa yang akan menggambar dan kapan, menimpa satu sama lain secara tak terkendali. Demikian juga dengan sistem acara antrian, mereka akan berebut siapa yang mendapatkan acara mouse dengan cara nondeterministic. Ketika berhadapan dengan perangkat keras eksternal stateful di mana hanya ada satu dari mereka, singleton tidak dapat dihindari untuk mencegah konflik.
Tempat lain di mana Singleton masuk akal adalah dengan manajer Cache. Tembolok adalah kasus khusus. Mereka seharusnya tidak benar-benar dianggap sebagai Singleton, bahkan ketika mereka menggunakan semua teknik yang sama seperti Singletons untuk tetap hidup dan hidup selamanya. Layanan caching adalah layanan transparan, mereka tidak seharusnya mengubah perilaku program, jadi jika Anda mengganti layanan cache dengan cache nol, program harus tetap berfungsi, kecuali bahwa itu hanya berjalan lebih lambat. Alasan utama mengapa manajer cache pengecualian untuk singleton adalah karena tidak masuk akal untuk mematikan layanan cache sebelum mematikan aplikasi itu sendiri karena itu juga akan membuang objek yang di-cache, yang mengalahkan titik memilikinya sebagai singleton.
Itulah alasan bagus mengapa layanan ini masih lajang. Namun, tidak ada alasan yang baik untuk memiliki lajang berlaku untuk kelas yang telah Anda daftarkan.
Karena saya akan membutuhkannya di tempat yang sangat berbeda dalam permainan saya, dan akses bersama akan sangat berguna.
Itu bukan alasan untuk lajang. Itulah alasan global. Ini juga merupakan tanda desain yang buruk jika Anda harus melewati banyak hal di berbagai sistem. Harus melewati hal-hal di sekitar menunjukkan kopling tinggi yang dapat dicegah dengan desain OO yang baik.
Hanya dari melihat daftar kelas di postingan Anda yang menurut Anda perlu lajang, saya dapat mengatakan bahwa setengah dari mereka benar-benar tidak boleh lajang dan setengah lainnya sepertinya mereka bahkan tidak seharusnya ada di sana. Bahwa Anda perlu melewati objek tampaknya disebabkan oleh kurangnya enkapsulasi yang tepat daripada kasus penggunaan yang baik untuk lajang.
Mari kita lihat kelas Anda sedikit demi sedikit:
PlayerData (score, lives, ...)
LevelData (parameters per levels and level packs)
GameData (you may obtain some data from server to configure the game)
Hanya dari nama-nama kelas, saya akan mengatakan bahwa kelas-kelas ini berbau seperti antipattern Model Domain Anemic. Objek anemia biasanya menghasilkan banyak data yang perlu dilewatkan yang meningkatkan kopling dan membuat sisa kode rumit. Juga, kelas anemia menyembunyikan fakta bahwa Anda mungkin masih berpikir secara prosedural daripada menggunakan orientasi objek untuk merangkum detail.
IAP (for in purchases)
Ads (for showing ads)
Mengapa kelas-kelas ini harus lajang? Tampaknya bagi saya ini adalah kelas yang berumur pendek, yang harus dimunculkan ketika dibutuhkan dan didekonstruksi ketika pengguna menyelesaikan pembelian atau ketika iklan tidak perlu lagi ditampilkan.
EntityComponentSystemManager (mananges entity creation and manipulation)
Dengan kata lain, sebuah konstruktor dan lapisan layanan? Mengapa kelas ini tanpa batasan atau tujuan yang jelas bahkan ada di tempat pertama?
PlayerProgress (passed levels, stars)
Mengapa perkembangan pemain terpisah dari kelas Player? Kelas Player harus tahu cara melacak kemajuannya sendiri, jika Anda ingin menerapkan pelacakan kemajuan di kelas yang berbeda dari kelas Player untuk pemisahan tanggung jawab, maka PlayerProgress harus berada di belakang Player.
Box2dManager (manages the physics world)
Saya benar-benar tidak dapat berkomentar lebih jauh tentang ini tanpa mengetahui apa yang sebenarnya dilakukan kelas ini, tetapi satu hal yang jelas adalah bahwa kelas ini tidak disebutkan namanya.
Analytics (for collecting some analytics)
SocialConnection (Facebook and Twitter login, share, friend list, ...)
Ini sepertinya satu-satunya kelas di mana Singleton mungkin masuk akal, karena objek koneksi sosial sebenarnya bukan objek Anda. Koneksi sosial hanyalah bayangan dari objek eksternal yang hidup dalam layanan jarak jauh. Dengan kata lain, ini adalah semacam cache. Pastikan Anda dengan jelas memisahkan bagian caching dengan bagian layanan dari layanan eksternal, karena bagian terakhir seharusnya tidak perlu menjadi singleton.
Salah satu cara Anda dapat menghindari lewat instance dari kelas-kelas ini di sekitar adalah dengan menggunakan message passing. Daripada melakukan panggilan langsung ke instance dari kelas-kelas ini, alih-alih Anda mengirim pesan yang ditujukan ke layanan Analytic dan SocialConnection secara tidak sinkron, dan layanan ini berlangganan untuk menerima pesan-pesan ini dan bertindak berdasarkan pesan tersebut. Karena antrian acara sudah menjadi singleton, dengan menginjak-injak panggilan, Anda menghindari keharusan menyampaikan contoh aktual saat berkomunikasi dengan singleton.