Просмотр связанных команд в приложении MVVM

#java #mvvm #javafx

#java #mvvm #javafx

Вопрос:

Я был вдохновлен статьей Отделить представление от его поведения для создания тестируемого пользовательского интерфейса и хочу переработать мое приложение JavaFX с помощью шаблона MVVM.

Шаблон 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. Именно этого я и стараюсь избегать — тестирования чисто визуальных компонентов пользовательского интерфейса.