SlideShare a Scribd company logo
Архитектура кода новой версии
справочного API      . Или куда мы
           дели MVC?
          Сергей Коржнев
               2ГИС
Кто такой? С какого района?
Почему я такой дерзкий?
● Архитектор и идейный вдохновитель
  новой версии справочного API

● До этого приложился к
  картографическому API (javascript-
  библиотека)

● Также был замечен в рядах
  разработчиков Флампа
Справочное API? Не, не слышал.
REST API

http://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?
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Вопросы к Представлению?
● Тривиальные форматы 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 - Анализируем результаты
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
ServiceManager

$result = ServiceManager::run($_REQUEST);
echo $this->convert($result, 'JSON');
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Запрос
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),
    }
}
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Валидатор
class WhatValidator extends Validator {
    public function run(RequestModel $model) {
      $this->checkRange(
         $model,
         'what',
         $model->minLength,
         $model->maxLength
      );
   }
}
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Сервис
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, Validators

Controller, View   Service
Request, Validator
● Конфигурирование вместо
  программирования

● Строгость и безопасность

● Устранение дублирования кода
Service
● Чистый запрос

● Упрощение декомпозиции методов

● Unit-тесты
Chuck Norris approved
Profit
●   Четкие обязанности компонентов
●   Все на своих местах
●   Консистентный интерфейс
●   Единообразие кода
●   Скорость разработки
●   Unit-тесты
Итого
● +1 велосипед

● Заточили архитектуру под свои задачи

● Готовы к наращиванию
  функциональности API
Вопросы?

More Related Content

PPTX
Behat-trick: как мы внедряли BDD на наших проектах
PDF
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
PDF
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
PDF
Изоморфный JavaScript — будущее уже здесь
PDF
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
PPTX
Технологии тестирования Rich Web client, Андрей Плешков, Форум Технологий Mai...
PPTX
Как не утонуть в мегабайтах JS-кода
PDF
Behat в PHP с использованием Behat и Mink
Behat-trick: как мы внедряли BDD на наших проектах
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
Изоморфный JavaScript — будущее уже здесь
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
Технологии тестирования Rich Web client, Андрей Плешков, Форум Технологий Mai...
Как не утонуть в мегабайтах JS-кода
Behat в PHP с использованием Behat и Mink

What's hot (20)

PDF
Инструменты разные нужны, инструменты разные важны
PDF
Контроль качества верстки или как начать делать Makeup
PPTX
Особенности разработки API / Всеволод Шмыров (Яндекс)
PDF
Тестируй это / Виктор Русакович (GP Solutions)
PDF
Превышаем скоростные лимиты с Angular 2
PPTX
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
PDF
Автоматизация UI тестирования под Windows и Windows Phone
PDF
Knockoutjs на примере 2ГИС-Онлайн
PDF
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
PDF
М. Боднарчук Современное функциональное тестирование с Codeception
PPTX
JavaScript как объектно-ориентированный язык программирования
PPTX
Михаил Боднарчук Современное функциональное тестирование с Codeception
PPTX
Codeception Introduction
PDF
#13 "Управление состоянием в Redux" Роман Сальников
PPT
Take more from Jquery
PDF
Лучший frontend-фреймворк, и почему вы его не хотите
PDF
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
PDF
Modules and assembling of JavaScript (in russian)
PDF
Devcamp nodejs-2010
PDF
Пластилиновый код: как перестать кодить и начать жить
Инструменты разные нужны, инструменты разные важны
Контроль качества верстки или как начать делать Makeup
Особенности разработки API / Всеволод Шмыров (Яндекс)
Тестируй это / Виктор Русакович (GP Solutions)
Превышаем скоростные лимиты с Angular 2
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Автоматизация UI тестирования под Windows и Windows Phone
Knockoutjs на примере 2ГИС-Онлайн
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
М. Боднарчук Современное функциональное тестирование с Codeception
JavaScript как объектно-ориентированный язык программирования
Михаил Боднарчук Современное функциональное тестирование с Codeception
Codeception Introduction
#13 "Управление состоянием в Redux" Роман Сальников
Take more from Jquery
Лучший frontend-фреймворк, и почему вы его не хотите
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Modules and assembling of JavaScript (in russian)
Devcamp nodejs-2010
Пластилиновый код: как перестать кодить и начать жить
Ad

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

PDF
Инструментируй это
PPTX
Node.js введение в технологию, КПИ #ITmeetingKPI
PDF
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
PPTX
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
PDF
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
PDF
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
PPT
Easy authcache 2 кэширование для pro. Родионов Игорь
PPT
Easy authcache 2 кеширование для pro родионов игорь
PDF
UWDC 2013, Yii2
PDF
Как выглядит современный фронтенд
PDF
Опыт разработки эффективного SPA
PDF
Корпоративное приложение на Rails
PPTX
Система обработки бизнес-логики server-side приложения на Groovy
PDF
Чуть сложнее чем Singleton: аннотации, IOC, АОП
PDF
Олег Годовых «Страх и ненависть в Event Bus»
PDF
Страх и ненависть в Event Bus
PDF
2014-08-02 03 Дмитрий Шматко. Первые впечатления от Node.js
PDF
CD with Jenkins. Lessons Learned
PDF
Aspect Oriented Approach
PDF
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
Инструментируй это
Node.js введение в технологию, КПИ #ITmeetingKPI
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2 кеширование для pro родионов игорь
UWDC 2013, Yii2
Как выглядит современный фронтенд
Опыт разработки эффективного SPA
Корпоративное приложение на Rails
Система обработки бизнес-логики server-side приложения на Groovy
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Олег Годовых «Страх и ненависть в Event Bus»
Страх и ненависть в Event Bus
2014-08-02 03 Дмитрий Шматко. Первые впечатления от Node.js
CD with Jenkins. Lessons Learned
Aspect Oriented Approach
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
Ad

More from DevDay (20)

PDF
«Bdd и реактивщина в 2ГИС», Евгений Тютюев
PDF
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
PDF
«Я спросил у сервера...», Илья Пастушков
PDF
Фреймворк Slot, Good Parts, Александр Бирюков
PDF
Рендеринг может больше: vue.js vs React, Андрей Солодовников
PDF
Devops-практики в разработке решений для бизнеса, Максим Пашук
PDF
Inversion of Control в деталях, Дмитрий Кожевников
PDF
«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин
PDF
«Велогосипед», Данил Ильиных
PDF
«Процесс создания продукта», Максим Берёзкин
PDF
«Вывод продукта на новых территориях», Елизавета Алексеенко
PDF
Манипулятор на Ti Stellaris Launchpad, Лёша Романенко
PDF
Лабиринт на Arduino, Вадим Ипполитов
PDF
«Хоба-хоба и в продакшн», Женя Пономарёв
PDF
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
PDF
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
PDF
«Тестируем веб приложения», Павел Сташевский
PDF
«Открытая веб картография», Илья Таратухин
PDF
Матвей Мальков «Ещё один поиск контактов на Android»
PDF
Распределенные приложения и Azure Service Bus
«Bdd и реактивщина в 2ГИС», Евгений Тютюев
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
«Я спросил у сервера...», Илья Пастушков
Фреймворк Slot, Good Parts, Александр Бирюков
Рендеринг может больше: vue.js vs React, Андрей Солодовников
Devops-практики в разработке решений для бизнеса, Максим Пашук
Inversion of Control в деталях, Дмитрий Кожевников
«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин
«Велогосипед», Данил Ильиных
«Процесс создания продукта», Максим Берёзкин
«Вывод продукта на новых территориях», Елизавета Алексеенко
Манипулятор на Ti Stellaris Launchpad, Лёша Романенко
Лабиринт на Arduino, Вадим Ипполитов
«Хоба-хоба и в продакшн», Женя Пономарёв
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
«Тестируем веб приложения», Павел Сташевский
«Открытая веб картография», Илья Таратухин
Матвей Мальков «Ещё один поиск контактов на Android»
Распределенные приложения и Azure Service Bus

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