我正在考虑设计像迷宫中的男人这样简单的练习。
我想制作Maze对象,在其中放入一些Man对象,并为每个对象调用solve()以离开Maze。 男人应该对迷宫一无所知。它可以尝试去寻找出路。
以下是我的看法:
maze = Maze.new
man1 = Man.new
man2 = Man.new
man3 = Man.new
maze.put(man1,man2,man3)
maze.men.each do |man| { man.solve }
但是如何实现这些类的主体呢? 除非我给Maze实例,否则男人怎能知道如何走进迷宫呢? 但如果我这样做:
maze.put(man1(maze),man3(maze),man2(maze))
如果我可以向他们提供Maze实例,那么将男性置于迷宫内的原因是什么?
这是我不懂的,也找不到优雅的解决方案。
答案 0 :(得分:1)
以这种方式思考:每个类属于哪些数据?它有哪些方法可以处理这些数据?这是面向对象的:捆绑数据和相关代码。
迷宫课不需要了解任何男人。这是一个迷宫。它只是一些墙壁,一些结构。像这样构建它,好像它之外没有任何东西存在。制定一些方法来获取有关迷宫的信息,例如是否在某个角落,角落,交叉点都有墙......
在你的情况下,Man课程是出于一个目的而设想的:找到离开迷宫的道路。因此,男人应该在迷宫中占据一席之地(他的部分数据)和一些帮助他寻找出口的方法。例如,一些深度优先搜索算法。
当然,你可以拥有一些目前在迷宫中嵌入迷宫的所有人的集合。但这不是必要的。你可以使用任何其他集合来控制男人并迭代他们。
maze = Maze.new
man1 = Man.new(maze)
...
men = Array.new
men[0] = man1
...
men.each do |man| {man.solve}
答案 1 :(得分:0)
您可以添加一个名为Map的新类。迷宫可以有一个名为GetMap的方法,它返回迷宫的地图。此地图可用于检查人是否正在做出正确的动作。 因此,地图将是迷宫与人之间的共同点。但如果您想跟踪迷宫内男子的当前位置,这可能无济于事。