【问题标题】:What's the best way to architect the relationship between train and track objects?构建火车和轨道对象之间关系的最佳方式是什么?
【发布时间】:2012-08-13 09:33:40
【问题描述】:

我正在开发一个视觉跟踪火车的项目。我已经多次重构了火车、轨道和各自的绘图类之间的对象关系,但我对它们中的任何一个都不满意。也许你们可以在这里帮助我。

这是我现在拥有的对象的接口。

曲目:

  • addControlPoint(IntPoint 点)
  • getPointAtPosition(float positionOnTheCurve)
  • getTangentAtPosition(float positionOnTheCurve)
  • getMaxPosition()

TrackDrawer:

  • setGraphicsContext(Graphics g);
  • 绘制(跟踪轨迹);

火车:

  • set/getTrack(Tracks track)
  • set/getTrackPosition(浮动位置)
  • set/getSpeed(int speed)
  • moveForward(elapsedTime)

火车抽屉:

  • setGraphicsContext(Graphics g)
  • 画(火车)

这是它们目前的使用方式。

init() {
    Tracks track = new Tracks();
    track.addPoint( point1 );
    track.addPoint( point2 );
    track.addPoint( point3 );  

    Train train = new Train();
    train.setTrack(track);
    train.setPosition(0);
}

run() {
   while (running) {
       elapsedTime = calcTime();
       update(elapsedTime);
       Graphics g = getGraphics();
       draw(g);
   }
}

update(long elapsedTime) {
    train.setSpeed(10);
    train.moveForward(elapsedTime);
}

draw(Graphics g) {
    trackDrawer.draw(track);
    trainDrawer.draw(train);
}

这里有几个具体问题:

  1. 火车依赖轨道有意义吗?我认为确实如此,因为没有轨道的火车在现实世界中毫无意义。

  2. 为了绘制火车,我需要通过计算轨道本身的切线来找出火车在轨道上所面对的方向。这会导致 TrainDrawer 内部的 Track 依赖,我不在乎。但是,我认为让 Train 负责计算方向矢量(切线)并不一定有意义,因为它仅用于绘制火车,并且没有其他原因。

  3. 一般来说,创建需要以某种方式绘制的对象的最佳实践是什么?很多人告诉我,火车应该知道如何绘制自己,但这似乎对火车本身施加了太多的依赖。感觉不对。

【问题讨论】:

    标签: oop architecture


    【解决方案1】:

    我的第一印象是TrainDrawerTrackDrawer是问题的根源,不应该存在。

    遵循模型视图方法,火车和轨道是模型实体,两者都拥有另一个。如果您考虑一个Draftsman 对象(对应于“视图”),绘图员会从 Tracks and Trains 收集信息并呈现一个连贯的整体。

    【讨论】:

      【解决方案2】:
      1. 如果您的实体包含的逻辑不仅仅是被绘制,我不会直接在轨道上关联火车。取决于当前轨道的火车速度如何?我会在两者之间放一些Tour。这使得在需要时可以轻松抽象和提供不同的行为实现。

      2. 方向已经是第一个信息,并不是真正的火车信息。这在巡演中很合适。

      3. 干得好!火车绝对不负责画自己。如果您必须将火车渲染到其他设备或需要过滤某些细节的可能性,您就会遇到麻烦。

      【讨论】:

      • 不幸的是,我不明白你对“Tour”的意思。有没有机会更详细地解释一下?
      猜你喜欢
      • 2010-10-24
      • 2010-09-15
      • 1970-01-01
      • 2011-04-25
      • 2010-10-09
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      相关资源
      最近更新 更多