OO封装 - 对象转换到“内部”

时间:2011-04-06 21:58:45

标签: oop language-agnostic

我有一个对象,其中我试图遵循“告诉不要问”的原则。所以没有显示代码我告诉对象做事情。物体是一个球,所以我有能力将球送向另一个物体。这种方法将在内部调整球的速度,朝向它所服务的物体。

我遇到的问题是当我希望在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...

2 个答案:

答案 0 :(得分:3)

我强烈建议阅读两篇关于主题为“为什么有吸气鬼和塞特斯邪恶”和“有关吸气者和二传手的更多信息”的文章。特别是后者提供了使用构建器模式解决该问题。

  1. Why getter and setter methods are evil
  2. More on getters and setters

答案 1 :(得分:0)

您只能实现getter而不是setter来限制访问。或者,球可以通过调用某种绘制行为并通过“抽屉”来使用来吸引自己。