Особенности
разработки API
Всеволод Шмыров, Старший разработчик интерфейсов
Кто я такой?
• Меня зовут Сева
3
Кто я такой?
• Меня зовут Сева
• Разработчик API Карт и Конструктор карт
4
API
• Framework
• Библиотека
• Сервис
• Виджет
• …
5
Что будет в докладе?
• Наш опыт
6
Что будет в докладе?
• Наш опыт
• Принципы и особенности разработки API
7
Что будет в докладе?
• Наш опыт
• Принципы и особенности разработки API
• Публичное API
8
Чего не будет в докладе?
• Ответа на вопрос «Нужно ли вам свое API?»
9
API
План доклада
• Проектирование интерфейса
11
План доклада
• Проектирование интерфейса
• Обратная совместимость
12
План доклада
• Проектирование интерфейса
• Обратная совместимость
• Исследование своего API
13
План доклада
• Проектирование интерфейса
• Обратная совместимость
• Исследование своего API
• Дополнительные действия
14
│Будь проще
Пример плохого интерфейса 16
getFriends() => []
Пример плохого интерфейса 17
var friends = getFriends();
Пример плохого интерфейса 18
getFriends() => []
getFriends() => Null
// Если нет друзей :(
Пример плохого интерфейса 19
var friends = getFriends();
if (friends) {
// ...
} else {
// ...
}
Пример плохого интерфейса 20
getFriends() => []
getFriends() => Null
getFriends() => User
// Один друг, но какой ...
Пример плохого интерфейса 21
var friends = getFriends();
if (isUser(friends)) { /* ... */ }
else if (friends) { /* ... */ }
else { /* ... */ }
Интерфейс должен быть
• Простым и логичным
22
Интерфейс должен быть
• Простым и логичным
• Консистентным
23
Консистентный интерфейс 24
iCanShowYou({x: 1, y: 1});
NoUCant([1, 2]);
ButIMust(Point);
Консистентный интерфейс 25
iCanShowYou({x: 1, y: 1});
NoUCant([1, 2]);
ButIMust(Point);
Консистентный интерфейс 26
iCanShowYou({x: 1, y: 1});
NoUCant([1, 2]);
ButIMust(Point);
Интерфейс должен быть
• Простым и логичным
• Консистентным
• Но не в ущерб возможностям
27
Сложные задачи
• Много параметров
• Неопределенный результат из-за третьих сторон
28
Много параметров 29
someAwesomeMethod(
elem,
index,
startValue,
endValue
);
Много параметров 30
someAwesomeMethod(
elem, /* required */
index, /* = "key" */
startValue, /* = 0 */
endValue /* = 1 */
);
Группировка параметров 31
new ymaps.GeoObject(
geometry, /* {Object} */
properties, /* {Object} */
options /* {Object} */
);
Программные хелперы 32
new ymaps.GeoObject(geometry);
// Любые геометрии
new ymaps.Placemark(coord);
// Только «Point»
Неопределенный результат 33
geolocation.get()
.then(function (result) {
// success
}, function (error) {
// error
});
Неопределенный результат 34
geolocation.get()
.then(function (result) {
// success
}, function (error) {
// error
});
Браузерная геолокация
35
Браузерная геолокация 36
geolocation.get({
timeout: 30000
}).then(function (result) {
// ...
});
│Рукописи не горят
Обратная совместимость
Работает – не трогай!
38
Публикация нового интерфейса
• Степень свободы разработчика
39
Степень свободы разработчика
40
Степень свободы
разработчика
Ресурсы на поддержку
Риск ошибки
Публикация нового интерфейса
• Степень свободы разработчика
• Расширяемость
41
Расширяемый интерфейс 42
balloon.setPosition(
x, y // Обязательные аргументы
)
Расширяемый интерфейс 43
balloon.setPosition(
[x, y]
)
Расширяемый интерфейс 44
balloon.setPosition(
[x, y], projection
)
Расширяемый интерфейс 45
balloon.setPosition(
[x, y], options
)
Публикация нового интерфейса
• Степень свободы разработчика
• Расширяемость
• Не станет ли «блокером» в будущем?
46
Расширяемый интерфейс 47
overlay.getLayout()
// HTMLLayout
Расширяемый интерфейс 48
overlay.getLayout()
// Ilayout
// HTMLLayout, CanvasLayout ...
Расширяемый интерфейс 49
overlay.getLayout()
// Promise
Исправление ошибок
• Deprecated сущности
50
Исправление ошибок
• Deprecated сущности
• Использование алиасов
51
Алиасы 52
presets.get('islands#greyIcon');
presets.get('islands#grayIcon');
Исправление ошибок
• Deprecated сущности
• Использование алиасов
• Не все можно исправить
53
Отпусти и забудь 54
https://api-maps.yandex.ru/2.1/?lang=ru_RU&mode=debug
Отпусти и забудь 55
https://api-maps.yandex.ru/2.1/?lang=ru_RU&mode=debug
Отпусти и забудь 56
https://api-maps.yandex.ru/2.1/?lang=ru_RU&mode=debug
Отпусти и забудь 57
https://api-maps.yandex.ru/2.1/?lang=ru_RU&mode=debug
Отпусти и забудь 58
https://api-maps.yandex.ru/2.1/?lang=ru_RU&mode=debug
Мажорные релизы API карт
59
• Отказ от поддержки старых браузеров
• Добавление современных интерфейсов
• «Чистка» кода
2.12.0
«Особый режим» работы
60
'use strict';
function a () {
return this.b;
}
Порядок координат в API карт
https://api-maps.yandex.ru/2.1/
?lang=ru_RU&coordorder=longlat
61
Порядок координат в API карт
62
...&coordorder=longlat // [широта, долгота] *
...&coordorder=latlong // [долгота, широта]
Порядок координат в API карт
63
// [широта, долгота]
new ymaps.Placemark([55.8, 37.8])
// [долгота, широта]
new ymaps.Placemark([37.8, 55.8])
Визуальная обратная совместимость
64
Визуальная обратная совместимость
65
66
67
Каскадный «слом» совместимости
68
Проект
ScrollZoom
MouseEventBrowser
API
Клиенты
│Свой среди чужих
API «в гостях»
70
API API API
jQuery evil.js
Site 1 Site 2 Site 3
Переопределение нативных методов
71
Array.prototype.indexOf = function (item) {
for (var i = 0; i < this.length; i++)
if (item == this[i])
return i;
};
Общий CSS
72
* {
transition: 2s all ease;
}
Iframe v Script
73
https://events.yandex.ru/lib/talks/4258/
│Вы не знаете свой
продукт
Маленькие карты
75
2.0 2.1
Разные размеры контролов
76
Large
Medium
Small
Метрики
• Использование определенных модулей
77
Метрики
• Использование определенных модулей
• Параметры использования API
78
Метрики
• Использование определенных модулей
• Параметры использования API
• Параметры окружающей среды (браузеры)
79
│Думай как …
81
│Документируй это
Документация
83
Документация
84
Песочница
85
Избыточный пример
86
Избыточный пример
87
Песочница
88
│Call me maybe
Конструктор карт Яндекса
90
│Продай мне эту ручку
Конструктор карт Яндекса
92
│Еще проще
Конструктор карт Яндекса
94
Конструктор карт Яндекса
95
Конструктор
• Простое решение популярных задач
96
Конструктор
• Простое решение популярных задач
• Меньше «свободы» для разработчика
97
Меньше возможностей в виджете
98
<script src="
.../constructor/?um={id}&width=514&height=326
"></script>
Конструктор
• Простое решение популярных задач
• Меньше «свободы» для разработчика
• Обход ограничения обратной совместимости
99
Итог
Принципы разработки API
• Не заставляйте делать лишнего
101
Принципы разработки API
• Не заставляйте делать лишнего
• Помните про обратную совместимость
102
Принципы разработки API
• Не заставляйте делать лишнего
• Помните про обратную совместимость
• Исследуйте использование API
103
Полезные материалы
• API Яндекс.Карт
https://tech.yandex.ru/maps/
• Iframe v Script
https://events.yandex.ru/lib/talks/4258/
104
vsesh@yandex-team.ru
Спасибо за внимание!
Всеволод Шмыров, Старший разработчик интерфейсов
vseshvsevolod.shmyrov
@vsesh

Особенности разработки API / Всеволод Шмыров (Яндекс)

Editor's Notes

  • #17 Одна социальная сеть предоставляла в своем API такой метод. Ну тот все просто и логично. Вызываешь getFriends – получаешь список друзей.
  • #18 Код, который использует этот метод выглядет бы примерно так. Но оказалось, что не все так просто.
  • #19 Если у тебя нет друзей список возвращает Null. Ну тоже логично. Наверное.
  • #22 И примерно такой код должен писать каждый разработчик, который будет использовать этот метод. Не надо так.
  • #38 Я думаю, что абсолютно все в зале когда-то сталкивались с очень неприятной ситуаций. Вы вдруг узнаете (обычно ночью), что в вашем проекте вдруг что-то перестало работать. И обычно все сразу. Вы разбираетесь и оказывается, что какая-нибудь внешняя библиотека вдруг стала работать как-то по другому. Не так как вы ожидали ранее. Естественно после одного такого случая ваше доверия к компоненту, который предоставляет такой интерфейс заметно снизится. Но из-за чего такое произошло? Разработчики API не соблюли обратную совместимость.
  • #61 Но бывает, что новую мажорную версию нельзя выпустить. Не хватает ресурсов, недавно выпустили предыдущую версию, слишком большие изменения. Причин может быть много. Тогда можно сделать «особый» режим работы. Хороший пример строгий пример работы JS. В этом режиме многие привычные вещи из JS начинает работать не
  • #82 Разработчикам, чтобы понимать свое API нужно его использовать. Не абстрактно, а вполне по назначению. Попытайтесь придумать какой-то проект, который бы можно было реализовать на основе вашего API и попытайтесь его реализовать. Пишите не основе копипаста своих наработок, а как бы делал внешних пользователь. Откройте свою же документацию и пройдитесь по первым пунктам. Я вас уверяю вы найдете несколько багов, сразу обнаружите какой из методов работает нелогично.
  • #86 Значительно интересней смотреть живые примеры! Для этих целей мы сделали песочницу – интерактивные примеры с «живым» кодом. Куда вынесли самые часто востребованные кейсы. Но и здесь нужно себя перебороть и не делать избыточные примеры. Конкретно этот пример не очень простой, но у него специфика такая. На самом деле он показывает только добавление определенных типов кластеров на карту. Хочется показать как можно больше сразу, но это может обернуться против вас же.
  • #87 К примеру, однажды мы обнаружили достаточно большое кол-во пользователей с такими картами …
  • #88 К примеру, однажды мы обнаружили достаточно большое кол-во пользователей с такими картами …
  • #89 Значительно интересней смотреть живые примеры! Для этих целей мы сделали песочницу – интерактивные примеры с «живым» кодом. Куда вынесли самые часто востребованные кейсы. Но и здесь нужно себя перебороть и не делать избыточные примеры. Конкретно этот пример не очень простой, но у него специфика такая. На самом деле он показывает только добавление определенных типов кластеров на карту. Хочется показать как можно больше сразу, но это может обернуться против вас же.
  • #93 Этот сервис позволяет буквально нарисовать карту. Конструктор решает очень популярный и простой кейс разработчика. Быстро создать карту с несколькими объектами на карте.
  • #95 Этот сервис позволяет буквально нарисовать карту. Конструктор решает очень популярный и простой кейс разработчика. Быстро создать карту с несколькими объектами на карте.
  • #96 Единственный элемент программирования – это вставка полученного кода в свой html.