Strings API
сделал Владимир Минкин
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Wire
Введение в Wire
КТО
Я
?
Владимир Минкин
Более 15 лет в производстве IT продуктов
КТО Я?
Программист и Технический руководитель
Для тех кто считает что -
работа говорит сама за себя
КТО Я?
План
-
Дизайн
-
Strings API
-
Flux
-
Wire
-
Примеры
Дизайн
A design is a plan or specification for the construction of an object or system.
Wikipedia
Дизайн
Зачем?
Что?
Когда?
Как?
Где?
Кто?
Это про ответы на вопросы
Дизайн
Architecture is not about making decisions earlier, but making decisions late.
Robert C. Martin
другое "общее" определение дизайна это - архитектура
Дизайн
Всё как plugin, какие то "black boxes"
- Минимум "связности"
- Dependencies injection
- Только ввод и вывод
в "идеальной" системе
Дизайн
Распределение данных
Система событий
(Finite State Machine)
многие программные системы используют в себе:
Signals
И эти две особенности можно описать как набор строк:
Data
- UPDATE_USER_NAME
- CREATE_TODO_ITEM
- MOVIE_SELECTED
- FILTERS_UPDATED
- SAVE_TO_FAVOURITE
- LOAD_NEXT_PAGE
- TURN_OFF_SOUND
- PURCHASE_PRODUCT
- ...
- USER_PROFILE
- MOVIE_BY_ID
- FILTER_CONDITIONS
- GAME_DATA
- UNITS_LIST
- TODO_BY_ID
- SOUND_SETTINGS
- CURRENT_LANGUAGE
- ...
Дизайн
Communication Layer
Data container Layer
ключ - значение
Пусть эти наборы будут храниться в слоях:
Дизайн
Strings API
-
Immutable
-
Value types
Strings это хорошие кандидаты для ключей в слоях
Strings API
UserVO getUserAccount: {
name : "Vladimir Minkin"
email : "vladimir.minkin@gmail.com"
}
.submitUserAccount({
payload (DTO)
})
(UI) компонент рассматривается с позиции данных
(через вызов функций)
получаем
выводим
Strings API
Набор
производимых сигналов
(или потребляемых)
каждый "Black Box" может быть описан как два набора строк:
Набор получаемых данных
Strings API
Data API:
USER_ACCOUNT
Singals API:
SUBMIT_USER_ACCOUNT
Методы можно заменять строковыми константами
Strings API
export default UserDataKeys: {
ACCOUNT: "UserAccount",
POSTS: "UserPosts",
}
export default UserSingals: {
SUBMIT_ACCOUNT: "AccountSubmit", CREATE_POST: "CreatePost", }
Функциональные части системы могут быть объединены:
Strings API
UserSingals.SUBMIT_ACCOUNT
Некоторые системные "Black Box" слушают и обрабатывают сигналы
{ Payload }
"процессоры" принимают решения при получении сигнала с данными.
Strings API
Независимые компоненты системы
Компоненты не знают о источнике своих данных или кто будет обрабатывать сигналы которые они производят
(реализация Component Driven Development)
Strings API
Компоненты могут быть
загружены динамически и
использовать наборы Strings API
системы
(или не использовать)
Компоненты получают данные с помощью Data API,
слушают и отправляют "сигналы" с Signals API
Communication Layer
Data container Layer
Strings API
FLUX
Flux is a pattern for managing data flow in application. The most important concept is that data flows in one direction.
FLUX
Концепция "хода изменения" в FLUX
FLUX
Что для этого нужно?
"Реакция" компонента
на изменение данных
компонент уже знает как получить данные
FLUX
Шаблон Observer в помощь
Обернем данные к контейнер, и будем изменять через него.
USER_ACCOUNT: "UserAccount"
value: {
name: ""
email: ""
}
- subscribe (params)
- unsubscribe (params)
- value (set / get )
FLUX
Observer - позволяет реализовать "обнонаправленное" изменение:
"UserAccount"
subscribe (callback)
Отправляет сигнал(ы)
знает как себя обновить
Обрабатывает сигнал(ы)
Обновляет данные
"блэк бокс"
Data API - Key:
другой "блэк бокс"
FLUX
В результате:
-
Обновления из одного источника
-
Явные обновления (или re-render)
-
Нет скрытых методов
-
Не зависит от языка прогр-ния
Wire
Реализация идеи Strings API в
communication и data-container слоях
Изначально написано на Dart.
Wire
-
Communication Layer - содержит "signals", строковые ключи ассоциированные со слушателями (в "скоупе").
- Data Container Layer - key-value in-memory map, где значения это экземпляры observer объекта.
Два статических слоя
Wire
API
// Signals API
Wire .add(scope, signal, listener)
bool .send(signal, {payload, scope})
bool .remove(signal, {scope, listener})
bool .has({signal, wire})
// Data API
WireData .data(key, [value])
Wire
Processors
(or Controllers)
-
слушают сигланы,
-
части business logic,
-
знают про "externals",
-
обновляют данные,
-
отправляют сигналы.
В такой системе различают два типа "сущностей":
Consumers
(or View)
-
потребляют данные,
-
подписываются на обновления,
-
обновляют свое состояние (local),
-
отправляют сигналы с "нагрузкой",
-
также могут слушать сигналы **.
Wire
Classical MVC - Active Models *
MVC in General
At the heart of MVC is what I call Separated Presentation...
- Martin Fowler
В основе идеи о "Раздельное представление":
- разделение между domain objects
- и презентацией объектов GUI
(которые моделируют наше восприятие реального мира)
(которые мы видим на экране).
- Martin Fowler
PureMVC
MVC is simple, there's no reason to keep changing it
- Mr. Cliff Hall автор PureMVC
Примеры
COUNTER
Примеры
COUNTER
Примеры
View
Примеры
Wire.send
Примеры
Wire.add
Примеры
Wire.data
Примеры
Wire.data
Примеры
TODO
Примеры
VIEW
Примеры
VIEW
Примеры
MAIN
Model
Примеры
CONTROLLER
Примеры
COMMAND
Примеры
TOGGLE
НУ ВОТ И ВСЁ
Спасибо!
"Строки" как API и Wire
By Vladimir Cores Minkin
"Строки" как API и Wire
- 191