-
-
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
commented
Nov 27, 2018
- Очень трудно понимать смысл переменных, нужно стараться их проще и понятнее называть
- Назначение классов из названий тоже трудно угадывается
- При объявлении методов ЛУЧШЕ использовать скобки: def initialize(count_balls)
- Это нигде не используется: @len = count_balls.size - значит надо удалить
- В ООП большинство объектов мы создаем: self-методы лучше использовать для чего-то очень общего
- Класс RepositoryBalls мало полезен, все что он умеет доставать элемент из массива, но сам массив итак это умеет
Давай подумаем как лучше выбрать классы и их обязанности.
Как ты думаешь, какому понятию принадлежит СЧЕТ (2 : 1)?
Давай подумаем как лучше выбрать классы и их обязанности.
Как ты думаешь, какому понятию принадлежит СЧЕТ (2 : 1)?
Я бы сделал 2 класса Game и Score
В Game у меня бы были забитые и пропущенные мячи
А в Score принимал экземпляр класса Game и мог выводить результат
Давай подумаем, а разве классу Game недостаточно информации, чтобы выдать результат?
У тебя в итоге так и не получилось ООП решение,
вот этот кусок кода так и остался процедурным:
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
Наверное нужен класс, который будет получать два исходных массива и собирать из них набор игр.
И он должен иметь метод report, который будет игры обходить и строить отчет о резлультатах
Наверное нужен класс, который будет получать два исходных массива и собирать из них набор игр.
И он должен иметь метод 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
Вот тут, смотри:
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
Вот тут, смотри:
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
Ты видимо невнимательно прочитал мой коментарий :(
В этом варианте у тебя принципиально ничего не поменялось
Ты видимо невнимательно прочитал мой коментарий :(
В этом варианте у тебя принципиально ничего не поменялось
Так получается слабая связанность
Если я правильно понял , что нужно сделать)
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
Видимо понял неправильно, возможно спешишь
У нас есть класс Game, который уже знает свой счет. Зачем кого-то другого спрашивать выигрышная игра или нет, если сама Игра уже вполне владеет этой информацией?
@game = Game.new(count_missed, count_scored)
puts @game.result