Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 1,126 views

Сергей Коржнев ...

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

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

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

Statistics

Views

Total Views
1,126
Views on SlideShare
946
Embed Views
180

Actions

Likes
2
Downloads
5
Comments
1

3 Embeds 180

http://devday.2gis.ru 136
http://devday.ru 43
http://10.54.86.138 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

  • Архитектура кода новой версиисправочного API . Или куда мы дели MVC? Сергей Коржнев 2ГИС
  • Кто такой? С какого района?Почему я такой дерзкий?● Архитектор и идейный вдохновитель новой версии справочного API● До этого приложился к картографическому API (javascript- библиотека)● Также был замечен в рядах разработчиков Флампа
  • Справочное API? Не, не слышал.REST APIhttp://catalog.api.2gis.ru/search ?what=музей &where=Москва &version=1.3 &key=1234567890 &output=json
  • Справочное API? Не, не слышал.{ "api_version": "1.3", "response_code": "200", "total": "265", "result": [ { "id": "4504127908471392", "lon": "37.6798458645247", "lat": "55.6172926242175", // ... }, // ... ]}
  • Справочное 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.ExtGeoCoder, dbConnection => geoDB, ), geoDB => array( /* ... */), ),);
  • Инструкция как сделать хорошоШаг 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() { array(WhatValidator, min => 2, max =>50), array(BooleanValidator, param => is_cool_place, required => false), }}
  • Валидаторclass WhatValidator extends Validator { public function run(RequestModel $model) { $this->checkRange( $model, what, $model->minLength, $model->maxLength ); }}
  • Сервис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; }}
  • Структура директорийapp/ services/ GeoService.php validators/ WhatValidator.php requests/ geo/ GeoSearchRequest.php
  • Инструкция как сделать хорошоШаг 1 - Распиливаем МодельШаг 2 - Разводим зоопарк классовШаг 3 - Анализируем результаты
  • Что получилось?До ПослеFilters Request, ValidatorsController, View Service
  • Request, Validator● Конфигурирование вместо программирования● Строгость и безопасность● Устранение дублирования кода
  • Service● Чистый запрос● Упрощение декомпозиции методов● Unit-тесты
  • Chuck Norris approved
  • Profit● Четкие обязанности компонентов● Все на своих местах● Консистентный интерфейс● Единообразие кода● Скорость разработки● Unit-тесты
  • Итого● +1 велосипед● Заточили архитектуру под свои задачи● Готовы к наращиванию функциональности API
  • Вопросы?