MVVM + привязка данных - PullRequest
0 голосов
/ 27 июня 2018

Предположим, у меня есть приложение погоды, в котором я получаю данные от поставщика данных и сохраняю их в своей локальной базе данных. Теперь у меня есть класс Repository, работа которого заключается в получении данных из API или локальной базы данных в зависимости от определенных условий. У меня есть страница настроек, пользователь решил показывать температуру в ° F и расстояние в км. Данные, которые я получил от API: ° C для температуры и mi для расстояния. Мой View запросил ViewModel для получения данных из Repository. Repository извлек данные и вернул модель с именем WeatherData. Теперь у меня есть данные в ° C и ми. Является ли хорошей идеей, что при использовании DataBinding я импортирую класс Util в свой файл макета, содержащий вспомогательные методы для преобразования этих единиц в соответствии с выбором пользователя в настройках? Или в WeatherData должны быть методы, которые преобразуют данные и отображаются в представлении с использованием привязки данных? Или есть другой, который делает это правильно?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Это интересный вопрос, и у него могут быть разные возможные ответы, но я выскажу свое мнение по этому вопросу.

Один из способов взглянуть на ViewModels - представить его как «модель» представления. Таким образом, вы можете быть уверены, что ваш взгляд будет очень скудным и дурацким, что идеально, поскольку их может быть сложно, если не невозможно, проверить. А поскольку виртуальные машины также являются слоем между представлением и моделью, это идеальное место для преобразования данных и типов. Преимущества включают тестируемость (как я уже сказал, трудно проверить логику преобразования в XML) и лучшую ремонтопригодность (если по какой-то причине вам придется изменить свое представление в будущем).

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

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

0 голосов
/ 27 июня 2018

То, что вы хотите сделать, зависит от ваших настроек, вы должны показать ° C / ° F и ми / км.

Вы можете иметь логику преобразования внутри класса вашей модели WeatherData

Как,

class WeatherData{

    private float degrees;

    public float getCelsius(){
        //conversion
    }

    public float getFahrenheit(){
        //conversion
    }

    private float km;

    public float getKm(){
        //conversion
    }

    public float getMiles(){
        //conversion
    }

} 

А в вашей viewmodel вы можете иметь флаги типа boolean celsius,km;

В макете вы можете определить эти три переменные.

    <data>
        <variable
            name="celsius"
            type="Boolean"/>
        <variable
            name="km"
            type="Boolean"/>
        <variable
            name="data"
            type="WeatherData"/>
    </data>
    <TextView
        android:id="@+id/tv_distance"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@{km?data.km:data.miles}" />
    <TextView
        android:id="@+id/tv_temperature"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@{celsius?data.celsius:data.fahrenheit}"
        />
...