- Этот файл описания обязательно должен быть в репозитории, содержание я описал тут в рыбках - https://github.com/Kortium/Ruby-Fishes/pull/1/files#diff-04c6e90faac2675aa89e2176d2eec7d8
- С тестами отлично - один только упал, остальные рабочие, на этом этапе все принимается.
- По зпуску программы - если добавила гем, сделай Gemfile чтобы можно было дотянуть зависимости, сразу программа так не запускается без изучения кода и ошибок вызова чтобы ее стартануть.
- В целом очень хорошая работа, хотел бы выделить один момент который пронизывает всю твою работу, критичным сейчас не является, но на перспективу я хотел бы чтобы ты на этот момент обратила внимание, и аккуратно гачала пробовть писать код именно так. Это и есть зарождение твоего стиля.
Общий комментарий по всему коду - все усвоено и применено в нужных местах, но для понимания общей картины твоего погружения в руби рассмотрим детально один пример:
У тебя есть код:
# lib/vechicle.rb:32
def stop!
if !@motion
puts "#{get_vehicle_name} already stopped"
else
@motion = false
puts "#{get_vehicle_name} stopped"
end
end
Для хорошего читабельного кода старайся вести диалог (используй глаголы) если дело касается дейсвтий или состояний, то есть такая конструкция читается легче и тебе и мне:
def stop!
if stopped?
puts "#{get_vehicle_name} already stopped"
# .... cutted code
end
Мы детально не рассматривали еще одну интересную конструкцию, но есть еще алиас not для !-отрицания, то есть:
!@motion
# то же самое что и
not @motion
# консоль:
irb(main):001:0> @motion = true
=> true
irb(main):002:0> !@motion
=> false
irb(main):003:0> not @motion
=> false
irb(main):004:0> not !@motion
=> true
Это нам дает возможность записать код например таким образом:
def stop!
if not moving?
puts "#{get_vehicle_name} already stopped"
# .... cutted code
end
Пример не самый лучший для выразительности, но читабельности в плане передачи "смысла" от тебя мне через код в виде логики рассуждения и ее воплощение в коде.
Что дает такое описание в принципе - когда ты хочешь что-то описать словами, тебе необходимо побдирать слова чтобы выразить то что ты хочешь сообщить. В момент осознания и рефлексии ситуации ты эти слова начинаешь формировать из своего культурного опыта (скилы, образование - твоя библиотека в голове) и делаешь самое главное - формулируешь мысль.
Так вот на этапе формулировки происходит самое важное в мышлении (в мыследеятельности) - ты формализуешь результат своего мышления, таким образом получая "закрепление" того что ты сейчас сделала у себя в голове (на полочке) в виде конкретного "гробика для мысли" который к которому ты всегда вернешься очень быстро, и так как конструкция будет "законченой".
Таки образом нечно сформулированное можно положить на полочку и использовать далее, то это значит что ты работу выполнила, "проработала" ситуацию и в будущем ты не будешь ее заново "обдумывать" а просто будешь видя знакомый констекст ее применения пользоваться результатом своего мышления, без необходимости тратить на это еще раз время.
Это важная часть в получении полезного опыта, и именно синтаксис и возможности языка руби очень помогают делать такие "обобщения" в виде названия методов и управляющих конструкций, потому что есть возможность писать максимально естественно, создавая в голове синергию с написанными кодом, без необходимости "декодировать" разные синаксические конструкции в то что они значат на самом деле:
def stop!
# Тут не нужно выполнить две операции. Первая - хранить в голове значение @motion так как не сразу очевидно что такое "движение"
if !@motion
# ...
end
Простое переименование в глагол / дейсвтие сразу рефакторит этот момент:
if stopped?
# ...
А если мы хотим не перебрасывать из контекста в контекст то мы как бы пишем рассказ который связан строчками кода и у нас получается "повествование" и мы можем как-бы рассказ вести:
Остановить технику: если она не движется то сообщить "техника уже остановлена" ...
if not moving?
puts "#{get_vehicle_name} already stopped"
# ...
Это основной комментарий который тебе будет полезен, в остальном ты тему понимаешь очень хорошо, работаем дальше.