我正在从 The Odin Project 做一个tic tac toe。我有两个班级:Board
(其中包含董事会,其中包含所有个人" X"" O")和Game
,它们启动了游戏,跟踪哪一轮,检查胜利/等。我没有做A.I.东西。
我已经设置了基本框架:
class Board
attr_accessor :board
def initialize
@board = Array.new(3, Array.new(3, 'X'))
end
def display_board
@board.each.with_index do |row, i|
row.each.with_index do |column, j|
print "|#{i}#{j}|"
end
puts
end
end
end
class Game
def initialize(player1, player2, board)
@board = board
@player1 = player1
@player2 = player2
end
def check_board
if @board.board[0][0] && @board.board[1][1] && @board.board[2][2]
puts "Winner!"
end
end
end
board = Board.new
game = Game.new('X', 'O', board)
game.check_board
Board
和Game
需要相互交谈。将Board
类对象传递到另一个类' initialize
感到奇怪或错误。但我不知道是否有更好的方法让课堂互相交谈,或者有一个班级有另一个班级存储在其变量中。
这是正确的方法吗?什么是让课程分开但又互相交流的最佳方法?我应该在外面初始化两个对象并让它们以这种方式相互通信吗?或者在另一个类中初始化一个,并让该类完成所有繁重的工作?
答案 0 :(得分:2)
初始化对象的位置问题是经验丰富的开发人员无休止地争论的问题。
需要考虑的是生命周期和“所有权”。在这种情况下,可以认为棋盘对象与游戏具有“强烈的儿童关系”,因为它与游戏一起生存和死亡。从外部的角度来看,甚至不清楚是否需要一个“板” - 它可以完全由游戏封装......但是主板仅用于将游戏“分解”为部分(其他)例如,部件可能包括棋盘上的棋子或分数。
出于这个原因,在游戏构造函数中创建棋盘有很好的意义。如果你想提供一些灵活性(例如board_size),构造函数仍然可以包含“board spec”对象或板参数,但游戏本身可以完全负责创建和销毁板。
为了简单和灵活,其他人仍然认为最好传递板对象(如在你的例子中)。看到?从来没有一个答案。作为学生,您最好的选择是尝试不同的模型,并了解他们在实践中的优势和劣势。并且用YAGNI来表达自己的想法,因为用实际的方式思考往往是这些学术辩论中最好的方法。