Proste podejście polega na stworzeniu czegoś, co kiedyś było Singleton<T>
globalne T
. Globały też mają problemy, ale nie stanowią one dodatkowej pracy i kodu, aby wymusić trywialne ograniczenie. Jest to w zasadzie jedyne rozwiązanie, które nie będzie wymagało (potencjalnie) dotykania konstruktora encji.
Trudniejszym, ale być może lepszym podejściem jest przekazanie swoich zależności tam, gdzie ich potrzebujesz . Tak, może to obejmować przekazanie Window *
zbioru obiektów (takich jak Twoja istota) w sposób, który wygląda obrzydliwie. Fakt, że wygląda obrzydliwie, powinien ci coś powiedzieć: twój projekt może być obrzydliwy.
Powodem jest to, że jest to trudniejsze (poza włączeniem większego pisania), ponieważ często prowadzi to do refaktoryzacji interfejsów, tak że to, co „musisz” przekazać, jest potrzebne mniejszej liczbie klas na poziomie liści. Powoduje to, że wiele brzydoty nieodłącznie związanej z przekazywaniem renderera do wszystkiego zniknie, a także poprawia ogólną łatwość konserwacji twojego kodu poprzez zmniejszenie ilości zależności i sprzężeń, których zakres stałeś się bardzo oczywisty, przyjmując zależności jako parametry . Kiedy zależności były singletonami lub globałami, mniej oczywiste było, w jaki sposób wzajemnie powiązane były twoje systemy.
Ale jest to potencjalnie duże przedsięwzięcie. Robienie tego do systemu po fakcie może być wręcz bolesne. Może być o wiele bardziej pragmatyczne, aby po prostu zostawić swój system samemu sobie, z singletonem, na razie (szczególnie jeśli próbujesz faktycznie wysłać grę, która w przeciwnym razie działa dobrze; gracze na ogół nie będą się przejmować, jeśli masz singleton lub cztery tam).
Jeśli chcesz spróbować zrobić to z istniejącym projektem, może być konieczne opublikowanie o wiele więcej szczegółów na temat bieżącej implementacji, ponieważ tak naprawdę nie ma ogólnej listy kontrolnej do wprowadzenia tych zmian. Lub przyjdź i porozmawiaj o tym na czacie .
Z tego, co napisałeś, uważam, że dużym krokiem w kierunku „bez singletonu” byłoby uniknięcie konieczności dostępu twoich bytów do okna lub widoku. Sugeruje to, że same się rysują, a ty nie musisz, by istoty same się rysowały . Możesz przyjąć metodologię, w której podmioty zawierają po prostu informacje, które by na to pozwoliłydo narysowania przez jakiś system zewnętrzny (który ma okno i odnośniki do widoku). Istota po prostu ujawnia swoją pozycję i duszka, którego powinien użyć (lub jakieś odniesienie do tego duszka, jeśli chcesz buforować rzeczywiste duszki w samym module renderującym, aby uniknąć powielania instancji). Mechanizm renderujący jest po prostu proszony o narysowanie konkretnej listy encji, przez które przechodzi przez pętlę, odczytuje dane i używa wewnętrznego obiektu okna do wywołania draw
duszka wyszukanego encji.