Принципы разработки поддерживаемых и гибких...

107
Принципы разработки гибких и поддерживаемых интерфейсов Вася Аксёнов @outring

Upload: ontico

Post on 21-Dec-2014

214 views

Category:

Documents


2 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Принципы разработки гибких и поддерживаемых интерфейсов

Вася Аксёнов@outring

Page 2: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Разработка VS. Интрефейсы

Page 3: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

3

РазработкаРеализация — абстрактные сущности

Page 4: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

4

ИнтерфейсыРеализация — визуальное представление

Page 5: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

5

В чём разница?Явность правил взаимодействияПредопределённость сценариев взаимодействия и сущностей

Page 6: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Гибкость и поддерживаемость

Page 7: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

7

ГибкостьВозможность создания новых частей интерфейса без необходимости внесения изменений в ранее созданные части

Page 8: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

8

ПоддерживаемостьВозможность безопасного изменения интерфейса

Page 9: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

1 SRPПринцип единственной ответственности

Page 10: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

10

Принцип единственной Каждая сущность имеет только одну обязанностьСущность должна иметь только одну причину измениться

Page 11: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

11

Скачать

Page 12: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

12

Кнопка.download-button {! padding: 0 20px;}

Page 13: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

13

Размеры.download-button {! width: 230px;! padding: 0 20px;}

Page 14: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Позиционирование.download-button {! position: absolute;! left: 50%;! top: 50%;

! width: 230px;! margin-top: -65px;! margin-left: -135px;! padding: 0 20px;} 14

Page 15: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

−padding.download-button {! position: absolute;! left: 50%;! top: 50%;

! width: 230px;! margin-top: -65px;! margin-left: -135px;! padding: 0 20px;} 15

Page 16: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

16

Скачать

Page 17: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Скачать

17

Page 18: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

МинусыНеобходимость изменения для переиспользованияСложность понимания ответственностиНебезопасность изменений

18

Page 19: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

19

РешениеРаспределение ответственности по разным элементамИли классам

Page 20: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

20

Скачать

Page 21: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

21

Функциональное разделение по элементам

Только одна причина изменения сущности

Page 22: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

2 Предсказуемые раскладки

Page 23: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Системы позиционированияС высокой степенью самоорганизацииС низкой

23

Page 24: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Низкая степень самоорганизации<div style="position: absolute;"></div><div style="position: absolute;">! <div style="position: absolute;"></div></div>

24

Page 25: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

25

Page 26: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

26

Низкая степень самоорганизации+ Стабильность − Трудоёмкость

Page 27: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

27

Высокая степень самоорганизации<div>! <div style="float: right;"></div>! <span>...</span>! <div>! ! <span>...</span>! </div></div><div>! <span>...</span><span>...</span></div>

Page 28: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

28

Page 29: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

29

Высокая степень самоорганизации+ Простота использования+ Большие возможности

− Сложность поддержки− Непредсказуемость

Page 30: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Потоковая система позиционирования

Page 31: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

31

Создать Изменить Удалить Навсегда

Page 32: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Панель<div class="panel">! <button>Создать</button>! <button>Изменить</button>

! <button>Удалить</button>! <input type="checkbox">! <label>Навсегда</label></div>

32

Page 33: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

33

Входящие ▼ Переместить

Page 34: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

34

Компонент<div class="mover">! <select>! ! <option>Входящие</option>! ! <option>Исходящие</option>! ! ...! </select>! <button>Переместить</button></div>

Page 35: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

35

Создать Изменить Удалить НавсегдаВходящие ▼ Переместить

Page 36: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

36

Интеграция<div class="panel">! ...! <button>Изменить</button>! <div class="mover">! ...! </div>! <button>Удалить</button>! ...</div>

Page 37: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

37

Создать Изменить

Удалить Навсегда

Входящие ▼ Переместить

Page 38: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

38

Субъекты контекста являются объектами того же контекста и наоборот

Page 39: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Субъект создаёт контекст

Объект находится в контексте

39

Page 40: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

40

Создать Изменить Удалить НавсегдаВходящие ▼ Переместить

Page 41: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

41

Создать Изменить

Удалить Навсегда

Входящие ▼ Переместить

Page 42: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

42

Создать Изменить

Удалить Навсегда

Входящие ▼ Переместить

Page 43: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

РешениеРазделение субъекта и объекта контекста

43

Page 44: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

CSS3 Flexible Box Layout

Page 45: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Включение Flexbox.panel {! display: flex;}

45

Page 46: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

46

Создать Изменить Удалить НавсегдаВходящие ▼ Переместить

Page 47: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Направление.panel {! display: flex;! flex-direction: column; /** @default row */}

47

Page 48: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

48

Создать

Изменить

Удалить

Навсегда

Входящие ▼ Переместить

Page 49: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

49

Родитель контролирует поведение своих детей

Page 50: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Поддержка браузерами 70%

50caniuse.com

Page 51: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

.horizontal-box > * {! float: left;}

.vertical-box > * {! display: block;! width: auto;}

51

Альтернатива

Page 52: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Панель<div class="panel horizontal-box">! ...! <button>Изменить</button>! <div class="mover horizontal-box">! ...! </div>! <button>Удалить</button>! ...</div>

52

Page 53: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Сетки

Page 54: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

54

CSS сетки<div class="container-12">! <div class="grid-3"></div>! <div class="grid-3"></div>! <div class="grid-3"></div>! <div class="grid-3"></div></div>

Page 55: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

55

grid-3 grid-3 grid-3 grid-3

Page 56: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

56

−модуль<div class="container-12">! <div class="grid-3"></div>! <div class="grid-3"></div>! <div class="grid-3"></div>! <div class="grid-3"></div></div>

Page 57: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

57

grid-3 grid-3 grid-3

Page 58: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

58

РешениеНезависимость модулей

Page 59: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

CSS3 Grid Layout

Page 60: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

60

news content activity

Page 61: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

HTML<div class="layout">! <div class="news"></div>! <div class="content"></div>! <div class="activity"></div></div>

61

Page 62: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

CSS.layout {! display: grid;! grid-columns: (80px)[12];}

.news {! grid-column: 1;! grid-column-span: 3;}

.content {! grid-column: 4;! grid-column-span: 6;}

.activity {! grid-column: 10;! grid-column-span: 3;}

62

Page 63: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

–news<div class="layout">! <div class="news"></div>! <div class="content"></div>! <div class="activity"></div></div>

63

Page 64: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

64

content activity

Page 65: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

65

Поддержка браузерами?

Page 66: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

<div class="g-12">! <div class="g-col-1 g-span-3 news"></div>! <div class="g-col-3 g-span-6 content"></div>! <div class="g-col-10 g-span-3 activity"></div></div>

66

Альтернатива

anygrid.net

Page 67: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Родитель контролирует поведение своих детей

Элементы должны быть независимы друг от друга

67

Page 68: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

3 Явное наложение

Page 69: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

69

Page 70: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

70

z-index: 1

Page 71: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

71

z-index: 1

Page 72: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

72

z-index: 1

z-index: 1 z-index: 1

z-index: 1

Page 73: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)
Page 74: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Расслоение z-index по назначению

0...128...256

74

Решение?

}}контент

диалоги и попапы

Page 75: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Контекст наложенияКорневой элементСпозиционированный элемент c z-index ≠ autoЭлементы с opacity < 1

75

Page 76: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

z-index локален для каждого контекста наложения

76

Page 77: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

77

z-index: 128

z-index: 1 z-index: 1

z-index: 1

Page 78: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Явные слои и отказ от z-index

78

Решение

Page 79: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Явные слои<body>! <div class="layer" id="background-layer"></div>! <div class="layer" id="content-layer"></div>! <div class="layer" id="overlay-layer"></div>! <div class="layer" id="dialogs-layer"></div>! <div class="layer" id="popups-layer"></div></body>

79

Page 80: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

.layer {! position: relative;! z-index: 1;}

80

Слой

Page 81: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Минимальный наборКонтентДиалогиПопапы

81

Page 82: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Явное наложение элементов слоёв

Отказ от z-index как средства функционального наложения

82

Page 83: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

4 Абстрактная реализация

Page 84: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Абстракция

84

Абстракция определяет семантику сущности и позволяет работать с ней без знания деталей реализации

Page 85: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Олдскул кнопкаНикаких градиентовНикаких радиусовНикаких псевдоэлементовТолько картинки

85

Page 86: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Минимальная реализация<span class="button download-button">! Скачать! <span class="button-side"></span></span>

86

Page 87: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Минимальная реализация.button {! position: relative;!! display: inline-block;

! padding-left: 20px;}

.button-side {! position: absolute;! left: 100%;!! width: 20px;}

87

Page 88: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

88

Скачать

Page 89: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

89

Скачать Без SMS

Page 90: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Без SMS

90

Скачать

Page 91: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

91

Решение?.button {! position: relative;!! display: inline-block;!! margin-right: 20px;! padding-left: 20px;}

.button-side {! position: absolute;! left: 100%;!! width: 20px;}

Page 92: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

92

Скачать Без SMS

Page 93: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

93

Скачать Без SMS50px

Page 94: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

94

Решение?/** @note К любому margin-right надо прибавить 20! */.button {! position: relative;!! display: inline-block;!! margin-right: 20px;! padding-left: 20px;}

.download-button {! margin-right: 70px; /** 50 + 20 */}

Page 95: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Развитие реализации<span class="button download-button">! <span class="button-content">Скачать</span>! <span class="button-side"></span></span>

95

Page 96: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Развитие реализации.button {! display: inline-block;}

.button-content {! display: inline-block;!! padding-left: 20px;}

.button-side {! display: inline-block;!! width: 20px;}

96

Page 97: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

97

Скачать

Page 98: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

98

Скачать

50px50px

Page 99: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Избавление от отступов.button {! display: inline-block;}

.button-content {! display: inline-block;

! padding-left: 20px;}

.button-side {! display: inline-block;!! width: 20px;}

99

Page 100: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

100

Скачать

50px50px

Page 101: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

101

Решение<span class="button">! <span class="button-left"></span>! <span class="button-right"></span>! <span class="button-content">Скачать</span></span>

Page 102: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Решение.button {! position: relative;!! display: inline-block;}

.button-content {! position: relative;}

.button-left {! position: absolute;! left: 0;! right: 20px;}

.button-right {! position: absolute;! right: 0;!! width: 20px;} 102

Page 103: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

103

Скачать

50px50px

Page 104: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

104

Соответствие семантики и реализации

Реализация по подобию стандартных реализаций

Page 105: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)
Page 106: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)
Page 107: Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Яндекс)

Принципы разработки гибких и поддерживаемых интерфейсов

Вася Аксёнов@outring