Mimo ogólnego pytania, moim zakresem jest język C #, ponieważ jestem świadom, że języki takie jak C ++ mają różną semantykę w zakresie wykonywania konstruktorów, zarządzania pamięcią, nieokreślonego zachowania itp.
Ktoś zadał mi interesujące pytanie, na które nie było łatwo odpowiedzieć.
Dlaczego (a może w ogóle?) Uważa się za zły projekt pozwalający konstruktorowi klasy rozpocząć niekończącą się pętlę (tj. Pętlę gry)?
Istnieje kilka pojęć, które są w ten sposób złamane:
- podobnie jak zasada najmniejszego zdziwienia, użytkownik nie oczekuje, że konstruktor będzie się tak zachowywał.
- Testy jednostkowe są trudniejsze, ponieważ nie można utworzyć tej klasy ani wstrzyknąć jej, ponieważ nigdy nie wychodzi ona z pętli.
- Koniec pętli (koniec gry) jest więc koncepcyjnie czasem, w którym konstruktor kończy, co również jest dziwne.
- Technicznie taka klasa nie ma publicznych członków oprócz konstruktora, co utrudnia jej zrozumienie (szczególnie w przypadku języków, w których implementacja nie jest dostępna)
A potem są problemy techniczne:
- Konstruktor tak naprawdę nigdy nie kończy, więc co się tutaj dzieje z GC? Czy ten obiekt jest już w Gen 0?
- Wyprowadzenie z takiej klasy jest niemożliwe lub co najmniej bardzo skomplikowane, ponieważ konstruktor podstawowy nigdy nie powraca
Czy przy takim podejściu jest coś bardziej złego lub przebiegłego?
while(true)
pętlę w nieruchomości seter: new Game().RunNow = true
?
var g = new Game {...}; g.MainLoop();