SlideShare una empresa de Scribd logo
1 de 36
Приложения для
Windows Phone
Как мы это делаем

Григорий Никонов,
Actis® Wunderman.
Обо мне
На данный момент руковожу разработкой мобильных
приложений агентства Actis Wunderman, в котором тружусь с
момента появления на свет агентства Actis, позже
присоединившегося к сети Wunderman.


Ранее занимался разработкой, созданием и внедрением
интернет-проектов.
Наши работы
Мы занимаемся разработкой приложений для ведущих
платформ около трех лет. Вот, что мы сделали для Windows
Phone:
•КиноПоиск
•Concert.ru
•ЛитРес
Несколько неназываемых проектов скоро должны быть
опубликованы, тогда мы их назовём.
Наши работы: КиноПоиск
Наши работы: Concert.ru
Наши работы: ЛитРес
Мы – ленивые
И поэтому создали несколько инструментов, которые
позволяют нам экономить время и усилия:
•Фреймворк работы с сущностями и коллекциями
•Фреймворк моделей представлений
•Фреймворк представлений для Windows Phone и других
платформ
•T4-генераторы кода
Кроме того, сервер непрерывной интеграции и тесты
позволяют нам не заботиться о проблемах внесения
изменений в код и координировать совместную работу
Данные
Сценарии использования источников данных в мобильных
приложениях, в порядке уменьшения частоты использования:
•Получить коллекцию заголовков данных
•Получить конкретную сущность
•Выполнить единичное действие с источником данных
•Отправить изменённую сущность


«Мобильность» платформы накладывает некоторые
ограничения на возможность и целесообразность передачи
больших объёмов данных
Данные
Данные можно разделить на две категории – сущности и
коллекции сущностей
И сущности и коллекции сущностей бывают
идентифицируемые и неидентифицируемые
Сущности
События изменения свойств:
   ObservableObject


Обновление и клонирование:
   XObject, XObject<T>


Ключи для идентификации объектов:
   XKey
Коллекции
Интеллектуальное обновление:
   XCollection<T>


Применение фильтров:
   XFilteredCollection<T>


Объединение и разделение:
   XCombinedCollection<T>, XSubRangeCollection<T>
Кэширование
Запросы как идентификация коллекций:
   XQuery<T>


Применение фильтров:
   XFilteredCollection<T>


Собственно кэш:
   XCache<T>
Пример: Свойства
class Person : XObject
{
    string _name;
    XCollection<Person> _children;
    public string Name
    {
        get { return _name; }
        set { SetProperty( ref _name, value, “Name” ); }
    }

    public XCollection<Person> Children
    {
        get { return _children; }
        set { SetProperty( ref _name, value, “Children” ); }
    }
}
Пример: ProcessCopy
class Person : XObject
{
    protected override void ProcessCopy(
        XObject source, bool cloning, bool deepCloning )
    {
        base.ProcessCopy( source, cloning, deepCloning );

        Person other = (Person) source;

        _name = other._name;

        ProcessCopyProperty(
            ref _children, other._children,
            cloning, deepCloning );
    }
}
Пример: Клонирование
Person person = new Person
{
    Name = “John”,
    Children = new XCollection<Person>
        {
           new Person { Name = “Bob” }
        }
};

Person softClone = (Person) person.Clone( false );
Person deepClone = (Person) person.Clone( true );

person.Children[0].Name = “Mary”;

softClone.Children[0].Name // “Mary”
deepClone.Children[0].Name // “Bob”
Пример: Обновление
Person person1 = new Person { Name = “John” }
Person person2 = new Person { Name = “Mary” }
person1.Update( person2 );

person1.Name // “Mary”

XCollection<Person> l1 = new XCollection<Person>() { … };
XCollection<Person> l2 = new XCollection<Person>() { … };

var result = l1.Update( l2 );
Пример: Коллекции
XCollection<Person> l1 = new XCollection<Person>() { … };
XCollection<Person> l2 = new XCollection<Person>() { … };

var softClone = l1.Clone( false );
var deepClone = l1.Clone( true );

var result = l1.Update( l2 );
Пример: Хитрые коллекции
XCollection<Person> studentsOfClassA = …;
XCollection<Person> studentsOfClassB = …;

var firstThreeStudentsOfClassA =
    new XSubRangeCollection( studentsOfClassA, 0, 3 );

var firstTwoStudentsOfClassB =
    new XSubRangeCollection( studentsOfClassB, 0, 2 );
var topStudents =
    new XCombinedCollection(
        firstThreeStudentsOfClassA,
        firstTwoStudentsOfClassB );
Генератор сущностей




Поддержка XML/JSON сериализации
Демонстрация
Сгенерированные классы, содержащие ключевые элементы,
необходимые для эффективной работы с данными:
•Правильное обновление данных
•Правильное клонирование данных
•Выборка с помощью ключей в коллекциях и кэше
Модели представлений
Предназначены для получения и преобразования данных,
необходимых представлениям, а также для выполнения
других действий над этими данными.
Наиболее частые операции в мобильных приложениях –
загрузка данных (списки или отдельные сущности) для
представления их пользователю.
Работа с источниками данных должна быть асинхронной –
нельзя блокировать поток пользовательского интерфейса.
Необходимо учитывать возможность досрочного прекращения
выполняемых операций – по разным причинам.
Сессии
Всё «управляемое» общение модели (модели представления)
с внешним миром происходит в рамках сессии
Сессия содержит параметры, необходимые для доступа к
данным
Сессия содержит жетон, используемый для прекращения
асинхронных задач (CancellationToken)
Обработкой сессии занимается модель
Работа с сессией
Создание
var session = CreateSession()
    .AddParameter( “userName”, “John” )
    .AddParameter( “age”, 48 );
Доступ к параметрам
var userName = session.Parameters.Get<string>( “userName” );
var age = session.Parameters.Get<int>( “age” );
var sex = session.Parameters.Get<string>( “sex”, “male” );
Обработка
await viewModel.Load( session );
Откуда она знает, что делать?
Виртуальные методы
   ShouldLoadSession
   LoadSession
Части
   RegisterPart
      string part,
      Func<Session, Task> processor,
      Func<Session, bool> checker,
      bool loadIfNoPartsSpecified
Типичная модель
Конструктор
   Получает сервисы через DI
   Регистрирует части
   Создает команды
Методы обработки частей
   Проверяют необходимость обработки сессии
   Осуществляют доступ/обновление данных
Модель сущности
Использует расширенную сессию, которая включает в себя
ключ, идентифицирующий объект: EntitySession
Регистрирует методы для части, связанной с обработкой
сущности: ShouldLoadEntity и LoadEntity.
Объявляет свойство Entity
Типичная модель сущности
Конструктор
   Получает сервисы
   Создает команды
Метод LoadEntity
   Загружает данные из внешнего источника или из кэша
   Присваивает значение свойству Entity
INavigationService
Один из самых важных сервисов, доступных моделям
Определяет независимый от платформы способ навигации
между видами
ns.Navigate( “PersonView”, Parameters.Create( “Id”, 1 ) );
Позволяет создавать и использовать команды навигации:
ViewDetails = new NavigationCommand(
    ns,
    “DetailedView” );

PersonSelected = new NavigationCommand<Person>(
    ns,
    “PersonView”,
    person => person.KeyParameter() );
Другие сервисы
IDataExchangeService
   Информирование об обмене данными
IViewModelExceptionHandlingService
IExceptionHandlingService
   Унифицированная обработка исключений
Представления
PhoneApplication – наследник Application
   Регистрация сервисов
   Обработка ошибок уровня приложения
Page
Управление жизненным циклом
   OnPageCreated, OnPageDestroyed,
   OnPageAsleep, OnPageAwaken, OnPageResurrected
Доступ к параметрам
   ViewParameters
Контекст для связывания данных
   CreateDataContext
Атрибутирование для навигации
   [View( “UserView” )]
   [ViewParameter( “userName”, typeof( string ) )]
ViewModelPage<TViewModel>
Страница с созданной моделью
Начальная загрузка данных
   CreateDataSession, CreateDataSessionAsync
   OnDataLoadComplete, OnDataLoadFailed
Обработка нештатных ситуаций (FAS)
Управление областью жизни модели
Связывание данных в XAML
   <TextBlock Text=“{Binding ViewModel.Title}”/>
EntityPage
Автоматически выбирает ключ из параметров и создает
сессию для загрузки сущности.
Но это еще не всё!
Генератор классов-заглушек и частичных классов-
представлений:
<View Name=“MainView”/>
<View Name=“FeedChannelView” Entity=“FeedChannel”/>
Во многих случаях файл View.xaml.cs не нужен, всё делается
автомагически
Генератор константных имен представлений и параметров, а
также методов для создания параметров навигации
Но и это еще не всё!
Декораторы страниц используются для выполнения
однообразных действий со страницами, например для показа
сообщений об ошибках, исчезновении сетевого подключения и
т.п.
Встроенный механизм обработки страниц, для которых нужна
аутентификация – параметр RequiresAuthentication
атрибута [View()]
Вопросы?


Григорий Никонов,
Actis® Wunderman
gregoryn@actis.ru
(495) 234-0009
http://www.actis.ru/

Más contenido relacionado

La actualidad más candente

Игорь Любин -- Об опыте тестирования программного компонента без пользователь...
Игорь Любин -- Об опыте тестирования программного компонента без пользователь...Игорь Любин -- Об опыте тестирования программного компонента без пользователь...
Игорь Любин -- Об опыте тестирования программного компонента без пользователь...sqadays8
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Frontend весна 2014 лекция 2
Frontend весна 2014 лекция 2Frontend весна 2014 лекция 2
Frontend весна 2014 лекция 2Technopark
 
Yii development
Yii developmentYii development
Yii developmentMageCloud
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Yandex
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.Igor Shkulipa
 
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...Ontico
 
Drupal 7 и history.js или как ajax инфицировать сайт
Drupal 7 и history.js или как ajax инфицировать сайтDrupal 7 и history.js или как ajax инфицировать сайт
Drupal 7 и history.js или как ajax инфицировать сайтDrupalCamp Kyiv Рысь
 
Web internship java script
Web internship   java scriptWeb internship   java script
Web internship java scriptNoveo
 
Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Paul Klimov
 
Next Gen Applications
Next Gen ApplicationsNext Gen Applications
Next Gen ApplicationsVittorio Cioe
 
JavaScript-библиотека
JavaScript-библиотекаJavaScript-библиотека
JavaScript-библиотекаVasya Petrov
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4Technopark
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4Technopark
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Python Meetup
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node jsAlex Tumanoff
 

La actualidad más candente (20)

Игорь Любин -- Об опыте тестирования программного компонента без пользователь...
Игорь Любин -- Об опыте тестирования программного компонента без пользователь...Игорь Любин -- Об опыте тестирования программного компонента без пользователь...
Игорь Любин -- Об опыте тестирования программного компонента без пользователь...
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Frontend весна 2014 лекция 2
Frontend весна 2014 лекция 2Frontend весна 2014 лекция 2
Frontend весна 2014 лекция 2
 
Yii development
Yii developmentYii development
Yii development
 
Tdd and decomposition
Tdd and decompositionTdd and decomposition
Tdd and decomposition
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.
 
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...
 
Drupal 7 and History.js
Drupal 7 and History.jsDrupal 7 and History.js
Drupal 7 and History.js
 
Drupal 7 и history.js или как ajax инфицировать сайт
Drupal 7 и history.js или как ajax инфицировать сайтDrupal 7 и history.js или как ajax инфицировать сайт
Drupal 7 и history.js или как ajax инфицировать сайт
 
Web internship java script
Web internship   java scriptWeb internship   java script
Web internship java script
 
Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2
 
Next Gen Applications
Next Gen ApplicationsNext Gen Applications
Next Gen Applications
 
JavaScript-библиотека
JavaScript-библиотекаJavaScript-библиотека
JavaScript-библиотека
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
 
BlueEyes russian
BlueEyes russianBlueEyes russian
BlueEyes russian
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
 
Files and JS
Files and JSFiles and JS
Files and JS
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
 

Destacado

CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...
CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...
CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...CodeFest
 
Backend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузераBackend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузераCodeFest
 
CodeFest 2013. Дорофеев М. — Клеим модель правильно
CodeFest 2013. Дорофеев М. — Клеим модель правильноCodeFest 2013. Дорофеев М. — Клеим модель правильно
CodeFest 2013. Дорофеев М. — Клеим модель правильноCodeFest
 
Management:Трансформации hi-tech-рынка труда сегодня
Management:Трансформации hi-tech-рынка труда сегодняManagement:Трансформации hi-tech-рынка труда сегодня
Management:Трансформации hi-tech-рынка труда сегодняCodeFest
 
Keynote: Challenges, Pains and Points of Software Development Today
Keynote: Challenges, Pains and Points of Software Development TodayKeynote: Challenges, Pains and Points of Software Development Today
Keynote: Challenges, Pains and Points of Software Development TodayCodeFest
 
CodeFest 2012. Сас А. — Как слать 100М писем каждый день
CodeFest 2012. Сас А. — Как слать 100М писем каждый деньCodeFest 2012. Сас А. — Как слать 100М писем каждый день
CodeFest 2012. Сас А. — Как слать 100М писем каждый деньCodeFest
 
Построение облачных процессов с помощью Mistral
Построение облачных процессов с помощью MistralПостроение облачных процессов с помощью Mistral
Построение облачных процессов с помощью MistralCodeFest
 
CodeFest 2013. Бурмако Е. — Макросы в Скале
CodeFest 2013. Бурмако Е. — Макросы в СкалеCodeFest 2013. Бурмако Е. — Макросы в Скале
CodeFest 2013. Бурмако Е. — Макросы в СкалеCodeFest
 
CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог...
CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог...CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог...
CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог...CodeFest
 
CodeFest 2013. Mosesohn M. — Automating environments with Cobbler
CodeFest 2013. Mosesohn M. — Automating environments with CobblerCodeFest 2013. Mosesohn M. — Automating environments with Cobbler
CodeFest 2013. Mosesohn M. — Automating environments with CobblerCodeFest
 

Destacado (10)

CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...
CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...
CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...
 
Backend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузераBackend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузера
 
CodeFest 2013. Дорофеев М. — Клеим модель правильно
CodeFest 2013. Дорофеев М. — Клеим модель правильноCodeFest 2013. Дорофеев М. — Клеим модель правильно
CodeFest 2013. Дорофеев М. — Клеим модель правильно
 
Management:Трансформации hi-tech-рынка труда сегодня
Management:Трансформации hi-tech-рынка труда сегодняManagement:Трансформации hi-tech-рынка труда сегодня
Management:Трансформации hi-tech-рынка труда сегодня
 
Keynote: Challenges, Pains and Points of Software Development Today
Keynote: Challenges, Pains and Points of Software Development TodayKeynote: Challenges, Pains and Points of Software Development Today
Keynote: Challenges, Pains and Points of Software Development Today
 
CodeFest 2012. Сас А. — Как слать 100М писем каждый день
CodeFest 2012. Сас А. — Как слать 100М писем каждый деньCodeFest 2012. Сас А. — Как слать 100М писем каждый день
CodeFest 2012. Сас А. — Как слать 100М писем каждый день
 
Построение облачных процессов с помощью Mistral
Построение облачных процессов с помощью MistralПостроение облачных процессов с помощью Mistral
Построение облачных процессов с помощью Mistral
 
CodeFest 2013. Бурмако Е. — Макросы в Скале
CodeFest 2013. Бурмако Е. — Макросы в СкалеCodeFest 2013. Бурмако Е. — Макросы в Скале
CodeFest 2013. Бурмако Е. — Макросы в Скале
 
CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог...
CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог...CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог...
CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог...
 
CodeFest 2013. Mosesohn M. — Automating environments with Cobbler
CodeFest 2013. Mosesohn M. — Automating environments with CobblerCodeFest 2013. Mosesohn M. — Automating environments with Cobbler
CodeFest 2013. Mosesohn M. — Automating environments with Cobbler
 

Similar a CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone – используемые инструменты и компоненты

Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneАвтоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneCodeFest
 
SECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON'2016. Иовлев Роман, JDI is UI Automation FutureSECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON'2016. Иовлев Роман, JDI is UI Automation FutureSECON
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationAndrii Dzynia
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA Mobile
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)Noveo
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловGeeksLab Odessa
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Sigma Software
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.Igor Shkulipa
 
automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS developmentIvan Trifonov
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоStanfy
 
FPUG Dzyga presentation
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentationIvan Filimonov
 
Appium для народа
Appium для народаAppium для народа
Appium для народаSQALab
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CYandex
 
"Windows Azure для мобильных платформ". Владимир Юнев, Microsoft
"Windows Azure для мобильных платформ". Владимир Юнев, Microsoft"Windows Azure для мобильных платформ". Владимир Юнев, Microsoft
"Windows Azure для мобильных платформ". Владимир Юнев, MicrosoftYandex
 
Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"Fwdays
 
"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндексit-people
 
Приемочные тесты на огурце
Приемочные тесты на огурцеПриемочные тесты на огурце
Приемочные тесты на огурцеAlexander Byndyu
 
Ruby on Rails. Работа с моделями — продолжение
Ruby on Rails. Работа с моделями — продолжениеRuby on Rails. Работа с моделями — продолжение
Ruby on Rails. Работа с моделями — продолжениеDigital-агентство Мэйк
 

Similar a CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone – используемые инструменты и компоненты (20)

Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneАвтоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows Phone
 
SECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON'2016. Иовлев Роман, JDI is UI Automation FutureSECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON'2016. Иовлев Роман, JDI is UI Automation Future
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
 
automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS development
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
FPUG Dzyga presentation
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentation
 
Appium для народа
Appium для народаAppium для народа
Appium для народа
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
 
"Windows Azure для мобильных платформ". Владимир Юнев, Microsoft
"Windows Azure для мобильных платформ". Владимир Юнев, Microsoft"Windows Azure для мобильных платформ". Владимир Юнев, Microsoft
"Windows Azure для мобильных платформ". Владимир Юнев, Microsoft
 
Js fuckworks
Js fuckworksJs fuckworks
Js fuckworks
 
Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"Svyatoslav Login "360 View of XSS"
Svyatoslav Login "360 View of XSS"
 
"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс
 
Приемочные тесты на огурце
Приемочные тесты на огурцеПриемочные тесты на огурце
Приемочные тесты на огурце
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
 
Ruby on Rails. Работа с моделями — продолжение
Ruby on Rails. Работа с моделями — продолжениеRuby on Rails. Работа с моделями — продолжение
Ruby on Rails. Работа с моделями — продолжение
 

Más de CodeFest

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита ПрокоповCodeFest
 
Денис Баталов
Денис БаталовДенис Баталов
Денис БаталовCodeFest
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена ГальцинаCodeFest
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр КалашниковCodeFest
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина ИвановаCodeFest
 
Marko Berković
Marko BerkovićMarko Berković
Marko BerkovićCodeFest
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис КортуновCodeFest
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр ЗиминCodeFest
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей КрапивенскийCodeFest
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей ИгнатовCodeFest
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай КрапивныйCodeFest
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим СмирновCodeFest
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин ОсиповCodeFest
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele RialdiCodeFest
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим ПугачевCodeFest
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene GroeschkeCodeFest
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван БондаренкоCodeFest
 
Mete Atamel
Mete AtamelMete Atamel
Mete AtamelCodeFest
 

Más de CodeFest (20)

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита Прокопов
 
Денис Баталов
Денис БаталовДенис Баталов
Денис Баталов
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена Гальцина
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр Калашников
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина Иванова
 
Marko Berković
Marko BerkovićMarko Berković
Marko Berković
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис Кортунов
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр Зимин
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей Крапивенский
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей Игнатов
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай Крапивный
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим Смирнов
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele Rialdi
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим Пугачев
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene Groeschke
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван Бондаренко
 
Mete Atamel
Mete AtamelMete Atamel
Mete Atamel
 

CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone – используемые инструменты и компоненты

  • 1. Приложения для Windows Phone Как мы это делаем Григорий Никонов, Actis® Wunderman.
  • 2. Обо мне На данный момент руковожу разработкой мобильных приложений агентства Actis Wunderman, в котором тружусь с момента появления на свет агентства Actis, позже присоединившегося к сети Wunderman. Ранее занимался разработкой, созданием и внедрением интернет-проектов.
  • 3. Наши работы Мы занимаемся разработкой приложений для ведущих платформ около трех лет. Вот, что мы сделали для Windows Phone: •КиноПоиск •Concert.ru •ЛитРес Несколько неназываемых проектов скоро должны быть опубликованы, тогда мы их назовём.
  • 7. Мы – ленивые И поэтому создали несколько инструментов, которые позволяют нам экономить время и усилия: •Фреймворк работы с сущностями и коллекциями •Фреймворк моделей представлений •Фреймворк представлений для Windows Phone и других платформ •T4-генераторы кода Кроме того, сервер непрерывной интеграции и тесты позволяют нам не заботиться о проблемах внесения изменений в код и координировать совместную работу
  • 8. Данные Сценарии использования источников данных в мобильных приложениях, в порядке уменьшения частоты использования: •Получить коллекцию заголовков данных •Получить конкретную сущность •Выполнить единичное действие с источником данных •Отправить изменённую сущность «Мобильность» платформы накладывает некоторые ограничения на возможность и целесообразность передачи больших объёмов данных
  • 9. Данные Данные можно разделить на две категории – сущности и коллекции сущностей И сущности и коллекции сущностей бывают идентифицируемые и неидентифицируемые
  • 10. Сущности События изменения свойств: ObservableObject Обновление и клонирование: XObject, XObject<T> Ключи для идентификации объектов: XKey
  • 11. Коллекции Интеллектуальное обновление: XCollection<T> Применение фильтров: XFilteredCollection<T> Объединение и разделение: XCombinedCollection<T>, XSubRangeCollection<T>
  • 12. Кэширование Запросы как идентификация коллекций: XQuery<T> Применение фильтров: XFilteredCollection<T> Собственно кэш: XCache<T>
  • 13. Пример: Свойства class Person : XObject { string _name; XCollection<Person> _children; public string Name { get { return _name; } set { SetProperty( ref _name, value, “Name” ); } } public XCollection<Person> Children { get { return _children; } set { SetProperty( ref _name, value, “Children” ); } } }
  • 14. Пример: ProcessCopy class Person : XObject { protected override void ProcessCopy( XObject source, bool cloning, bool deepCloning ) { base.ProcessCopy( source, cloning, deepCloning ); Person other = (Person) source; _name = other._name; ProcessCopyProperty( ref _children, other._children, cloning, deepCloning ); } }
  • 15. Пример: Клонирование Person person = new Person { Name = “John”, Children = new XCollection<Person> { new Person { Name = “Bob” } } }; Person softClone = (Person) person.Clone( false ); Person deepClone = (Person) person.Clone( true ); person.Children[0].Name = “Mary”; softClone.Children[0].Name // “Mary” deepClone.Children[0].Name // “Bob”
  • 16. Пример: Обновление Person person1 = new Person { Name = “John” } Person person2 = new Person { Name = “Mary” } person1.Update( person2 ); person1.Name // “Mary” XCollection<Person> l1 = new XCollection<Person>() { … }; XCollection<Person> l2 = new XCollection<Person>() { … }; var result = l1.Update( l2 );
  • 17. Пример: Коллекции XCollection<Person> l1 = new XCollection<Person>() { … }; XCollection<Person> l2 = new XCollection<Person>() { … }; var softClone = l1.Clone( false ); var deepClone = l1.Clone( true ); var result = l1.Update( l2 );
  • 18. Пример: Хитрые коллекции XCollection<Person> studentsOfClassA = …; XCollection<Person> studentsOfClassB = …; var firstThreeStudentsOfClassA = new XSubRangeCollection( studentsOfClassA, 0, 3 ); var firstTwoStudentsOfClassB = new XSubRangeCollection( studentsOfClassB, 0, 2 ); var topStudents = new XCombinedCollection( firstThreeStudentsOfClassA, firstTwoStudentsOfClassB );
  • 20. Демонстрация Сгенерированные классы, содержащие ключевые элементы, необходимые для эффективной работы с данными: •Правильное обновление данных •Правильное клонирование данных •Выборка с помощью ключей в коллекциях и кэше
  • 21. Модели представлений Предназначены для получения и преобразования данных, необходимых представлениям, а также для выполнения других действий над этими данными. Наиболее частые операции в мобильных приложениях – загрузка данных (списки или отдельные сущности) для представления их пользователю. Работа с источниками данных должна быть асинхронной – нельзя блокировать поток пользовательского интерфейса. Необходимо учитывать возможность досрочного прекращения выполняемых операций – по разным причинам.
  • 22. Сессии Всё «управляемое» общение модели (модели представления) с внешним миром происходит в рамках сессии Сессия содержит параметры, необходимые для доступа к данным Сессия содержит жетон, используемый для прекращения асинхронных задач (CancellationToken) Обработкой сессии занимается модель
  • 23. Работа с сессией Создание var session = CreateSession() .AddParameter( “userName”, “John” ) .AddParameter( “age”, 48 ); Доступ к параметрам var userName = session.Parameters.Get<string>( “userName” ); var age = session.Parameters.Get<int>( “age” ); var sex = session.Parameters.Get<string>( “sex”, “male” ); Обработка await viewModel.Load( session );
  • 24. Откуда она знает, что делать? Виртуальные методы ShouldLoadSession LoadSession Части RegisterPart string part, Func<Session, Task> processor, Func<Session, bool> checker, bool loadIfNoPartsSpecified
  • 25. Типичная модель Конструктор Получает сервисы через DI Регистрирует части Создает команды Методы обработки частей Проверяют необходимость обработки сессии Осуществляют доступ/обновление данных
  • 26. Модель сущности Использует расширенную сессию, которая включает в себя ключ, идентифицирующий объект: EntitySession Регистрирует методы для части, связанной с обработкой сущности: ShouldLoadEntity и LoadEntity. Объявляет свойство Entity
  • 27. Типичная модель сущности Конструктор Получает сервисы Создает команды Метод LoadEntity Загружает данные из внешнего источника или из кэша Присваивает значение свойству Entity
  • 28. INavigationService Один из самых важных сервисов, доступных моделям Определяет независимый от платформы способ навигации между видами ns.Navigate( “PersonView”, Parameters.Create( “Id”, 1 ) ); Позволяет создавать и использовать команды навигации: ViewDetails = new NavigationCommand( ns, “DetailedView” ); PersonSelected = new NavigationCommand<Person>( ns, “PersonView”, person => person.KeyParameter() );
  • 29. Другие сервисы IDataExchangeService Информирование об обмене данными IViewModelExceptionHandlingService IExceptionHandlingService Унифицированная обработка исключений
  • 30. Представления PhoneApplication – наследник Application Регистрация сервисов Обработка ошибок уровня приложения
  • 31. Page Управление жизненным циклом OnPageCreated, OnPageDestroyed, OnPageAsleep, OnPageAwaken, OnPageResurrected Доступ к параметрам ViewParameters Контекст для связывания данных CreateDataContext Атрибутирование для навигации [View( “UserView” )] [ViewParameter( “userName”, typeof( string ) )]
  • 32. ViewModelPage<TViewModel> Страница с созданной моделью Начальная загрузка данных CreateDataSession, CreateDataSessionAsync OnDataLoadComplete, OnDataLoadFailed Обработка нештатных ситуаций (FAS) Управление областью жизни модели Связывание данных в XAML <TextBlock Text=“{Binding ViewModel.Title}”/>
  • 33. EntityPage Автоматически выбирает ключ из параметров и создает сессию для загрузки сущности.
  • 34. Но это еще не всё! Генератор классов-заглушек и частичных классов- представлений: <View Name=“MainView”/> <View Name=“FeedChannelView” Entity=“FeedChannel”/> Во многих случаях файл View.xaml.cs не нужен, всё делается автомагически Генератор константных имен представлений и параметров, а также методов для создания параметров навигации
  • 35. Но и это еще не всё! Декораторы страниц используются для выполнения однообразных действий со страницами, например для показа сообщений об ошибках, исчезновении сетевого подключения и т.п. Встроенный механизм обработки страниц, для которых нужна аутентификация – параметр RequiresAuthentication атрибута [View()]

Notas del editor

  1. Показываем проект в VisualStudio
  2. Показываем проект в VisualStudio – модель, которая подгружает список фидов
  3. Показываем ChannelItemViewModel
  4. Навигацию рассмотрим, когда будем говорить о видах
  5. Навигацию рассмотрим, когда будем говорить о видах