"Рекомендации по проектированию api" — Марина...

111
1

Upload: yandex

Post on 11-Nov-2014

4.884 views

Category:

Technology


5 download

DESCRIPTION

В докладе говорится о проектировании архитектуры API — начиная с того, о ком должен думать разработчик в начале работы, и до секретов «безболезненного» рефакторинга. От общей культуры формирования интерфейсов до правки багов и поддержки обратной совместимости. А также пара слов о документации — фасаде любого API.

TRANSCRIPT

Page 1: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

1

Page 2: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

2

Рекомендации по проектированию API

Марина Степанова

Page 3: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

3

– Всем привет! Меня зовут Марина, и я сейчас буду рассказывать, как надо проектировать API.

Page 4: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

4

Page 5: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

5

Начну заново

Page 6: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

6

Меня зовут Марина, и я программист…

Page 7: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

7

Меня зовут Марина, и я программист…

…как и моя мама.

Page 8: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

8

Я работаю в команде API Яндекс.Карт

Page 9: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

9

2013

2012

2011

2010

2009

2008 1.0.0

1.0.8

1.1.0

1.1.21

… 2.0.1

2.0.33 2.1-beta

Page 10: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

10

2013

2012

2011

2010

2009

2008 1.0.0

1.0.8

1.1.0

1.1.21

… 2.0.1

2.0.33 2.1-beta

Я начала здесь

Page 11: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

11

300 000 сайтов используют API 15 000 000 пользователей видят карту через API ежедневно (это каждый 10-й человек в России)

Page 12: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

12

Про что я буду рассказывать

!  В чем основная проблема разработки API

!  Приемы проектирования, которые мы применяем, чтобы с этой

проблемой жить

Page 13: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

13

Бонус!

Я буду приводить примеры, когда мы не соблюдали собственные рекомендации и сильно от этого страдали

Слайды стыда и позора будут помечены специальным знаком

Page 14: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

14

Page 15: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

15

Page 16: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

16

Корень страданий разработчика API

Page 17: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

17

О чем таком особенном должен помнить проектировщик API?

Page 18: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

18

Программный код Пользовательский интерфейс

К чему все привыкли

Page 19: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

19

Чего хотел пользователь?

Понятно Крутой дизайн

Не глючит

Функциональность

Котики

Няшки

Page 20: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

20

Программный код

Программный интерфейс

Пользовательский интерфейс

Все меняется, когда вы делаете API

Page 21: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

21

Программный код

Программный интерфейс

Пользовательский интерфейс

Все меняется, когда вы делаете API

Page 22: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

22

Мечта каждого программиста –

видеть свой код 1 раз в жизни

Page 23: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

23

Чего хочет этот пользователь?

API Пользовательский код, работающий с API Проект

Написал, отладил и

забыл

Page 24: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

24

Если вы ломаете обратную совместимость, пользователь вынужден вечно переписывать код

1.1.0

1.1.1

1.1.2

Пользовательский код №0

Пользовательский код №1

Пользовательский код №2

Проект

Page 25: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

25

И ЕМУ ЭТО НЕ НРАВИТСЯ

Если вы ломаете обратную совместимость, пользователь вынужден вечно переписывать код

Page 26: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

26

А чего хотим мы сами?

Page 27: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

27

Чего хотим мы, разработчики API?

!  Править баги !  Добавлять фичи ! Рефакторить код

Page 28: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

28

Мы заморочились и посчитали сколько строк кода мы переписали за год

2.0.7 2.0.31

60% кода поменялось

(без потери обратной совместимости)

Page 29: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

29

Итак, причина страданий разработчика API:

Мы должны переписывать свой код, а пользователи должны свой не переписывать

Page 30: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

30

Смягчить удар позволяет правильное проектирование системы

Page 31: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

31

Наши приемы проектирования

Page 32: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

32

Мы разбиваем систему на уровни абстракции

Page 33: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

33

Пример абстракций в API

Точка

Page 34: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

34

Пример абстракций в API

Геообъект Геометрическая

модель DOM-макет

Точка

Page 35: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

35

При формировании уровней абстракции мы следуем некоторым правилам, о которых я и буду говорить

Page 36: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

36

Иерархия уровней

Page 37: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

37

Иерархия уровней

Геообъект Геометрическая модель

DOM-макет

Page 38: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

38

В этом месяце мы должны заработать в

три раза больше

Уровни знают только о своих соседях

Page 39: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

39

Уровни знают только о своих соседях С этого дня

работаете в две смены

Page 40: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

40

Геообъект Геометрическая модель DOM-макет

Не знает, как будет выглядеть, зато знает свои координаты

Ничего не знает про координаты, зато умеет встраиваться в DOM

Уровни знают только о своих соседях

Page 41: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

41

Каждый уровень – это информационный контекст

Page 42: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

42

Каждый уровень – это информационный контекст

Page 43: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

43

Каждый уровень – это информационный контекст

Геообъект Геометрическая модель DOM-макет

Здесь важны координаты, проекция, зум

Здесь важны пиксельные координаты окна карты

Page 44: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

44

Максимальное разграничение обязанностей

Page 45: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

45

Максимальное разграничение обязанностей

Page 46: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

46

Максимальное разграничение обязанностей

Геообъект Геометрическая модель DOM-макет

Canvas-макет

Page 47: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

47

Оценим предусмотрительность нашего старого знакомого

API Пользовательский код, работающий с API Проект

Как знал, что понадобится!

Page 48: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

48

Система превращается в большой конструктор, в котором легко заменяются части

Page 49: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

49

Части вашей системы должны между собой как-то взаимодействовать

Page 50: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

50

Взаимодействие на событиях

«Я подвинулась»

«Карта подвинулась, надо бы перерисоваться»

«Так, говорят надо перерисовываться, двигай наш div»

Геообъект Геометрическая модель

DOM-макет Карта

Page 51: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

51

События дают много места для маневра

Page 52: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

52

В 2.1-beta мы сделали адаптивный дизайн

Page 53: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

53

size = “small” size = “large”

Page 54: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

54

«Большой» макет реагирует на все события

Контрол пробок

addtomap!

Page 55: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

55

Контрол пробок

select!

«Большой» макет реагирует на все события

Page 56: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

56

Контрол пробок

expand!

«Большой» макет реагирует на все события

Page 57: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

57

Маленький макет…

select! expand! enable!

providerchange!

Контрол пробок

ЭЭЭ…

Page 58: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

58

Маленький макет делает что может

Контрол пробок

Page 59: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

59

Плюсы взаимодействия на событиях

!  Слабая связанность объектов !  Легко «подцепить» новую сущность !  Абстрагируетесь от соседей !  Можно реагировать на события частично

Page 60: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

60

Что мы узнали про уровни абстракции

!  Нужно выстроить иерархию взаимодействия !  Уровни знают только о своих соседях !  Уровень – это информационный контекст !  Максимально разграничиваем обязанности !  Взаимодействие уровней через события

Page 61: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

61

Мы строили, строили и наконец построили - Наша система состоит из множества небольших сущностей,

взаимодействующих между собой.

Page 62: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

62

Мы строили, строили и наконец построили - Наша система состоит из множества небольших сущностей,

взаимодействующих между собой.

Это надо отметить описать!

Page 63: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

63

На арену выходят программные интерфейсы

Page 64: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

64

Что такое программный интерфейс?

!  Описание функциональности, которую предоставляет компонент. Причем в определенном контексте. !

IChild!!.getParent() // Описание методов.!!.setParent()!!@parentchange // Описание событий. !

!

Page 65: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

65

Интерфейсы наследуются

ICustomizable

IChildOnMap

IGeoObject

Объект, у которого есть менеджер опций

Объект, добавляемый на карту

Геообъект (свои методы + композиция более мелких интерфейсов)

Page 66: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

66

Какие задачи решают программные интерфейсы?

Page 67: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

67

Вспомним пример, в котором мы хотели заменить один из компонентов

Геообъект Геометрическая модель DOM-макет

Canvas-макет

Page 68: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

68

Как понять, насколько точно нам надо скопировать заменяемую сущность, чтобы система не рухнула?

DOM-макет

Canvas-макет

Page 69: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

69

Если вы описываете интерфейсы, проблем такого рода не возникает

IGeoObject IOverlay ILayout

На это место можно поместить любую реализацию интерфейса

Page 70: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

70

Какие задачи решают программные интерфейсы

!  Вы получаете формальное описание вашей системы !  Сущности становятся легко заменяемыми (подойдет любая реализация интерфейса)

Page 71: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

71

!  Когда вы продумываете программные интерфейсы, вы наводите порядок у себя в голове

Page 72: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

72

Интерфейсы должны быть дробными

ICollection

IParentOnMap

ymaps.Collection

ymaps.GeoObjectCollection

Page 73: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

73

Если в вашем интерфейсе много сущностей - это повод задуматься

setParent() getParent() .options .events

IChild

ICustomizable

IEventEmitter

Page 74: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

74

Названия, ключи, алиасы должны быть очень конкретными

Page 75: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

75

– Петька, get()! – 32! – Что 32? – А что get()?

Page 76: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

76

Грустный пример из реальной жизни www.somesite.ru?%с&%n&%l&%j%s Для расшифровки этого url нужно выучить небольшой нелогичный алфавит: %c – coordinates %l – lang %n – layer (ну потому что %l занято) %j – id (пошло от «jam») %s – timestamp (потому что «stamp»)

Page 77: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

77

В какой момент пора выделять программные интерфейсы?

Page 78: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

78

Вариант №1 (неправильный)

1.  Выделяем уровни абстракции 2.  Пишем код 3.  Описываем получившиеся интерфейсы

Page 79: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

79

Почему этот вариант неправильный?

Page 80: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

80

У нас в 2.0 появился кластеризатор

Page 81: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

81

Метки собираются в объект-кластер

Кластеризатор

Объект-кластер

Page 82: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

82

Кластеризатору для работы нужно знать, сколько меток в каждом кластере

???

Page 83: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

83

Кластеризатору для работы нужно знать, сколько меток в каждом кластере

Можно хранить данные у себя

Можно спрашивать у кластера ???

Page 84: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

84

Идем по пути наименьшего сопротивления

Кластеризатор

Объект-кластер

cluster.getGeoObjects()

Page 85: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

85

Кластеризатор

Объект-кластер

Позже утверждаем интерфейсы

Page 86: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

86

IGeoObject

Позже утверждаем интерфейсы

Кластеризатор

Объект-кластер

Page 87: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

87

ICollection IGeoObject

Позже утверждаем интерфейсы

Объект-кластер

Page 88: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

88

ICollection IGeoObject IGeoObject

Позже утверждаем интерфейсы

Page 89: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

89

Подставим интерфейсы в схему

ICollection cluster.getGeoObjects() IGeoObject

IGeoObject IGeoObject

IGeoObject IGeoObject

IGeoObject

IGeoObject

IGeoObject IGeoObject

IGeoObject

Page 90: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

90

Подставим интерфейсы в схему

ICollection cluster.getGeoObjects() IGeoObject

IGeoObject IGeoObject

IGeoObject IGeoObject

IGeoObject

IGeoObject

IGeoObject IGeoObject

IGeoObject

Этот метод больше нельзя использовать – он не входит в интерфейс

Page 91: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

91

Как реально выглядит процесс

1.  Выделяем уровни абстракции 2.  Пишем код 3.  Описываем получившиеся интерфейсы 4.  Переписываем код, чтобы все сущности использовали только

интерфейсные методы

Page 92: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

92

Вариант №2 (правильный)

1.  Выделяем уровни абстракции 2.  Описываем интерфейсы 3.  Пишем код, в котором объекты взаимодействуют через

интерфейсные методы, поля, события

Page 93: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

93

Интерфейсы изменят ваш проект

Page 94: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

94

Подобное станет подобным

Placemark

Polygon

Polyline

IGeoObject

Page 95: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

95

Мы не успели отточить интерфейсы контролов при запуске

Контролы писали разные люди, в результате получили немного разные конструкторы

Button(params, options)! TrafficControl(state, options)! SearchControl(options)!

Page 96: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

96

Обратная сторона интерфейсов

!  Из-за того, что объекты станут композициями дробных интерфейсов, конечные объекты могут иметь несколько монструозный и избыточный интерфейс.

Page 97: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

97

У нас чудесным, но монструозным вышел IGeoObject

! var myPlacemark = new ymaps.GeoObject({!! !geometry: { ! ! ! !type: “Point”,!! ! !coordinates: [37.61, 55.75] !! !},!! !properties: {!! ! !balloonContent: ‘Hello!’,!! ! !id: 723!! !}!!}, {!! !// Опции.!! !preset: ‘twirl#redIcon’,!! !zIndex: 100!!});!

Page 98: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

98

Мы выбрали самые частые варианты использования и сделали для них хелперы

Page 99: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

99

Создавать метки стало проще

! !var myPlacemark = new ymaps.Placemark([37.61, 55.75], {!! ! !// Данные.!

! ! !balloonContent: ‘Hello!’,!! ! !id: 723!! !}, {!! ! !// Опции.!! ! !zIndex: 100,!! ! !preset: ‘twirl#redIcon’!! !}); !

!

Page 100: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

100

Также вас спасут значения по умолчанию

Программист изучает опции геообъекта только в тот момент, когда они ему понадобятся и не забивает голову ненужным мусором

Page 101: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

101

Еще одна военная хитрость

Публичная  часть   Наше API

Page 102: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

102

Все вылизано, документировано, никогда не изменится

Публичная часть Закрытая часть

Page 103: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

103

Все вылизано, документировано, никогда не изменится

Публичная часть Закрытая часть

Page 104: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

104

Публичная часть Закрытая часть

Таких ситуаций быть не должно

Page 105: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

105

Мы открывали сущности постепенно 2.0.14 2.0.33

Page 106: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

106

Лучше открыть мало, но хорошо, чем много, но плохо

Page 107: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

107

Подведем итоги

Page 108: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

108

Вывод №1

!  Мы в ответе за тех, кто пользуется нашим API

Page 109: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

109

Вывод №2

!  Проектирование большой системы – сложный процесс. Но если заложить верные принципы, все получится.

Page 110: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

110

Спасибо за внимание

Page 111: "Рекомендации по проектированию API" — Марина Степанова, Яндекс

111

Степанова Марина Разработчик интерфейсов

[email protected]

! ya_mstepanova

© ООО «Яндекс», 2013