Чтобы быстро ответить на ваш вопрос, я предпочитаю простоту «кода в стиле SDL». Главным образом потому, что ваш немного более сложный «State Style» тратит впустую память и абсолютно ничего не покупает (см. Ниже), а рекурсия в вашем измученном стиле «Functional pseudo-C ++» переполнит стек за несколько миллисекунд.
«State Style» : Ваш «типосохраняющий yay» в коде «State Style» немного неоправдан. Вы по-прежнему решаете, к какому члену получить доступ, основываясь на switch
для другого участника, поэтому у кода есть те же недостатки, что и у кода "SDL Style" - за любую ошибку, которую вы можете совершить с кодом в стиле SDL, который приводит к интерпретации памяти как неправильного типа, вы бы сделали такую же грубую ошибку при доступе к неинициализированному члену с помощью кода в стиле State.
"Функциональный стиль псевдо-C ++" : Теперь вы получаете что-то, наследуя различные типы событий от базового типа события. Очевидно, что глупая рекурсия должна стать циклом, и есть несколько мелких вещей, которые нужно привести в порядок (я думаю, что ваши 3 метода с именем transform()
в UserWidget
хотят быть вызваны handle()
; я предполагаю, что вы можете решить проблема отсутствия шаблонных виртуальных методов с использованием Boost.Function или аналогичных). Я думаю, что у этого подхода есть потенциал, хотя я предпочитаю простоту стиля SDL.
Но более существенно: я подвергаю сомнению необходимость интерфейса опроса. Есть ли причина, по которой pollEvent()
не может заблокировать? На самом деле, все 3 сегмента кода сжигают процессорное время, ничего не делая 99,99% времени.