В процессе изучения различных вариантов организации кода для пользовательского интерфейса (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();
}
Этот шаблон проектирования называется VELOSIPED.
По-порядку:
В шаблонах MVP, MVVM, MVPVM предполагается, что M (Model, Модель) — это модель данных для всего приложения. В приведенном коде эта модель не показана.
VM (ViewModel, Модель представления) в шаблоне MVVM — это довольно умная модель, содержащая как данные, так и логику.
На такую Модель представления и похож класс ModelAndMethods_*
из приведенного кода.
И это определенно не VM из шаблона MVPVM (Bill Kratochvil, 2011), где ViewModel - тупая, а всю работу выполняет Представитель (Presenter).
V (View, Представление) в шаблоне MVVM достаточно умное, чтобы самостоятельно подписываться на события Модели представления. Для этого в WPF'овском XAML полностью реализованы все типы привязок.
В FXML двустороннее связывание (через #{}
) до сих пор не реализовано.
Поэтому V из MVVM представляют три файла: .fxml-файл и два класса - View_*
и Binder_*
.
С другой стороны, если рассматривать шаблон MVP с пассивным Представлением (Passive View), то V — это только два файла: .fxml-файл и класс View_*
.
Под P (Presenter, Представитель) в шаблоне MVP подразумевается код, который занимается связыванием Представления (V) и Модели (M).
Именно этим занимается класс Binder_*
.
Таким образом, можно считать, что представленный код, когда к нему добавится Модель приложения (M), станет вариантом MVVM, в котором V разделено на P и passive-V.
Шаблон 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...
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня такой вопрос: Как можно узнать качество интернета на телефоне?
Суть задачи: Есть массив субтитров (long start, long end, string text)Мне нужно в зависимости от времени показа изменять ширину (int) для соответствующего...
После установки Windows 10 установил Android Studio, установил нужные пакеты, но при создании нового проекта вылетает ошибка: