在Ruby中,如何让父对象拥有的两个对象彼此对话?
首先,如果这是一个n00b问题,我很抱歉。我是一名自学成才的网络开发人员,这是我第一次真正进入应用程序领域。我试图找到我所寻找的答案,但我不确定正确的术语,因此没有找到任何相关的结果。我想这是因为要么我不知道我需要什么的正确方式;答案很明显,不需要写,或者我问的问题很愚蠢,根本不存在这个概念,我应该完全用另一种方式来做 不管怎样,请回答我的问题。我正在开发一个有3个类的应用程序,这给我带来了麻烦。还有“MainContainer”,它主要处理UI;挑选任务的“指派者”;以及完成任务的“工人”。这是一个非常早期的阶段,但这就是它现在的样子在Ruby中,如何让父对象拥有的两个对象彼此对话?,ruby,oop,Ruby,Oop,首先,如果这是一个n00b问题,我很抱歉。我是一名自学成才的网络开发人员,这是我第一次真正进入应用程序领域。我试图找到我所寻找的答案,但我不确定正确的术语,因此没有找到任何相关的结果。我想这是因为要么我不知道我需要什么的正确方式;答案很明显,不需要写,或者我问的问题很愚蠢,根本不存在这个概念,我应该完全用另一种方式来做 不管怎样,请回答我的问题。我正在开发一个有3个类的应用程序,这给我带来了麻烦。还有“MainContainer”,它主要处理UI;挑选任务的“指派者”;以及完成任务的“工人”。这
class MainContainer
def setup
@worker = Worker.new(:x => 200, :y => 200)
@assigner = Assigner.new(:x => 400, :y => 300)
end
# update & draw code
end
class Assigner
def set_target
parent.worker.target self.x, self.y
end
# input, update & draw code
end
class Worker < GameObject
def target(tx, ty)
@target_x = tx
@target_y = ty
@has_task = true
end
# update & draw code
end
class主容器
def设置
@worker=worker.new(:x=>200,:y=>200)
@assigner=assigner.new(:x=>400,:y=>300)
结束
#更新和绘制代码
结束
类赋值器
def设置_目标
parent.worker.target self.x,self.y
结束
#输入、更新和绘制代码
结束
类工作者<游戏对象
def目标(tx,ty)
@目标x=tx
@目标_y=ty
@has_task=true
结束
#更新和绘制代码
结束
应用程序的基本流程是这样的:一个MainContainer实例加载并在屏幕上显示UI,包括分配者和工作者。然后,用户使用赋值器在UI中移动并选择任务。到目前为止,一切正常
我不明白的是赋值人如何将值传递给工作者。示例中的代码是worker的set_target方法。parent.worker.target self.x,self.y
行是我最近的一次尝试。我在这里尝试过的其他方法包括@worker.target self.x、self.y
我曾考虑将@worker
传递给@assigner
,但计划是让任意数量的员工随时间增加/减少。我计划使用WorkerManager
来处理这些问题,它将跟踪当前可用的工作人员数量,但如果我将其传递到@assigner,传递的不仅仅是它的一个副本吗?我离实现类似的东西还有很长的路要走,所以我还没有对它进行测试,也许这就是要走的路
我考虑过的另一件事是让员工成为一名全球员工,但这是一个可能会再次频繁出现的问题,因此我最终会得到一个充满全球员工的应用程序,我猜这不是正确的方式
我是Webdev的,所以我能想到的唯一其他解决方案是将所有这些都建立数据库。如果我不能做任何其他事情,这是最后的办法
无论如何,我要重新陈述我的问题。在MainContainer的一个实例中,如何让它的赋值器和工作器在彼此之间传递数据
我非常感谢您的帮助,即使是类似“stfu n00b,阅读此:-相关链接”的内容。我认为设计中的某个地方存在缺陷。你说指派者选择任务,工人做。看起来他们不需要沟通。如果他们需要的话,他们可能会做得比您描述的更多,这可能意味着有机会重构成责任更少的更孤立的类 那么,如果主容器拥有所有控制权呢
def main
@worker = Worker.new
@assigner = Assigner.new
target = @assigner.target
result = @worker.do_work(target)
update_ui(result)
end
UI实际上应该与业务逻辑分开,上面的伪代码只是说明了将控制权交给MainContainer的想法,以避免工作人员和分配人员相互交谈。这还允许您在必要时处理多个工作人员
我希望这能有所帮助。我的回答可能会因为我没有清楚地理解问题的要点而受到影响,所以请记住这一点,并纠正我的错误 最好的方法可能是将工作者和分配者完全隔离,并将所有逻辑放入控制器中 但是,如果您需要工人之间进行更多的沟通,并且希望让转让人参与其中,那么转让人最好了解其创建的工人,让工人知道是哪个转让人创建了他们。然后,分配者应负责创建工人(以及创建分配者的控制器)。类似(丑陋、未优化和未测试的代码):
类赋值器
属性读取器:工人
def初始化
@工人=[]
结束
def创建工作程序
worker=worker.new
worker.assigner=self
@工人们,这真的帮了我的忙,我现在已经开始工作了。我让MainContainer从赋值器获取数据并将其传递给Worker,而不是赋值器将数据传递给Worker。谢谢!谢谢你花时间回答我的问题。让工人归转让人所有并不是我真正想要的,因为工人也会被应用程序的许多其他部分操纵。然而,您已经提出了一些非常有用的观点,并且知道所有内容都是通过引用传递的,这对我有很大的帮助。我有我需要的答案,但非常感谢你的贡献!
class Assigner
attr_reader :workers
def initialize
@workers = []
end
def create_worker
worker = Worker.new
worker.assigner = self
@workers << worker
worker
end
end
class Worker
attr_accessor :assigner
end