Уроки 6-7: Моя программа robot

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

Откатился немного назад. Написал свою прогу: (robot) для лучшего понимания наследования классов.

Робот должен выполнять простые команды: Идти, стоять, поднять руки, присесть.

Хотел узнать, что и главное как можно можно изменить, улучшить.

И хотел ещё добавить статический метод, но пока не придумал как. Может подкинете идею.

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


Вадим Венедиктов Учитель

[В]

Немного запутанно и это, кажется, от того, что задача сформулирована слишком абстрактно.

Робот действительно может идти, стоять и поднимать руки, но делает это всё одновременно и один раз.

Куда интереснее было бы, скажем, сделать робота, который начинает из начального состояния: стою, руки опущены. А потом выполняет действие (которое выберет пользователь), и говорит, какое у него теперь состояние. А потом снова замирает и ждёт команд.

Помельче дроби методы классов, лучше несколько мелких методов по 3-5 строчек, чем один длинный на 10-20.

Логика наследования немного не очевидная. Arms и Legs — это части робота, а Move — это движение, получается, наследуем существительные от глагола :)

Лучше сделать класс RobotPart и чтобы помимо конструктора (в котором инициализируется текущее состояние в переменно, например, @state). У него ещё был метод action, который приводит соотв. часть в движение.

Тогда можно было б создать любое количество детей: руки, ноги, голова, туловище (оно могло бы вытягиваться, например), а потом создать любое количество каждого из этих частей: робот с двумя головами, скажем или тремя руками. Мы уже не завязаны на количество, как в текущей реализации (в классу Move "зашито", какие части есть у робота).

Это всё к вопросу о том, как программу можно улучшить. Но в целом, программа работает, робот действительно ходит, приседает, поднимает руки :)

Молодец!


[Д]

Конечно поле для фантазии здесь обширное, есть где развернуться, но мне хотелось уловить суть.

Логика наследования немного не очевидная. Arms и Legs — это части робота, а Move — это движение, получается, наследуем существительные от глагола :)

Да, согласен, меня это тоже смутило. Просто здесь я упростил себе задачу. Найдя команды, которыми могут воспользоваться все три класса я просто отдал их родителю. Хотел быстрее пройти дальше. В вашем видео к 7 уроку там где Миша говорил: - Неправильно! Хранить классы детей в массиве. Здесь для меня было важно понять, а как по другому можно передать в основную часть программы классы детей.

Помельче дроби методы классов, лучше несколько мелких методов по 3-5 строчек, чем один длинный на 10-20.

Здесь раздробить, можно только метод action_selection у детсих классов. Вначале я так и хотел сделать, но мне показалась, что в таком варианте программа отработает быстрее. Я не прав?


Вадим Венедиктов Учитель

[В]

Вначале я так и хотел сделать, но мне показалась, что в таком варианте программа отработает быстрее. Я не прав?

Скорость работы программы и красота (понятность, логичность) кода часто не дружат друг с другом. Ruby — интерпретируемый язык, поэтому там вызов функции — это, конечно же, дополнительные затраты. Но пока мы учимся (да и в 90% случаев) скорость работы программы не настолько важна, а вот научиться писать хороший код, который легко править, важно.

Но не зацикливайся на этом, лучше просто держи в голове: «если метод разрастается, надо подумать, не пытаюсь ли я одной отвёрткой построить дом». Как-то так. Но это всё уже скорее философия, этому нужно посвящать отдельный курс :)