我有一个对象,其中我试图遵循“告诉不要问”的原则。所以没有显示代码我告诉对象做事情。物体是一个球,所以我有能力将球送向另一个物体。这种方法将在内部调整球的速度,朝向它所服务的物体。
我遇到的问题是当我希望在GUI上显示球时。为此,我将需要x和y坐标,所以当我绘图时,我很想在球上添加一个方法转换为DTO,这将允许我访问x和y位置。
我遇到的问题我可以忘掉这个DTO,将球的属性添加到球中并完成它,但这意味着球可以调整,而不是坚持我正在使用的核心逻辑。
对于这种情况有什么建议吗?
这是一些帮助可视化问题的伪代码。球的DTO在球内用于管理它的内部状态,但在某些时候我需要知道它在哪里。我提出的每一种方式都违反了封装的全部内容。
ball = new Ball();
ball.ServeTo(player)
// Logic, blah blah blah...
// Wish to draw now...
drawer.Draw(ball.ToDTO())
// Problem is I could easily do this
ball = ball.ToDTO()
ball.x = 100
// Just violated core logic, should not be able to move here etc...
答案 0 :(得分:3)
我强烈建议阅读两篇关于主题为“为什么有吸气鬼和塞特斯邪恶”和“有关吸气者和二传手的更多信息”的文章。特别是后者提供了使用构建器模式解决该问题。
答案 1 :(得分:0)
您只能实现getter而不是setter来限制访问。或者,球可以通过调用某种绘制行为并通过“抽屉”来使用来吸引自己。