Как лучше всего построить отношения между объектами поезда и пути? - PullRequest
3 голосов
/ 25 июля 2010

Я работаю над проектом визуального отслеживания поездов.Я несколько раз рефакторил объектные отношения между поездами, рельсами и соответствующими классами рисования, и я не доволен ни одним из них.Может быть, вы, ребята, можете помочь мне здесь.

Вот интерфейсы для объектов, которые у меня сейчас есть.

Треки:

  • addControlPoint (IntPoint point)
  • getPointAtPosition (плавающая позицияOnTheCurve)
  • getTangentAtPosition (плавающая позицияOnTheCurve)
  • getMaxPosition ()

TrackDrawer:

  • setGraphicsContext (Графика g);
  • ничья (дорожка треков);

Поезд:

  • set / getTrack (след треков)
  • set / getTrackPosition (плавающая позиция)
  • set / getSpeed ​​(int speed)
  • moveForward (elapsedTime)

TrainDrawer:

  • setGraphicsContext (Графика g)
  • draw (Train train)

А вот как они используются в данный момент.

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. Чтобы нарисовать поезд, мне нужно выяснить направление движения поезда.треки путем вычисления тангенса на самом треке.Это вызывает зависимость Track внутри TrainDrawer, которая мне не нужна.Однако я не думаю, что имеет смысл возлагать на Train ответственность за вычисление вектора направления (тангенса), когда он необходим ТОЛЬКО для рисования поезда, и ни по какой другой причине.

  3. В целом, какова лучшая практика для создания объектов, которые нужно каким-то образом рисовать?Многие люди говорят мне, что поезд должен знать, как рисовать сам, но это, похоже, накладывает слишком много зависимостей на сам поезд.Это не правильно.

Ответы [ 2 ]

2 голосов
/ 25 июля 2010

У меня первое впечатление, что TrainDrawer и TrackDrawer являются источником проблемы и не должны существовать.

Следуя подходу модельного представления, поезда и пути являются модельными объектами, ни у одного из которых нет . Если вы рассматриваете объект Draftsman (соответствующий «представлению»), рисовальщик собирает информацию из треков и поездов и отображает связное целое.

2 голосов
/ 25 июля 2010
  1. Если ваши сущности содержат больше логики, чем только нарисованные, я бы не связывал поезд непосредственно на пути.Как насчет скорости поезда в зависимости от текущей колеи?Я бы поставил тур между ними.Это позволяет легко абстрагироваться и предоставлять различные реализации поведения при необходимости.

  2. Направление уже является первой информацией, которая на самом деле не является информацией о поезде.Это хорошее место в туре.

  3. Хорошая работа!Поезд определенно не несет ответственности за рисование.Если вам когда-нибудь придется перевести поезд на другое устройство или вам нужна возможность отфильтровать некоторые детали, у вас возникнут проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...