Mvc Для Android

Я считаю, что работа программиста — не писать код, а оптимизировать процессы.

Мы пишем код, чтобы его пользователь мог, например, быстро и эффективно добиться мирового господства.

И было бы немного странно оптимизировать работу других и не оптимизировать свою.

Сапожник без сапог иррационален.

Так.

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

Приложение не важно, важно то, что двусторонняя связь виджетов с данными — довольно рутинная работа, чреватая копипастой.

Особенно весело становится, если есть зависимости: если этот текст изменился, обновите его.

Уже на втором экране, вдохновившись проектом «Нож для масла», я понял, что здесь огромный простор для обобщений (и, как ни странно, ничего подобного не нашел).

Знакомьтесь, проект Бандеры* (пример кода копирую у себя)

  • Укажитеbandera-compile.jar в качестве обработчика аннотаций компиляции.

  • Опишем класс модели:
      
      
       

    public class MainActivityModel { private int catCount; public MainActivityModel(CatRecordFromDb cats) { // init your viewmodel here // .

    } @BindModel({ R.id.practice_image, R.id.buttonStart }) // RO binding to imageUri for ImgView and ImgButton public String getFancyImage() { return getModel().

    imageUrl; } @BindModel(R.id.editNumberOfCats) // getter for EditText value initialisation public int getCatsCount() { // method name can be anything, getters just need the "get" in front return catCount; // conversion from int to String happens magically at google offices* (even offline!) } @BindModel(R.id.editNumberOfCats) // setter to update the model from the control public void setCatNumber(int catCount) { // setter name doesn't need to match getter's, just be "set<Whatever>" this.catCount = catCount; // the value is already converted into target type recalculateTotal(); // do the magic after cat count changed } } // * Measurement of correctness of this description is pending indifinitely

  • В активности мы соединяем модель и представление:

    binder = doo.bandera.Models.Bind(this, new MainActivityModel(catsFromDb)); // doo.bandera.Models.Bind for your activity/model pair is generated during compilation

  • Ну а если что-то изменилось за пределами ссылки, сообщаем об этом:

    binder.updateDirtyValues(); // scans what changed in the model and updates widgets

  • Мы указываемbandera-runtime.jar как зависимость, которая будет включена в apk.
  • Все работает
То есть рутина пошла в библиотеку.

Логика размещается во ViewModel (знаю, это не совсем MVC, а скорее MV-C).

Все довольны.

Проект он написан прагматично, чтобы удовлетворить ваши потребности, поэтому на данный момент поддерживаются только TextView, EditText, DateTimePicker, ProgressBar, ImageView, ImageButton (изображение).

На мероприятиях я до сих пор использую тот же нож для масла.

Ну и особая красота в том, что соединительный код генерируется во время компиляции**, то есть традиционных Android-страхов перед адски медленным аннотациями-рантайм-отражением просто нет. * Слово похоже на Binding и Android. **Меня совершенно не устраивает то, как именно я генерирую этот код, но пока всё работает и сделаем это красиво позже Теги: #MVC #Android #шаблоны #шаблоны #шаблоны и практики #аннотации #Разработка для Android

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.