oleksiimikhno / RubyHW

0 stars 0 forks source link

Фідбек ДЗ 2 Тамагочі #3

Closed Kashoid23 closed 1 year ago

Kashoid23 commented 1 year ago

Помітно, що писали самостійно а не зкопіювали, це плюс.

if @sleep_need
      puts "Your #{@name} feeling tired!"
      return
    end
custom_methods = self.class.instance_methods(false)
@game_methods = @start ? custom_methods.reject { |v| v == 'start_game'.to_sym } : custom_methods
oleksiimikhno commented 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 на дію в ручну. Беруться всі публічні методи класу і обрабляється дія юзер, якщо вона є, викликає метод. Ну якщо так нельзя робить, перепишу.

Можливо я туплю і не так зрозумів щось, від рубі далекий. Буду вдячний за відповідь.

Kashoid23 commented 1 year ago

На практиці найчатсіше використовується 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. На практиці іменна змінни, класів та методів мають бути читабельними та зрозумілими, передавати контекст, сутність, результат