Pendekatan sederhana adalah dengan hanya membuat hal yang dulu Singleton<T>
global T
. Global juga memiliki masalah, tetapi mereka tidak mewakili banyak kerja ekstra dan kode boilerplate untuk menegakkan batasan sepele. Ini pada dasarnya satu-satunya solusi yang tidak akan melibatkan (berpotensi) menyentuh konstruktor entitas.
Pendekatan yang lebih sulit, tetapi mungkin lebih baik adalah meneruskan ketergantungan Anda ke tempat Anda membutuhkannya . Ya, ini mungkin melibatkan pengalihan Window *
ke banyak objek (seperti entitas Anda) dengan cara yang terlihat kotor. Fakta bahwa itu terlihat kotor harus memberi tahu Anda sesuatu: desain Anda mungkin kotor.
Alasan ini lebih sulit (di luar melibatkan lebih banyak mengetik) adalah bahwa ini sering mengarah pada refactoring antarmuka Anda sehingga hal yang Anda "perlu" lewati diperlukan oleh lebih sedikit kelas level daun. Hal ini membuat banyak keburukan yang melekat dalam meneruskan renderer Anda ke semuanya hilang, dan itu juga meningkatkan pemeliharaan umum kode Anda dengan mengurangi jumlah dependensi dan penggandengan, sejauh mana Anda membuatnya sangat jelas dengan mengambil dependensi sebagai parameter . Ketika dependensinya adalah lajang atau global, itu kurang jelas bagaimana sistem Anda saling berhubungan.
Tapi ini berpotensi menjadi usaha besar . Melakukannya pada suatu sistem setelah fakta bisa sangat menyakitkan. Mungkin jauh lebih pragmatis bagi Anda untuk hanya meninggalkan sistem Anda sendirian, dengan singleton, untuk saat ini (terutama jika Anda mencoba untuk benar-benar mengirimkan permainan yang berfungsi dengan baik; pemain umumnya tidak akan peduli jika Anda memiliki satu atau empat di sana).
Jika Anda ingin mencoba melakukan ini dengan desain yang ada, Anda mungkin perlu memposting lebih banyak detail tentang implementasi Anda saat ini karena sebenarnya tidak ada daftar periksa umum untuk melakukan perubahan ini. Atau datang mendiskusikannya di obrolan .
Dari apa yang telah Anda posting, saya pikir langkah besar dalam arah "tanpa singleton" adalah untuk menghindari kebutuhan entitas Anda untuk memiliki akses ke jendela atau tampilan. Ini menunjukkan bahwa mereka menggambar diri mereka sendiri, dan Anda tidak perlu memiliki entitas menggambar diri mereka sendiri . Anda dapat mengadopsi metodologi di mana entitas hanya berisi informasi yang memungkinkanmereka harus ditarik oleh beberapa sistem eksternal (yang memiliki jendela dan melihat referensi). Entitas hanya memperlihatkan posisinya, dan sprite itu harus digunakan (atau semacam referensi untuk sprite tersebut, jika Anda ingin menembolokkan sprite aktual dalam renderer itu sendiri untuk menghindari duplikat instance). Penyaji hanya diminta untuk menggambar daftar entitas tertentu, yang dilaluinya, membaca data dari, dan menggunakan objek jendela yang dipegang secara internal untuk memanggil draw
dengan sprite mencari entitas tersebut.