Skip to content

Instantly share code, notes, and snippets.

@alexandersazonof
Last active December 16, 2018 20:42
Show Gist options
  • Save alexandersazonof/5bf3cd11869fb095957b4196cfce4a28 to your computer and use it in GitHub Desktop.
Save alexandersazonof/5bf3cd11869fb095957b4196cfce4a28 to your computer and use it in GitHub Desktop.
#В одном массиве записано количество мячей, забитых футбольной командой в каждой из 20 игр,
#в другом - количество пропущенных мячей в этой же игре.
#Для каждой игры определите словесный результат игры (выигрыш, проигрыш или ничью)
class Game
attr_accessor :count_missed, :count_scored
def initialize (count_missed, count_scored)
@count_missed = count_missed
@count_scored = count_scored
end
end
class Score
attr_accessor :game
def initialize (game)
@game = game
end
def result
game.count_missed < game.count_scored ? "win" : (game.count_missed > game.count_scored ? "lose" : "draw")
end
end
class Repository_Balls
attr_accessor :balls
def initialize (balls_scored, balls_missed)
@balls = []
balls_missed.each_index do |i|
balls << Game.new(balls_missed.at(i), balls_scored.at(i))
end
end
def report
balls.each do |i|
score = Score.new(i)
puts "Match score (#{i.count_scored}-#{i.count_missed}) #{score.result.upcase}"
end
end
end
balls_missed = [1, 2, 3, 1, 1, 2]
balls_scored = [1, 4, 1, 1, 2, 1]
rep = Repository_Balls.new(balls_missed, balls_scored)
rep.report
@aya-soft
Copy link

  1. Очень трудно понимать смысл переменных, нужно стараться их проще и понятнее называть
  2. Назначение классов из названий тоже трудно угадывается
  3. При объявлении методов ЛУЧШЕ использовать скобки: def initialize(count_balls)
  4. Это нигде не используется: @len = count_balls.size - значит надо удалить
  5. В ООП большинство объектов мы создаем: self-методы лучше использовать для чего-то очень общего
  6. Класс RepositoryBalls мало полезен, все что он умеет доставать элемент из массива, но сам массив итак это умеет

@aya-soft
Copy link

Давай подумаем как лучше выбрать классы и их обязанности.
Как ты думаешь, какому понятию принадлежит СЧЕТ (2 : 1)?

@alexandersazonof
Copy link
Author

Давай подумаем как лучше выбрать классы и их обязанности.
Как ты думаешь, какому понятию принадлежит СЧЕТ (2 : 1)?

Я бы сделал 2 класса Game и Score
В Game у меня бы были забитые и пропущенные мячи
А в Score принимал экземпляр класса Game и мог выводить результат

@aya-soft
Copy link

aya-soft commented Dec 2, 2018

Давай подумаем, а разве классу Game недостаточно информации, чтобы выдать результат?

@aya-soft
Copy link

aya-soft commented Dec 2, 2018

У тебя в итоге так и не получилось ООП решение,
вот этот кусок кода так и остался процедурным:
balls_missed.each_index do |i|
game = Game.new(balls_missed.at(i), balls_scored.at(i))
score = Score.new(game)
puts "#{i+1} match Score (#{game.count_missed}-#{game.count_scored}) #{score.result.upcase}"
end

@aya-soft
Copy link

aya-soft commented Dec 2, 2018

Наверное нужен класс, который будет получать два исходных массива и собирать из них набор игр.
И он должен иметь метод report, который будет игры обходить и строить отчет о резлультатах

@alexandersazonof
Copy link
Author

Наверное нужен класс, который будет получать два исходных массива и собирать из них набор игр.
И он должен иметь метод report, который будет игры обходить и строить отчет о резлультатах

Единственное мне не нравится логика в конструкторе

class Repository_Balls
  attr_accessor :balls

  def initialize (balls_scored, balls_missed)
    @balls = []
    balls_missed.each_index do |i|
      balls << Game.new(balls_missed.at(i), balls_scored.at(i))
    end
  end

  def report
    balls.each do |i|
      score = Score.new(i)
      puts "Match score (#{i.count_scored}-#{i.count_missed})  #{score.result.upcase}"
     end
  end

end

@aya-soft
Copy link

aya-soft commented Dec 16, 2018

Вот тут, смотри:

class Score
  attr_accessor :game

  def initialize (game)
    @game = game
  end

  def result
    game.count_missed < game.count_scored ? "win" : (game.count_missed > game.count_scored ? "lose" : "draw")
  end
end
```

Ты берешь Игру, достаешь из нее внутренности и с ними работаешь!
game.count_missed < game.count_scored

А может Игра сама со своими внутренностями поработать и отдать нам уже результат?
game.result 

@alexandersazonof
Copy link
Author

Вот тут, смотри:

class Score
  attr_accessor :game

  def initialize (game)
    @game = game
  end

  def result
    game.count_missed < game.count_scored ? "win" : (game.count_missed > game.count_scored ? "lose" : "draw")
  end
end

Ты берешь Игру, достаешь из нее внутренности и с ними работаешь!

class Score
  attr_accessor :count_missed, :count_scored

  def initialize (game)
    @count_missed = game.count_missed
    @count_scored = game.count_scored
  end

  def result
    count_missed < count_scored ? "win" : (count_missed > count_scored ? "lose" : "draw")
  end
end

@aya-soft
Copy link

Ты видимо невнимательно прочитал мой коментарий :(

В этом варианте у тебя принципиально ничего не поменялось

@alexandersazonof
Copy link
Author

alexandersazonof commented Dec 16, 2018

Ты видимо невнимательно прочитал мой коментарий :(

В этом варианте у тебя принципиально ничего не поменялось

Так получается слабая связанность
Если я правильно понял , что нужно сделать)

class Score
  attr_accessor :count_missed, :count_scored

  def initialize (count_missed, count_scored)
    @count_missed = count_missed
    @count_scored = count_scored
  end

  def result
    count_missed < count_scored ? "win" : (count_missed > count_scored ? "lose" : "draw")
  end
end


class Repository_Balls
  attr_accessor :balls

  def initialize (balls_scored, balls_missed)
    @balls = []
    balls_missed.each_index do |i|
      balls << Game.new(balls_missed.at(i), balls_scored.at(i))
    end
  end

  def report
    balls.each do |i|
      score = Score.new(i.count_scored, i.count_missed)
      puts "Match score (#{score.count_scored}-#{score.count_missed})  #{score.result.upcase}"
     end
  end

end

@aya-soft
Copy link

aya-soft commented Dec 16, 2018

Видимо понял неправильно, возможно спешишь

У нас есть класс Game, который уже знает свой счет. Зачем кого-то другого спрашивать выигрышная игра или нет, если сама Игра уже вполне владеет этой информацией?

@game = Game.new(count_missed, count_scored)
puts @game.result

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment