Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Архитектура кода новой версиисправочного API      . Или куда мы           дели MVC?          Сергей Коржнев               ...
Кто такой? С какого района?Почему я такой дерзкий?● Архитектор и идейный вдохновитель  новой версии справочного API● До эт...
Справочное API? Не, не слышал.REST APIhttp://catalog.api.2gis.ru/search   ?what=музей   &where=Москва   &version=1.3   &ke...
Справочное API? Не, не слышал.{    "api_version": "1.3",    "response_code": "200",    "total": "265",    "result": [     ...
Справочное API? Не, не слышал.
О чем доклад?● Почему простой MVC не подходит для  построения развесистого server-side API?● Как сделать хорошо?● Наш опыт
Как все начиналось?     ... шел 2009 год, человечество еще не     ...
Маленькие
Партнеры    maps.2gis.ru                   Внешние партнеры
Внутренние и внешние партнеры
Единое API для всех. Фокусируемся.
Радостные пользователи● Новые фичи● Консистентность интерфейсов
Отказ от текущей версии
Технические долги
Единая реализация
Почему простой MVCне подходит для построенияразвесистого server-side API?
Вопросы к Представлению?● Тривиальные форматы JSON, JSONP,  XML● Yii-представление больше для HTML.● Как, блин, рефакторить?
Вопросы к Контроллеру?● Как его тестировать?● Как быть когда фильтров и  параметров много?● Как быть нестандартным роутинг...
Когда много кода
Инструкция как сделать хорошоШаг 1 - Распиливаем МодельШаг 2 - Разводим зоопарк классовШаг 3 - Анализируем результат
Model
Domain в extensionах● CApplicationComponent● Yii::app()->geoCoder
Разруливание зависимостейreturn array(   components => array(        geoCoder => array(           class => ext.geoCoder.Ex...
Инструкция как сделать хорошоШаг 1 - Распиливаем МодельШаг 2 - Разводим зоопарк классовШаг 3 - Анализируем результаты
ServiceManager$result = ServiceManager::run($_REQUEST);echo $this->convert($result, JSON);
ЗапросGeoSearchRequest extends RequestModel {  public $what;  public $is_cool_place;    public function rules() {      arr...
Валидаторclass WhatValidator extends Validator {    public function run(RequestModel $model) {      $this->checkRange(    ...
СервисGeoService extends DGService {  private $_request;  public function search() {    $data = Yii::app()->geo->search($t...
Структура директорийapp/  services/     GeoService.php  validators/     WhatValidator.php  requests/     geo/        GeoSe...
Инструкция как сделать хорошоШаг 1 - Распиливаем МодельШаг 2 - Разводим зоопарк классовШаг 3 - Анализируем результаты
Что получилось?До                 ПослеFilters            Request, ValidatorsController, View   Service
Request, Validator● Конфигурирование вместо  программирования● Строгость и безопасность● Устранение дублирования кода
Service● Чистый запрос● Упрощение декомпозиции методов● Unit-тесты
Chuck Norris approved
Profit●   Четкие обязанности компонентов●   Все на своих местах●   Консистентный интерфейс●   Единообразие кода●   Скорост...
Итого● +1 велосипед● Заточили архитектуру под свои задачи● Готовы к наращиванию  функциональности API
Вопросы?
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Upcoming SlideShare
Loading in …5
×

Архитектура кода нового 2ГИС Web API или куда мы дели MVC

1,282 views

Published on

Сергей Коржнев
Архитектор версии 1.4 2ГИС Web API

Архитектура кода нового 2ГИС Web API или куда мы дели MVC

Тезисы:
● Как организован код в старой версии.
● Вдумчиво смотрим, как мы используем Yii, хватаемся за голову и клавиатуру. Там отрезаем, тут пришиваем, и вуаля!
● Ну и делаем выводы, как мы забороли две классические проблемы программирования: борьба с дублированием кода и сложностью системы.

Архитектура кода нового 2ГИС Web API или куда мы дели MVC

  1. 1. Архитектура кода новой версиисправочного API . Или куда мы дели MVC? Сергей Коржнев 2ГИС
  2. 2. Кто такой? С какого района?Почему я такой дерзкий?● Архитектор и идейный вдохновитель новой версии справочного API● До этого приложился к картографическому API (javascript- библиотека)● Также был замечен в рядах разработчиков Флампа
  3. 3. Справочное API? Не, не слышал.REST APIhttp://catalog.api.2gis.ru/search ?what=музей &where=Москва &version=1.3 &key=1234567890 &output=json
  4. 4. Справочное API? Не, не слышал.{ "api_version": "1.3", "response_code": "200", "total": "265", "result": [ { "id": "4504127908471392", "lon": "37.6798458645247", "lat": "55.6172926242175", // ... }, // ... ]}
  5. 5. Справочное API? Не, не слышал.
  6. 6. О чем доклад?● Почему простой MVC не подходит для построения развесистого server-side API?● Как сделать хорошо?● Наш опыт
  7. 7. Как все начиналось? ... шел 2009 год, человечество еще не ...
  8. 8. Маленькие
  9. 9. Партнеры maps.2gis.ru Внешние партнеры
  10. 10. Внутренние и внешние партнеры
  11. 11. Единое API для всех. Фокусируемся.
  12. 12. Радостные пользователи● Новые фичи● Консистентность интерфейсов
  13. 13. Отказ от текущей версии
  14. 14. Технические долги
  15. 15. Единая реализация
  16. 16. Почему простой MVCне подходит для построенияразвесистого server-side API?
  17. 17. Вопросы к Представлению?● Тривиальные форматы JSON, JSONP, XML● Yii-представление больше для HTML.● Как, блин, рефакторить?
  18. 18. Вопросы к Контроллеру?● Как его тестировать?● Как быть когда фильтров и параметров много?● Как быть нестандартным роутингом?
  19. 19. Когда много кода
  20. 20. Инструкция как сделать хорошоШаг 1 - Распиливаем МодельШаг 2 - Разводим зоопарк классовШаг 3 - Анализируем результат
  21. 21. Model
  22. 22. Domain в extensionах● CApplicationComponent● Yii::app()->geoCoder
  23. 23. Разруливание зависимостейreturn array( components => array( geoCoder => array( class => ext.geoCoder.ExtGeoCoder, dbConnection => geoDB, ), geoDB => array( /* ... */), ),);
  24. 24. Инструкция как сделать хорошоШаг 1 - Распиливаем МодельШаг 2 - Разводим зоопарк классовШаг 3 - Анализируем результаты
  25. 25. ServiceManager$result = ServiceManager::run($_REQUEST);echo $this->convert($result, JSON);
  26. 26. ЗапросGeoSearchRequest extends RequestModel { public $what; public $is_cool_place; public function rules() { array(WhatValidator, min => 2, max =>50), array(BooleanValidator, param => is_cool_place, required => false), }}
  27. 27. Валидаторclass WhatValidator extends Validator { public function run(RequestModel $model) { $this->checkRange( $model, what, $model->minLength, $model->maxLength ); }}
  28. 28. СервисGeoService extends DGService { private $_request; public function search() { $data = Yii::app()->geo->search($this->_request->what, $this->_request->is_cool_place); return $this->formatSearch($data) } private function formatSearch(array $data) { $data[total] = count($data); return $data; }}
  29. 29. Структура директорийapp/ services/ GeoService.php validators/ WhatValidator.php requests/ geo/ GeoSearchRequest.php
  30. 30. Инструкция как сделать хорошоШаг 1 - Распиливаем МодельШаг 2 - Разводим зоопарк классовШаг 3 - Анализируем результаты
  31. 31. Что получилось?До ПослеFilters Request, ValidatorsController, View Service
  32. 32. Request, Validator● Конфигурирование вместо программирования● Строгость и безопасность● Устранение дублирования кода
  33. 33. Service● Чистый запрос● Упрощение декомпозиции методов● Unit-тесты
  34. 34. Chuck Norris approved
  35. 35. Profit● Четкие обязанности компонентов● Все на своих местах● Консистентный интерфейс● Единообразие кода● Скорость разработки● Unit-тесты
  36. 36. Итого● +1 велосипед● Заточили архитектуру под свои задачи● Готовы к наращиванию функциональности API
  37. 37. Вопросы?

×