在其他类

时间:2018-04-22 23:44:36

标签: ruby oop

我正在从 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

BoardGame需要相互交谈。将Board类对象传递到另一个类' initialize感到奇怪或错误。但我不知道是否有更好的方法让课堂互相交谈,或者有一个班级有另一个班级存储在其变量中。

这是正确的方法吗?什么是让课程分开但又互相交流的最佳方法?我应该在外面初始化两个对象并让它们以这种方式相互通信吗?或者在另一个类中初始化一个,并让该类完成所有繁重的工作?

1 个答案:

答案 0 :(得分:2)

初始化对象的位置问题是经验丰富的开发人员无休止地争论的问题。

需要考虑的是生命周期和“所有权”。在这种情况下,可以认为棋盘对象与游戏具有“强烈的儿童关系”,因为它与游戏一起生存和死亡。从外部的角度来看,甚至不清楚是否需要一个“板” - 它可以完全由游戏封装......但是主板仅用于将游戏“分解”为部分(其他)例如,部件可能包括棋盘上的棋子或分数。

出于这个原因,在游戏构造函数中创建棋盘有很好的意义。如果你想提供一些灵活性(例如board_size),构造函数仍然可以包含“board spec”对象或板参数,但游戏本身可以完全负责创建和销毁板。

为了简单和灵活,其他人仍然认为最好传递板对象(如在你的例子中)。看到?从来没有一个答案。作为学生,您最好的选择是尝试不同的模型,并了解他们在实践中的优势和劣势。并且用YAGNI来表达自己的想法,因为用实际的方式思考往往是这些学术辩论中最好的方法。