Я работаю над приложением векторного рисования (в java), и я борюсь с разделением между моими классами моделей и классами view/controller.
Немного фона:
Вы можете рисовать разные формы:
прямоугольники, линии и сегменты пирога
Есть четыре инструмента для управления фигурами на холсте:
инструмент масштабирования, инструмент перемещения, инструмент поворота и инструмент морфинга
Для этого вопроса инструмент морфинга является наиболее интересным: Он позволяет изменять форму, перетаскивая одну из ее точек и настраивая другие свойства, как показано на этом рисунке:
Эти правила преобразования различны для каждой фигуры, и я думаю, что они являются частью бизнес-логики модели, но таким образом, что они должны быть подвержены представлению/контроллеру (классы инструментов), чтобы они могли применить правильный.
Кроме того, фигуры представлены внутри разных значений: - Прямоугольник хранится как центр, ширина, высота, вращение - Строка сохраняется как начальная и конечная точки - сегмент пирога сохраняется как центр, радиус, угол1, угол2
Я планирую добавить в будущем больше фигур, таких как звезды, пузырьки речи или стрелки, каждый со своими контрольными точками.
Я также планирую добавить в будущем дополнительные инструменты, такие как вращающиеся или масштабирующие группы фигур.
Контрольные точки для каждого инструмента различны. Например, при использовании инструмента масштабирования вы не можете захватить центральную точку, но каждая контрольная точка масштабирования должна быть связана с одной точкой поворота (или несколькими, чтобы позволить пользователю выбрать).
Для простых фигур, таких как прямоугольник, линия и пирог, контрольные точки одинаковы для каждого экземпляра класса, но фьючерсы, такие как путь безье или звезда (с настраиваемым количеством спайков), будут иметь различное количество контрольных точек за экземпляр.
Итак, вопрос в том, что хороший способ моделирования и реализации этих контрольных точек?
Поскольку они немного различаются для каждого инструмента и несут некоторые данные конкретного инструмента/контроллера, они каким-то образом относятся к инструменту/контроллеру. Но поскольку они также специфичны для каждого типа формы и несут очень важную логику домена, они также относятся к модели.
Я хотел бы избежать комбинаторного взрыва добавления специального типа контрольной точки для каждой комбинации инструмента/формы всякий раз, когда добавляется один инструмент или форма.
Обновление:. Чтобы привести еще один пример: в будущем может возникнуть мысль, что у меня есть идея для новой формы, которую я хочу поддерживать: дуги. Он похож на сегмент пирога, но выглядит немного по-другому и ведет себя совершенно по-другому при перетаскивании контрольных точек.
Чтобы реализовать это, я хотел бы просто создать класс ArcShape, реализующий интерфейс Shape и сделанный.