OO encapsulation - преобразование объекта, чтобы добраться до "innards" - PullRequest
2 голосов
/ 07 апреля 2011

У меня есть объект, в котором я пытаюсь следовать принципу "Не говори". Поэтому, не показывая код, я говорю объекту что-то делать. Объект представляет собой шар, поэтому у меня есть возможность подавать мяч к другому объекту. Этот метод внутренне отрегулирует скорость шара, чтобы направиться к объекту, которому он был подан.

Проблема в том, что я хочу отобразить мяч в графическом интерфейсе. Для этого мне понадобятся координаты 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 ]

3 голосов
/ 07 апреля 2011

Я настоятельно рекомендую прочитать две статьи на тему «Почему добытчики и сеттеры злые» и «Еще о добытчиках и сеттерах». Особенно последний предлагает использовать шаблон решения для решения этой проблемы.

  1. Почему методы получения и установки злые
  2. Подробнее о геттерах и сеттерах
0 голосов
/ 07 апреля 2011

Вы можете использовать только геттеры, а не сеттеры для ограничения доступа.В качестве альтернативы, мяч может вытянуть себя, вызвав какое-то поведение при рисовании и передав в «ящик» для использования.

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