Что мы считаем моделью для MVVM (применяется к JavaFX)? - PullRequest
0 голосов
/ 14 января 2019

Я немного озадачен тем, как организовать код в JavaFX (при условии, что я собираюсь пойти по пути MVVM).

Рассмотрим следующую схему стандартной 4-уровневой архитектуры:

enter image description here

Где находится "модель" в MVVM? Находится ли он внутри слоя «Интерфейс пользователя» или на уровне «Application / Domain-Layer»? Я мог бы представить, что модель MVVM является представлением (проекцией) внутренней модели, подходящей для текущего представления, но я не уверен в том, что я видел, как плавал в сети.

Как пример:

У меня есть простое приложение для мороженого. Его прикладной уровень предоставляет методы:

  • IceCreamService.iceCreams(): List<String>;
  • IceCreamService.flavours(iceCream: String): List<String>.

Пользовательский интерфейс будет иметь комбинированный список со списком мороженого и, основываясь на выборе пользователя, позволит ему затем выбрать некоторые вкусы. Затем есть кнопка для отправки заказа.

Вопросы:

Что мы считаем здесь моделью? Является ли это IceCreamService тем, что мы называем моделью, ИЛИ моделью будет класс, созданный нами на уровне пользовательского интерфейса, состоящий из свойств / наблюдаемых объектов? Если позже, кто отвечает за заполнение этой модели данными? «Контроллер» (ViewModel) или он должен быть достаточно умным, чтобы сделать это сам (то есть он имеет ссылку на IceCreamService?)

Спасибо!

1 Ответ

0 голосов
/ 14 января 2019

MVC и его производные шаблоны проектирования всегда имеют проблему «10 человек найдут 12 способов ее реализовать», поэтому я бы кратко указал на несколько «популярных» реализаций.

Пока что общим остается то, что ваш «Пользовательский интерфейс» определенно отображается на «Вид» в MVVM. Тогда это становится немного спорным с этого момента.

ViewModel - это мозг

Одним из популярных способов реализации MVVM является то, что ViewModel - это мозг всего приложения. В этом случае «Приложение» отображается на «ViewModel», а «Домен» - на «Модель». ViewModel контролирует (и решает), что и как получить данные, а также что и как он хочет предоставить представлению. В большинстве случаев «Модель» - это простой класс POJO (например, IceCream класс).

Для JavaFX вы бы позволили всем свойствам в Model и ViewModel быть представлены какой-то реализацией Property (то есть чем-то, что реализует этот интерфейс). Если вы не используете API, такой как «mvvmFX», то, скорее всего, ваш View будет иметь свойства, связанные с другими свойствами в ViewModel. Если вы используете «mvvmFX» (который я не использовал), то вы (скорее всего) привязали бы свойства View к ViewModel через имя свойства (что и делает WPF).

При таком подходе ViewModel отвечает за получение списка мороженого. IceCreamService можно рассматривать как отдельный Service слой, или вы можете предположить, что он является частью ViewModel (он сам не является ViewModel, но он принадлежит ViewModel). Если вы хотите обновить этот список, именно ViewModel решит это.

Модель как домен

Другая реализация заключается в том, чтобы заставить Model управлять данными, во многом как в hibernate в Spring. Модельные классы продолжают представлять данные (или объекты и т. Д.), Но имеют собственную логику персистентности Это означает, что если вы обновите значение объекта Model (например, изменит вкус экземпляра IceCream), модель узнает, что он «грязный», и отправит изменение в хранилище, например.

MVCVM

Я также читал о другом подходе . Короче говоря, он похож на первый подход, но он перемещает класс IceCreamService в совершенно новый слой под названием «Контроллер».

Ваш пример

На основе вашего примера это пример, иллюстрирующий, как это может быть реализовано в JavaFX.

class IceCreamSelectionView { // The FXML controller class used as MVVM View class
    @FXML ComboBox<String> iceCreams;
    @FXML ComboBox<String> flavors;

    private final IceCreamSelectionViewModel vm; // The corresponding ViewModel

    @FXML private void initialize() {
        Bindings.bindContent(iceCreams.getItems(), vm.getIceCreams());
        Bindings.bindContent(flavors.getItems(), vm.getFlavors());
        vm.selectedIceCreamProperty().bind(iceCreams.valueProperty());
        vm.selectedFlavorProperty().bind(flavors.valueProperty());
    }
}

class IceCreamSelectionViewModel {
    /*
     * The properties
     */

    public final ObservableList<String> getIceCreams() { return iceCreams; }
    public final ObservableList<String> getFlavors() { return flavors; }
    public final StringProperty selectedIceCreamProperty() { return selectedIceCream; }
    public final StringProperty selectedFlavorProperty() { return selectedFlavor; }

    private updateIceCreams() {
        iceCreams.setAll(iceCreamService.getIceCreams());
    }
}

// There is no Model class because both "iceCream" and "flavor" cannot be further broken down.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...