Да. Можно.
---
Продолжаю тему связывания и отражения.
В общем, ничего сложного нет. Все это безобразие объявляется в Window_Selectable
У него его имеется хэш handler<символ, метод>.
При обновлении вызывается следующий метод:
Код:
def process_handling
return unless open? && active
return process_ok if ok_enabled? && Input.trigger?(:C)
return process_cancel if cancel_enabled? && Input.trigger?(:B)
return process_pagedown if handle?(:pagedown) && Input.trigger?(:R)
return process_pageup if handle?(:pageup) && Input.trigger?(:L)
end
Который поочереди проверяет нажата ли кнопка, сопоставлен ли метод с соответствующим дескриптором (handle), а возвращаемый метод вызывает такое вот чудовище:
Код:
def call_handler(symbol)
@handler[symbol].call if handle?(symbol)
end
Совершенно неясно - для чего дважды выполняется проверка на существование метода, и первой модификацией надо убрать if ok_enabled? и иже с ним из метода process_handling. Какая-никакая, а оптимизация, особенно если в каком-либо из дочерних классов будет задействована вся клавиатура.
Итог: сократился объем кода, программировать менюшки стало проще. Однако вырос уровень абстракции. Задействовано отражение. Это неминуемо негативно скажется на производительности. Однако, вероятно, в рамках проекта на мейкере, это падение будет незначительным. Тем не менее, если я за полчаса изучения скриптов уже нашел такой ляп, стоит основательно их прошерстить на предмет оптимизации.
Социальные закладки