MVP против MVVM: как управлять диалоговыми окнами предупреждений в MVVM и улучшить тестируемость - PullRequest
3 голосов
/ 04 июля 2019

Я - любитель MVP, но в то же время я открытый и пытаюсь улучшить свои знания о MVVM и привязке данных:

Я разветвлен здесь https://github.com/jpgpuyo/MVPvsMVVM

оригинальное репо https://github.com/florina-muntenescu/MVPvsMVVM от @ FMuntenescu

Я создал несколько веток.В одном из них я хочу показать 2 разных диалоговых окна оповещений с разными стилями в зависимости от количества нажатий кнопки:

  • четное количество нажатий -> показать стандартное диалоговое окно
  • нечетное количество кликов -> показать диалог droidcon

Вы можете найти ветку здесь: https://github.com/jpgpuyo/MVPvsMVVM/tree/multiple_dialogs_databinding_different_style

Я создал 2 наблюдаемых поля в модели представления и добавил одну привязкуадаптер.

Активность:

private void setupViews() {
    buttonGreeting = findViewById(R.id.buttonGreeting);
    buttonGreeting.setOnClickListener(v -> mViewModel.onGreetingClicked());
}

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    app:greetingType="@{viewModel.greetingType}"
    app:greetingMessage="@{viewModel.greetingMessage}">

ViewModel:

public ObservableField<String> greetingMessage = new ObservableField<>();
public ObservableField<GreetingType> greetingType = new ObservableField<>();

public void onGreetingClicked() {
    numberOfClicks++;
    if (numberOfClicks % 2 == 0) {
        mSubscription.add(mDataModel.getStandardGreeting()
                .subscribeOn(Schedulers.computation())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(greeting -> {
                    greetingMessage.set(greeting);
                    greetingType.set(GreetingType.STANDARD);
                }));
    } else {
        mSubscription.add(mDataModel.getDroidconGreeting()
                .subscribeOn(Schedulers.computation())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(greeting -> {
                    greetingMessage.set(greeting);
                    greetingType.set(GreetingType.DROIDCON);
                }));
    }
}

MVVMBindingAdapter:

@BindingAdapter({"greetingType", "greetingMessage"})
public static void showAlertDialog(View view, GreetingType greetingType, 
String greetingMessage) {
    if (GreetingType.STANDARD.equals(greetingType)){
        new DialogHelper().showStandardGreetingDialog(view.getContext(), 
        greetingMessage, greetingMessage);
    } else if(GreetingType.DROIDCON.equals(greetingType)) {
        new DialogHelper().showDroidconGreetingDialog(view.getContext(), 
        greetingMessage, greetingMessage);
    }
}

С MVVM не уверен вкак реализовать это, чтобы быть полностью тестируемым с модульными тестами Java.Я создал адаптер привязки, но затем:

  • Мне нужен адаптер if / else в адаптере привязки для отображения того или иного диалога.

  • Я не знаю, как внедрить помощника диалога в адаптер привязки, поэтому я не могу проверить с помощью модульных тестов, кроме как с помощью powermock.

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

Это нормально, введитедиалог помощника в MVVM, чтобы решить эту проблему и сделать код тестируемым?

Как лучше всего управлять диалоговыми окнами оповещений с помощью MVVM?

...