Откатился немного назад. Написал свою прогу: (robot) для лучшего понимания наследования классов.
Робот должен выполнять простые команды: Идти, стоять, поднять руки, присесть.
Хотел узнать, что и главное как можно можно изменить, улучшить.
И хотел ещё добавить статический метод, но пока не придумал как. Может подкинете идею.
Немного запутанно и это, кажется, от того, что задача сформулирована слишком абстрактно.
Робот действительно может идти, стоять и поднимать руки, но делает это всё одновременно и один раз.
Куда интереснее было бы, скажем, сделать робота, который начинает из начального состояния: стою, руки опущены. А потом выполняет действие (которое выберет пользователь), и говорит, какое у него теперь состояние. А потом снова замирает и ждёт команд.
Помельче дроби методы классов, лучше несколько мелких методов по 3-5 строчек, чем один длинный на 10-20.
Логика наследования немного не очевидная. Arms
и Legs
— это части робота, а Move
— это движение, получается, наследуем существительные от глагола :)
Лучше сделать класс RobotPart
и чтобы помимо конструктора (в котором инициализируется текущее состояние в переменно, например, @state
). У него ещё был метод action
, который приводит соотв. часть в движение.
Тогда можно было б создать любое количество детей: руки, ноги, голова, туловище (оно могло бы вытягиваться, например), а потом создать любое количество каждого из этих частей: робот с двумя головами, скажем или тремя руками. Мы уже не завязаны на количество, как в текущей реализации (в классу Move
"зашито", какие части есть у робота).
Это всё к вопросу о том, как программу можно улучшить. Но в целом, программа работает, робот действительно ходит, приседает, поднимает руки :)
Молодец!
Конечно поле для фантазии здесь обширное, есть где развернуться, но мне хотелось уловить суть.
Логика наследования немного не очевидная. Arms и Legs — это части робота, а Move — это движение, получается, наследуем существительные от глагола :)
Да, согласен, меня это тоже смутило. Просто здесь я упростил себе задачу. Найдя команды, которыми могут воспользоваться все три класса я просто отдал их родителю. Хотел быстрее пройти дальше. В вашем видео к 7 уроку там где Миша говорил: - Неправильно! Хранить классы детей в массиве. Здесь для меня было важно понять, а как по другому можно передать в основную часть программы классы детей.
Помельче дроби методы классов, лучше несколько мелких методов по 3-5 строчек, чем один длинный на 10-20.
Здесь раздробить, можно только метод action_selection
у детсих классов. Вначале я так и хотел сделать, но мне показалась, что в таком варианте программа отработает быстрее. Я не прав?
Вначале я так и хотел сделать, но мне показалась, что в таком варианте программа отработает быстрее. Я не прав?
Скорость работы программы и красота (понятность, логичность) кода часто не дружат друг с другом. Ruby — интерпретируемый язык, поэтому там вызов функции — это, конечно же, дополнительные затраты. Но пока мы учимся (да и в 90% случаев) скорость работы программы не настолько важна, а вот научиться писать хороший код, который легко править, важно.
Но не зацикливайся на этом, лучше просто держи в голове: «если метод разрастается, надо подумать, не пытаюсь ли я одной отвёрткой построить дом». Как-то так. Но это всё уже скорее философия, этому нужно посвящать отдельный курс :)