Я работаю над приложением JavaFX и пытаюсь следовать шаблону модель-представление-контроллер. Я реализовал Модель с обычными java-объектами (Double, Integer, String ...), думая, что повторно использую модель ...

2
Jin Kim 8 Янв 2021 в 09:52

1 ответ

Лучший ответ

Я помогал спроектировать и (пере) спроектировать большое приложение с графическим интерфейсом Java для моей компании, когда мы перешли с Swing на JavaFX. Одно из основополагающих решений, которое мы приняли заранее, заключалось в том, чтобы использовать свойства JavaFX оптом. Мы использовали их во всем коде модели, даже в бэкэнд-коде, который не имел никакого отношения к графическому интерфейсу.

Очень важно: это шло рука об руку с проектированием нашей модели как однопоточной. В частности, все обновления модели должны были выполняться в потоке JavaFX. Эта идея вызвала значительное сопротивление, поскольку наше предыдущее приложение было сильно многопоточным, и люди не хотели отказываться от этого. Короче говоря, мы переключили все наши операции ввода-вывода и вычисления на неблокирующие. Работы было много, но в конце концов все получилось. Оказывается, один поток может выполнять много работы, если вы никогда не блокируете его. Это решение почти единолично устранило все наши условия гонки и другие ошибки многопоточности, что является огромной победой в моей книге.

Использование свойств JavaFX было отличным решением, и я настоятельно рекомендую его. Что касается стиля кода, мы увидели много плюсов: легко отслеживать изменения свойств, легко добавлять реактивный код, который динамически обновляет другие свойства, легко регистрировать привязки в функциональном стиле, которые могут позволить нам использовать идиомы вроде map и reduce в нашем коде.

Единственным недостатком настоящего стиля было добавление большого количества шаблонов. Обычно для объявления нового свойства требуется 4-6 строк кода. Вам понадобится переменная свойства, метод получения, метод установки и метод получения для базового объекта свойства. Чтобы сэкономить на вертикальном пространстве, я настаивал на том, чтобы эти элементы были сжаты до одной строки каждый и чтобы они хранились вместе, а не распространялись по всему исходному файлу. Например:

/** User's first and last name. */
private final StringProperty nameProperty = new StringProperty("name");
public ReadOnlyStringProperty nameProperty() { return nameProperty; }
public String getName() { return nameProperty.get(); }
private void setName(String name) { nameProperty.set(name); }
4
John Kugelman 8 Янв 2021 в 09:21