Почему MVVM и что, это - базовые преимущества?

Не уверенный, если это будет полезно Вам - это работает хорошо в тестовом приложении. Кроме того, не знайте, будет ли это в "благосклонности" высшего персонала Spring, но моя надежда состоит в том, чтобы учиться, таким образом, я отправляю это предложение.

В тестовом приложении Начальной загрузки Spring, следующее вводит репозиторий JPA в ApplicationRunner, который затем вводит то же в Runnables, управляемый ExecutorService. Каждый Выполнимый получает BlockingQueue, который постоянно переполнен отдельным KafkaConsumer (который действует как производитель очереди). Runnables используют queue.takes () для сования от очереди, и это сопровождается repo.save (). (Может с готовностью добавить пакетная вставка для поточной обработки, но не сделала поэтому, так как приложение еще не потребовало его...)

, тестовое приложение в настоящее время реализует JPA для Пост-ГРЭС (или Масштаб времени) DB и выполняет 10 потоков с 10 очередями, питаемыми 10 Потребителями.

репозиторий JPA, обеспечивают

public interface DataRepository extends JpaRepository<DataRecord, Long> {
}

Начальная загрузка Spring, которая Основная программа

@SpringBootApplication
@EntityScan(basePackages = "com.xyz.model")
public class DataApplication {

    private final String[] topics = { "x0", "x1", "x2", "x3", "x4", "x5","x6", "x7", "x8","x9" };
    ExecutorService executor = Executors.newFixedThreadPool(topics.length);


    public static void main(String[] args) {
        SpringApplication.run(DataApplication.class, args);
    }

    @Bean
    ApplicationRunner init(DataRepository dataRepository) {
        return args -> {

            for (String topic : topics) {

                BlockingQueue<DataRecord> queue = new ArrayBlockingQueue<>(1024);
                JKafkaConsumer consumer = new JKafkaConsumer(topic, queue);
                consumer.start();

                JMessageConsumer messageConsumer = new JMessageConsumer(dataRepository, queue);
                executor.submit(messageConsumer);
            }
            executor.shutdown();
        };
    }
}

, И у Выполнимого Потребителя есть конструктор и выполненный () метод следующим образом:

public JMessageConsumer(DataRepository dataRepository, BlockingQueue<DataRecord> queue) {
    this.queue = queue;
    this.dataRepository = dataRepository;
}

@Override
public void run() {
    running.set(true);
    while (running.get()) {
        // remove record from FIFO blocking queue
        DataRecord dataRecord;
        try {
            dataRecord = queue.take();
        } catch (InterruptedException e) {
            logger.error("queue exception: " + e.getMessage());
            continue;
        }
        // write to database 
        dataRepository.save(dataRecord);
    }
}

В изучение так любых мыслей/проблем/обратной связи ценится...

37
задан Anderson Imes 29 October 2009 в 16:26
поделиться

5 ответов

Я укажу вам на особенно полезное видео Джейсона Долинджера.

Исходя из мира WinForms, реализация любого шаблона стиля MVX казалась более сложной задачей, чем она стоило, но, проработав пару лет с WPF, я могу честно сказать, что я бы не стал рассматривать ничего меньшего. Вся парадигма поддерживается "из коробки".

Во-первых, ключевым преимуществом является обеспечение истинного разделения между представлением и моделью . На самом деле это означает, что если / когда ваша модель нуждается в изменении, это может происходить без необходимости представления, и наоборот.

Во-вторых, хотя ваша модель может содержать все данные, которые могут вам понадобиться в вашем представлении , вы можете абстрагироваться от этих данных таким образом, чтобы ваша модель не t поддержка. Например, предположим, что ваша модель содержит свойство даты. В модели он может существовать только как объект DateTime , но ваше представление может захотеть представить его совершенно по-другому. Без модели просмотра вам пришлось бы либо дублировать свойство в модели , чтобы поддерживать представление, либо изменять свойство, которое могло бы серьезно запутать «модель».

Вы также можете использовать модель представления для агрегирования частей вашей модели, которые существуют в отдельных классах / библиотеках, чтобы облегчить более удобный интерфейс для представления . очень маловероятно, что вы захотите работать с данными в своем коде так же, как пользователь захочет или захочет, чтобы эти данные были ему представлены.

Кроме того, вы получаете поддержку автоматической двусторонней привязки данных между представлением и моделью представления .

На самом деле есть много дополнительных вещей, о которых я мог бы поговорить, но Джейсон сказал, что это намного лучше, чем я мог бы, поэтому мой совет - посмотрите видео. После нескольких дней такой работы вы удивитесь, как вы вообще обходились без этого.

Удачи.

47
ответ дан 27 November 2019 в 04:35
поделиться

These are mine specific to MVVM

  1. Increases the "Blendability" of your views (ability to use Expression Blend to design views). This enables a separation of responsibilities on teams that are lucky enough to have a designer and a programmer... each can work independent of the other.
  2. "Lookless" view logic. Views are agnostic from the code that runs behind them, enabling the same view logic to be reused across multiple views or have a view easily retooled or replaced. Seperates concerns between "behavior" and "style".
  3. No duplicated code to update views. In code-behind you will see a lot of calls to "myLabel.Text = newValue" sprinkled everywhere. With MVVM you can be assured the view is updated appropriately just by setting the underlying property and all view side-effects thereof.
  4. Testability. Since your logic is completely agnostic of your view (no "myLabel.Text" references), unit testing is made easy. You can test the behavior of a ViewModel without involving its view. This also enabled test-driven development of view behavior, which is almost impossible using code-behind.

The other two patterns are really sort of separate in terms of the concerns they address. You can use MVVM with MVP and MVC (most good samples out there do some form of this).

In fact, MVP (w/ a Passive View, rather than a Supervising Controller) is really just a variant of MVVM, in my opinion.

17
ответ дан 27 November 2019 в 04:35
поделиться

Запеченные в поддержке ICommand и INotifyPropertyChanged - два самых больших преимущества. Использование MVVM упрощает подключение команд и вставку данных в пользовательский интерфейс WPF. Все просто работает.

3
ответ дан 27 November 2019 в 04:35
поделиться

WPF имеет лучшую привязку данных, чем любая другая структура пользовательского интерфейса, без которой MVVM был бы неуправляемым

MVVM обеспечивает возможность модульного тестирования и отличную независимость от представлений, что делает его полезным для использования

5
ответ дан 27 November 2019 в 04:35
поделиться

Способность XAML-кода к DATAND, а также существование триггеров сломает шаблоны MVP и MVC.

0
ответ дан 27 November 2019 в 04:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: