Я считаю, что работа программиста — не писать код, а оптимизировать процессы.
Мы пишем код, чтобы его пользователь мог, например, быстро и эффективно добиться мирового господства.
И было бы немного странно оптимизировать работу других и не оптимизировать свою.
Сапожник без сапог иррационален.
Так.
Недавно я начал писать вторую версию своего приложения для таких религиозных фанатиков, как я.
Приложение не важно, важно то, что двусторонняя связь виджетов с данными — довольно рутинная работа, чреватая копипастой.
Особенно весело становится, если есть зависимости: если этот текст изменился, обновите его.
Уже на втором экране, вдохновившись проектом «Нож для масла», я понял, что здесь огромный простор для обобщений (и, как ни странно, ничего подобного не нашел).
Знакомьтесь, проект Бандеры* (пример кода копирую у себя)
- Укажите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
-
Бесполезно Плакать Из-За Пролитых Чернил
19 Oct, 24 -
Gettidy - Услуга Уборки Квартир
19 Oct, 24 -
Бенвенист, Эмиль
19 Oct, 24 -
Отвертка Для Выражений
19 Oct, 24