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

111
1

Upload: yandex

Post on 16-Jun-2015

1.290 views

Category:

Technology


6 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 (неправильный)

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

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

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

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

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

92

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

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

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

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

Вывод №1

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

109

Вывод №2

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

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

110

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

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

111

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

[email protected]

! ya_mstepanova

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