#java #mvvm #javafx
#java #mvvm #javafx
Вопрос:
Я был вдохновлен статьей Отделить представление от его поведения для создания тестируемого пользовательского интерфейса и хочу переработать мое приложение JavaFX с помощью шаблона MVVM.
(источник:s-msft.com )
.
В идеале модель представления должна быть независимой от представления и тестироваться как обычный класс Java. Также MVVM использует концепцию Command для изменения модели представления из View. Таким образом, реализация команды является частью реализации модели представления и может быть просто протестирована.
Вопрос в том, как команда должна быть реализована, если ее результатом является изменение вида? Например. в View_1 у меня есть кнопка, после нажатия на которую должен быть создан и показан новый вид (например, View_2). Должна ли такая команда быть частью представления и вообще не быть тестируемой?
Комментарии:
1. Фактически не отвечая на ваш вопрос: взгляните на реактивное моделирование . Это парадигма для моделирования и реализации изменений представления (особенно в JavaFX), используемая Volkswagen Group Research.
2. @beatngu13 Честно говоря, не понял подход Volkswagen к созданию пользовательского интерфейса. Презентация слишком теоретична.
3. Я согласен, что презентация могла бы быть немного понятнее. Если вам интересно, задайте соответствующий вопрос, и я объясню это вам.
Ответ №1:
Я думаю, что команда может быть проверяемой. Я не уверен, как именно вы собираетесь переключать представления, но AFAIK в JavaFX есть что-то вроде Scene и Stage, которые являются родительскими для сцен, верно?
Итак, в вашей команде вы передаете этап как зависимость и при выполнении устанавливаете для него новую сцену.
И вы можете легко протестировать это в модульных тестах — вы можете смоделировать сцену и проверить, передает ли команда ей правильную сцену.
Я не помню точных деталей JavaFX, но я бы реализовал это следующим образом:
class SwitchSceneCommand {
protected Stage stage;
protected Scene originalScene; // you can keep original scene if you want to have some undo-redo functionality
protected Scene newScene;
public SwitchSceneCommand(Stage stage, Scene originalScene, Scene newScene)
{
this.stage = stage;
this.originalScene = originalScene;
this.newScene = newScene;
}
public void execute()
{
this.stage.setScene(this.newScene);
}
}
Комментарии:
1. Именно этого я и стараюсь избегать — тестирования чисто визуальных компонентов пользовательского интерфейса.