Александр Сычев "Разделяй и властвуй: CQRS в iOS"

53

Click here to load reader

Transcript of Александр Сычев "Разделяй и властвуй: CQRS в iOS"

Page 1: Александр Сычев "Разделяй и властвуй: CQRS в iOS"
Page 2: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Lead iOS developer

Александр Сычев

[email protected]

@asychev89

Page 3: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Collaboration and staleness

Page 4: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Page 5: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

😈

Page 6: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Consistency Availability

Partition tolerance

Page 7: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Consistency Availability

Partition tolerance

AP

Page 8: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Page 9: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Page 10: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Presentation layer

Data access layer

Data layer

Business logic layer

Page 11: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Presentation layer

Data access layer

Data layer

Business logic layer

SQL

Page 12: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Presentation layer

Data access layer

Data layer

Business logic layer

SQL

ManagedObject

Page 13: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Presentation layer

Data access layer

Data layer

Business logic layer

SQL

ManagedObject

PlainObject

Page 14: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Presentation layer

Data access layer

Data layer

Business logic layer

SQL

ManagedObject

PlainObject

ViewModel

Page 15: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Presentation layer

Data assess layer

Data layer

Business logic layer

SQL

ManagedObject

PlainObject

ViewModel

3

Page 16: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Presentation layer

Data access layer

Data layer

Business logic layer

ViewModel

ViewModel

ViewModel

ViewModel

Page 17: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

SELECT * FROM MyViewTable WHERE FolderID = INBOX

Page 18: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

SELECT * FROM MyViewTable WHERE FolderID = INBOX

In-memory

Page 19: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

In-memory In-memory

Page 20: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

key/value store key/value store

Page 21: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Queries and Commands

Page 22: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Command–query separation B. Meyer

Page 23: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

1. Queries

2. Commands

Page 24: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

class User { private(set) var email: String? func isValid(emailAddress: String?) -> Bool { let emailTest = NSPredicate() let isValid = emailTest.evaluate(with: emailAddress) if isValid { email = emailAddress // Command } return isValid // Query } }

Page 25: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

class User { private(set) var email: String? func isValid(emailAddress: String?) -> Bool { let emailTest = NSPredicate() let isValid = emailTest.evaluate(with: emailAddress) if isValid { email = emailAddress // Command } return isValid // Query } }

Page 26: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

class User { private(set) var email: String? func isValid(emailAddress: String?) -> Bool { let emailTest = NSPredicate() let isValid = emailTest.evaluate(with: emailAddress) if isValid { email = emailAddress // Command } return isValid // Query } }

Page 27: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

class User { private(set) var email: String? func isValid(emailAddress: String?) -> Bool { let emailTest = NSPredicate() return emailTest.evaluate(with: emailAddress) } func update(emailAddress: String?) { if isValid(emailAddress: emailAddress) { email = emailAddress } } }

Page 28: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Command Query Responsibility Segregation

Page 29: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Domain Model

Validation

O R M

Presentation

Page 30: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Domain Model

Validation

Query

Command

Query model

O R M

Page 31: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Command•Изменяет состояние системы

•Ничего не возвращает

•Описывает действия пользователей над системой

•Хранит нужные для её выполнения данные

Page 32: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Commandclass DeleteUserCommand: Command, DeleteUserContext { private var session: Session init(session: Session) { self.session = session } func execute(context: CommandContext) { session.delete(context) } }

Page 33: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Query

•Не изменяет состояние системы

•Хранит нужные для её выполнения данные

•Возвращает результат

Page 34: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Queryclass FindUserByIdQuery: Query { private var session: Session init(session: Session) { self.session = session } func ask(context: QueryContext) -> User { return session.query(context) } }

Page 35: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

MessageService- (void)createDraftMessageWithCompletion:(CompletionBlock)block;

- (void)sendMessage:(Message *)message;

- (Array<Message> *)messagesForFolder:(NSString *)folder;

- (void)obtainAttachment:(Attachment *)attachment completion:(ErrorBlock)block;

Page 36: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

MessageService- (void)createDraftMessageWithCompletion:(CompletionBlock)block;

- (void)sendMessage:(Message *)message;

- (Array<Message> *)messagesForFolder:(NSString *)folder;

- (void)obtainAttachment:(Attachment *)attachment completion:(ErrorBlock)block;

•- query•- command

Page 37: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

MessageService

•- query•- command

CreateMessageCommand

SendMessageCommand

ObtainMessagesInFolderQuery

ObtainAttachmentQuery

Page 38: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

CQRS•Меньше зависимостей в каждом классе

•Соблюдается SRP

•Проще изменять

•Проще тестировать

•Однотипный дизайн кода

Page 39: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Domain Model

Validation

Query

Command

Query model

O R M

w

r

Event Publisher

Page 40: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Event

struct Event { var name: String var payload: [String: AnyObject]? }

DidSendMessage DidCreateDraft

Page 41: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Occasionally Connected Clients

Page 42: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Page 43: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Conference

•Что пойдет не так, если сети нет?

•Как клиент обрабатывает отложенные события?

•Что стоит сделать при появлении сети?

Page 44: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Conference

•Пусть клиент продолжает работать

•Нужна очередь отложенных событий

•Синхронизировать данные и сообщить о конфликте

Page 45: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Domain Model

Validation

Query

Command

Query model

O R M

w

r

Event Publisher

Page 46: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Flux

Page 47: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Page 48: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Выводы

Page 49: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Недостатки

•Новый стиль мышления

•Сложность синхронизации

•Overengineering

Page 50: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Достоинства

•Высокая производительность чтения

•SRP

•Тестируемость

Page 51: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Достоинства

[email protected]

Page 52: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

Достоинства

•Высокая производительность чтения

•SRP

•Тестируемость

Page 53: Александр Сычев "Разделяй и властвуй: CQRS в iOS"

CQRS

[email protected]

@asychev89

Domain Model

Validation

Query

Command

Query model

w

r

Event

O R M