Как отделить модель от вида? - PullRequest
3 голосов
/ 27 мая 2010

У меня есть куча модельных объектов.

Эти объекты в конечном итоге визуализируются как представления (скажем, формы) в приложении с расширенными возможностями клиента.

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

Теперь я понимаю, что представление проникло в модель.

Как мне отделить логику вида от объектов модели?

TECH: Java, аннотации Java, Eclipse RCP

РЕДАКТИРОВАТЬ: Мой вопрос теоретический, но я также хотел бы получить некоторые конкретные (реализации) советы.

Ответы [ 5 ]

1 голос
/ 27 мая 2010

Вы можете заменить аннотации:

@DisplayName("My Fancy Name") 
@DisplayGroup("My Fancy Group") 
public String myProperty;

отдельным классом дескриптора:

Descriptor desc = new Descriptor(MyClass.class, "myProperty");
desc.setDisplayName("My Fancy Name");
desc.setDisplayGroup("My Fancy Group");

У вас есть четкое разделение задач, но вы теряете безопасность времени компиляции (в Java, потому что Java не имеет ссылок на свойства).

1 голос
/ 27 мая 2010

Рискуя очевидным, вам нужно хранить информацию, относящуюся к отображению, где-нибудь еще. Не помещайте страницу в код модели - создайте объект для интерфейса, включите в него объекты страницы и дайте каждой странице знать, какие значения она отображает. Это может потребовать определенного количества рефакторинга.

Сказав это, не все, что вы упоминаете, является «представлением». Допустимые значения для поля являются частью логики поля; это следует считать частью модели, а не представлением. Аналогично, если «группа» - это логическая группировка, а не размещение в интерфейсе, ее можно считать частью модели.

0 голосов
/ 21 мая 2012

Представление должно иметь ссылку на модель, но модель не должна иметь ссылку на представление.

Представление можно записать в модель.

Представление прослушивает события в модели, такие как изменение свойства или изменение коллекции.

Вид обновляется при изменении модели.

У вас определенно не должно быть методов на модели, которые отображают модель как представление.

0 голосов
/ 27 мая 2010

Если я правильно понял - вы используете классы моделей как (статическую) модель для создания (части) представления? Почему бы и нет - в вашем случае модель классов (с аннотациями) - это одна модель, объекты - другая.

Пока аннотации просто дают подсказки (например, @Textfield), я не вижу проблемы. Если модель уже содержит ссылки для просмотра объектов (например, ссылку на текстовое поле), то необходимо провести рефакторинг. Проще всего было бы переместить классы модели в отдельный плагин и не добавлять типы * .ui и просматривать плагины как зависимости. Тогда исправь ошибки;)

... и взгляните на привязку данных jface! Очень полезно в архитектуре MVC / MVP!

0 голосов
/ 27 мая 2010

Вы можете посмотреть на шаблон MVC и ввести контроллер в микшер, чтобы обеспечить связь между моделью и представлением.

Это предотвращает проникновение представления в модель, поскольку представление никогда не взаимодействует с моделью, а только с контроллером, который отвечает за все взаимодействие между моделью и представлением

...