У меня есть объект, в котором я пытаюсь следовать принципу "Не говори". Поэтому, не показывая код, я говорю объекту что-то делать. Объект представляет собой шар, поэтому у меня есть возможность подавать мяч к другому объекту. Этот метод внутренне отрегулирует скорость шара, чтобы направиться к объекту, которому он был подан.
Проблема в том, что я хочу отобразить мяч в графическом интерфейсе. Для этого мне понадобятся координаты 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...