Как правильно назвать классы в терминах MVC/MVP/MVVM/MVPVM?

287
11 июля 2018, 21:50

В процессе изучения различных вариантов организации кода для пользовательского интерфейса (MVC, MVP, MVVM, MVPVM и того, что этими названиями называют) я немного запутался.

Поэтому, как обычно, накодил нечто, c использованием промежуточных интерфейсов.

И теперь прошу подсказать, соответствует ли этот вариант какой-либо давно известной аббревиатуре, и где среди этих трех классов и двух интерфейсов располагаются M, V, C, Р, VM или их части и помеси?

Вот так, примерно, у меня выглядит код для упрощенной формы поиска:

1) Интерфейс, в котором указано, какие элементы управления и какого базового типа (базовые кнопочки, текстовые поля и т.д.) должны быть представлены в этой части интерфейса:

public interface IView_SearchForm {
    TextField getQueryField();
    Button getSubmitButton();
    TextField getResultsField();
}

2) Имплементация этой части интерфейса (с дизайнерскими кнопочками, текстовыми полями и т.д., которые наследуют базовым, указанными в интерфейсе):

public class View_SearchForm_v11 implements IView_SearchForm {
    @FXML 
    private YetAnotherTextField txtField1;
    @Override
    public TextField getQueryField() { return txtField1; }
    @FXML 
    private SuperPuperButton button1;
    @Override
    public Button getSubmitButton() {return button1;}
    @FXML 
    private YetAnotherTextField txtField2;
    @Override
    public TextField getResultsField() { return txtField2; }
}

и соответствующий .fxml:

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<VBox fx:controller="View_SearchForm_v11">
    <YetAnotherTextField fx:id="txtField1"/>
    <SuperPuperButton fx:id="button1" text="Submit"/>
    <YetAnotherTextField fx:id="txtField2"/>
</VBox>

3) Интерфейс, в котором указано, какие данные и методы должны быть реализованы в модели, относящейся к данной части интерфейса:

public interface IModelAndMethods_SearchForm {
    StringProperty getQueryProperty();
    StringProperty getResultsProperty();
    void startSearch();
}

4) Имплементация модели данных и методов:

public class ModelAndMethods_SearchForm_v45 implements IModelAndMethods_SearchForm {
    final private StringProperty queryProperty = new SimpleStringProperty();
    @Override
    public StringProperty getQueryProperty() {return queryProperty;}
    final private StringProperty resultsProperty = new SimpleStringProperty();
    @Override
    public StringProperty getResultsProperty() {return resultsProperty;}
    void startSearch() {
        resultsProperty.set(querySomeOne(queryProperty.get()));
    }
}

5) Связывание интерфейса с данными и методами (вся вспомогательная работа влезла в базовый класс BinderBase<IView,IModelAndMethods>):

public class Binder_SearchForm extends BinderBase<IView_SearchForm, IModelAndMethods_SearchForm> {
    @Override
    protected void bind() {
        IView_SearchForm v = getView();
        IModelAndMethods_SearchForm mm = getModelAndMethods();
        addBidirectionalBinding(v.getQueryField().textProperty(), mm.getQueryProperty());
        addBidirectionalBinding(v.getResultsField().textProperty(), mm.getResultsProperty());
        addAction(v.getSubmitButton(), event -> mm.startSearch());
    }
}

Обычная загрузка всего этого выглядит примерно так:

@Override
public void start(Stage primaryStage) throws Exception {
        ModelAndMethods_SearchForm_v45 modelAndMethods = new ModelAndMethods_SearchForm_v45();
        Scene scene = Loader.loadAsScene(
                View_SearchForm_v11.class,
                modelAndMethods,
                Binder_SearchForm.class);
        primaryStage.setScene(scene);
        primaryStage.show();
}
Answer 1

Этот шаблон проектирования называется VELOSIPED.

По-порядку:

  • В этом коде нет M.

В шаблонах MVP, MVVM, MVPVM предполагается, что M (Model, Модель) — это модель данных для всего приложения. В приведенном коде эта модель не показана.

  • Здесь есть VM из MVVM.

VM (ViewModel, Модель представления) в шаблоне MVVM — это довольно умная модель, содержащая как данные, так и логику. На такую Модель представления и похож класс ModelAndMethods_* из приведенного кода.

И это определенно не VM из шаблона MVPVM (Bill Kratochvil, 2011), где ViewModel - тупая, а всю работу выполняет Представитель (Presenter).

  • Где здесь V?

V (View, Представление) в шаблоне MVVM достаточно умное, чтобы самостоятельно подписываться на события Модели представления. Для этого в WPF'овском XAML полностью реализованы все типы привязок.

В FXML двустороннее связывание (через #{}) до сих пор не реализовано. Поэтому V из MVVM представляют три файла: .fxml-файл и два класса - View_* и Binder_*.

С другой стороны, если рассматривать шаблон MVP с пассивным Представлением (Passive View), то V — это только два файла: .fxml-файл и класс View_*.

  • Здесь есть P.

Под P (Presenter, Представитель) в шаблоне MVP подразумевается код, который занимается связыванием Представления (V) и Модели (M). Именно этим занимается класс Binder_*.

Таким образом, можно считать, что представленный код, когда к нему добавится Модель приложения (M), станет вариантом MVVM, в котором V разделено на P и passive-V.

  • Шаблон MVC.

Шаблон MVC имеет разные интерпретации.

В классическом варианте (еще упоминается, как SmallTalk MVC) Представление (V) само лазает в Модель, без присмотра С (Контроллера). Именно это отличает его от MVP, где Представление (V) связывается с Моделью только Представителем (Presenter).

Однако, название "MVC" в таком узком смысле используется разве что при описании таких шаблонов, как MVP.

Обычно же MVC трактуется намного шире - как разбиение некоторого монолита на части (к примеру, тот же Spring MVC совсем не такой, как SmallTalk MVC).

В этом широком смысле, приведенный код, является вариантом MVC. Где класс IModelAndMethods_* — это M, класс View_* - это V, а класс Binder_* - это С.

PS: Позднее добавится Контроллер горячих папок (C), который будет работать с Моделью приложения (M), но не с Р или V. Получится связка C-M-VM-P-V...

READ ALSO
Как узнать качество интернета на android?

Как узнать качество интернета на android?

У меня такой вопрос: Как можно узнать качество интернета на телефоне?

199
Потеря пикселей при конвертации

Потеря пикселей при конвертации

Суть задачи: Есть массив субтитров (long start, long end, string text)Мне нужно в зависимости от времени показа изменять ширину (int) для соответствующего...

212
Вернуться в начало цикла [дубликат]

Вернуться в начало цикла [дубликат]

На данный вопрос уже ответили:

220
Android studio 3.1.3 проблема с Gradle

Android studio 3.1.3 проблема с Gradle

После установки Windows 10 установил Android Studio, установил нужные пакеты, но при создании нового проекта вылетает ошибка:

278