Closed Kashoid23 closed 1 year ago
Питання по send. Читаю, що якщо поставити метод на перевірку перед виконанням, він стане більш секюрним. В мене в коді йде перевірка через when action_helper(action), перед тим як попасти на send, по факту якщо метода не буде в класі, ми повертаєм puts "▼ Unknown command --- #{action.upcase} ---, please select current! ▼"
def action_helper(action)
@game_methods.detect { |method| method == action }
end
Переписав на метод public_send, який наскільки я зрозумів виконує тільки публічні методи класу (і багато де кажуть, що краще его писати), але знову таки тут пишуть Note that the use of public_send is also dangerous, as send itself is public:
1.public_send("send", "eval", "...ruby code to be executed...")
https://docs.ruby-lang.org/en/2.1.0/security_rdoc.html#label-send
І по останьому питаню, тому в мене і є action_helper, щоб не додавати в ручну кожен раз case/when
на дію в ручну. Беруться всі публічні методи класу і обрабляється дія юзер, якщо вона є, викликає метод. Ну якщо так нельзя робить, перепишу.
Можливо я туплю і не так зрозумів щось, від рубі далекий. Буду вдячний за відповідь.
На практиці найчатсіше використовується public_send. Стаття була для того, щоб ви ознайомились з усіма плюсам і мінусам використання send та розібрались.
В данному випадку public_send задовільняє умову.
На практиці не часто побачиш щось подібне, а отже варто знати і про case/when
custom_methods = self.class.instance_methods(false)
@game_methods = @start ? custom_methods.reject { |v| v == 'start_game'.to_sym } : custom_methods
Оновлювати нічого не треба, конкретно ці пункти були для ознайомлення.
З приводу
def skip(value = 1)
value.times do
skip_time вже краще але аргумент з іменем value не дає ніякої конкрети, можна було б назвати days, hours. На практиці іменна змінни, класів та методів мають бути читабельними та зрозумілими, передавати контекст, сутність, результат
Помітно, що писали самостійно а не зкопіювали, це плюс.
[x] Чому за замовчування
name
false? Оновіть значення наnil
, оскільки це більш коректно передає значення. Можливо треба буде перевірити перевірки, алеnil
в коректних порівняннях рівнозначнийfalse
def initialize(name: false)
[x] Не використовуйте будь ласка скорочення які не передають сутності з якою працюєте, через місяць зможете сказати, що таке
i
?@game_methods.detect { |i| i == action }
[x] Прочитайте чому небезпечно використовувати метод send https://brakemanscanner.org/docs/warning_types/dangerous_send/
send(action)
[x] Зазвичай ми не додаємо префікс до імені
pet_sick
який дублює ім'я класу чи сутності. Доситьsick
[x] Варто перейменувати аргумент, таким чином щоб він описав сутність значення яке передається, наприклад день або година (те саме з методом)
[x] Оновіть умову, таким чином щоб позбутись return, який повертає nil
[x] Щоб спростити собі задачу з методами екземпляру та їх виконанням, можна використати оператори
case/when
і в залежності від вхідного тексту просто викликати необхідний метод (відпаде необхідність вsend
)