Задача 12-4: Зачем нужна проверка @current_question?

[Д] Дмитрий, 21 июля 2016, 19:51 , 2 подписчика

Для чего в Домашке 12-4 ([homework_id=50]) написана проверка @current_question?

Я прикрепил zip папку, со своим вариантом. Подскажите, верен он или нет.

Обсуждение (3)


Michael Butlitsky Учитель

[M]

У нас объект Test хранит свое текущее состояние: он знает сколько уже набрал очков юзер (@points) и индекс текущего вопроса в массиве вопросов (этот индекс и хранится в @current_question).

В основном коде программы создается объект класса Test и в цикле опрашивается:

# основной цикл программы
while test.next_question == true do
  #...

При каждом вызове метода next_question указатель @current_question увеличивается на единицу до тех пор, пока не дойдет до конца массива вопросов (эти проверки и идут внутри метода next_question при каждом вызове).

Ваша программа сделана немного по-другому. И хотя судя по результату работы она верная, есть несколько некрасивых мест, до которых вы с опытом и сами дойдете:

  1. Метод Test#next_question(name) судя по названию должен лишь задавать "следующий вопрос", а вы весь игровой цикл в нем реализовали.
  2. Метод Name#user_input во-первых при каждом вызове выполняет заново код, который нужно выполнить один раз (проставить кодировки, записать введенное имя), а во-вторых вы его используете дважды в коде программы.

По сути программы нужно хранить только имя — строку. Но класс Строка уже реализован в руби, так и используйте ее. Не нужно придумывать свой класс, если он повторяет существующие.


[Д]

Как работает (@current_question) мне понятно. Я наверное не совсем правильно поставил вопрос.Просто мне показалось, что можно обойтись одним (@points) и не использовать (@current_question) или я не прав? Кстати прикрепил исправленный (ZIP) вариант. Гляньте пожалуйста.


Michael Butlitsky Учитель

[M]

в @points хранится счет пользователя (сколько очков он набрал), а как узнать на каком сейчас вопросе находится пользователь? Вот для этого и нужен указатель.

В новом варианте вы избавились от лишнего класса Name, но весь игровой цикл реалзован по-прежнему в Test#next_question. Здесь достаточно будет просто дать методу подходящее имя (например play).