Ruby: работа с логическими значениями: как обращаться, не используя военное время для часов Класс - PullRequest
0 голосов
/ 21 мая 2018

TDD

gem 'minitest', '~> 5.2'
require 'minitest/autorun'
require 'minitest/pride'
require_relative 'clock'

class ClockTest < Minitest::Test
 def test_start_at_6
  clock = Clock.new

  assert_equal 6, clock.time
 end

 def test_passage_of_time

  clock = Clock.new
  clock.wait

  assert_equal 7, clock.time

  3.times { clock.wait }

  assert_equal 10, clock.time
 end

 def test_clocks_are_not_military_time

  clock = Clock.new
  8.times { clock.wait }

  assert_equal 2, clock.time
 end
end

КОД

class Clock
 attr_reader :time

 def initialize
  @time = 6
 end

 def wait(time = 1)
  @time += time
 end

 def not_military_time
  @time += (time - 10)
 end
end

Может кто-нибудь подсказать мне, как решить, что часы не военного времени?Это происходит, как и ожидалось: 2, фактическое: 14. Я чувствую, что должно произойти некоторое вычитание для того, чтобы обратиться к часам с 2 вместо 14.

Я знаю, что у меня в коде нетработа, но я на правильном пути?

1 Ответ

0 голосов
/ 24 мая 2018

Если вы просмотрите все тесты, вы увидите, что кроме test_start_at_6 каждый тест, по сути, вызывает wait некоторое количество раз, а затем проверяет правильное время в clock.time.

Если вы посмотрите на свой код, clock.time генерируется attr_reader, и поэтому все, что он когда-либо сделает, вернет текущее значение @time.Таким образом, у вас остается wait как место для реализации поведения, необходимого для прохождения тестов.

Еще одна вещь, на которую следует обратить внимание, это то, что вы в настоящее время слишком усложняете метод wait.Он никогда не вызывается с какими-либо параметрами, поэтому параметр time не нужен.Итак, для начала упростите это до:

def wait
  @time += 1
end

Далее, отойдите от кода и составьте небольшой список, показывающий для каждого текущего времени, какое следующего временидолжно быть после wait вызвано.Затем вы можете подумать о том, как изменить wait так, чтобы он соответствовал требуемому поведению.

С точки зрения того, использовать ли оператор if или case, все, чего вы могли бы достичь, используя case оператор также может быть сделан с if в качестве альтернативы.Лучше всего подумать о наиболее распространенном использовании оператора case, который предназначен для проверки одной и той же переменной на различные возможные значения.то есть выражение case

case @time
when 1
  puts "One o'clock"
when 2
  puts "Two o'clock"
else
  puts "Later!"
end

совпадает с:

if @time == 1
  puts "One o'clock"
elsif @time == 2
  puts "Two o'clock"
else
  puts "Later!"
end

Часто, когда вы просто решаете, какой должна быть логика, вы пишете это какОператор if, а затем, как только он заработает, вы поймете, что его можно более элегантно выразить как оператор case.В этом упражнении if должно быть в порядке.

...