Slide 1

Slide 1 text

AND ITS LOGIC MIND YOUR BUSINESS

Slide 2

Slide 2 text

Vladik Khononov Chief Architect @ Internovus @vladikk http://vladikk.com

Slide 3

Slide 3 text

BUSINESS LOGIC

Slide 4

Slide 4 text

PRESENTATION LAYER BUSINESS LOGIC LAYER DATA ACCESS LAYER

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

PRESENTATION LAYER BUSINESS LOGIC LAYER DATA ACCESS LAYER

Slide 7

Slide 7 text

Transaction Script Active Record Domain Model Event Sourced Domain Model

Slide 8

Slide 8 text

TRANSACTION SCRIPT

Slide 9

Slide 9 text

TRANSACTION SCRIPT ▸ Simple Business Logic ▸ CRUD ▸ Input Validation ▸ Extract Transform Load (ETL) ▸ Simple Data Structures ▸ Always leave the database in a consistent state

Slide 10

Slide 10 text


 APPLICATION CREATE USER UPDATE USER SEARCH USERS DATABASE UI

Slide 11

Slide 11 text

public class CreateUser { public void Execute(name, email) { try { DB.StartTransaction();
 var row = DB.NewUserRow();
 row.Name = name;
 row.Email = email;
 DB.Append(row);
 DB.Commit(); } catch { DB.Rollback();
 throw; } } }

Slide 12

Slide 12 text

ACTIVE RECORD

Slide 13

Slide 13 text

ACTIVE RECORD ▸ Simple Business Logic ▸ CRUD ▸ Input Validation ▸ Extract Transform Load (ETL) ▸ Complex Data Structures ▸ References / Collections ▸ Multiple Tables

Slide 14

Slide 14 text

USER INTERESTS ID NAME Has
 many ADDRESS COUNTRY CITY STREET

Slide 15

Slide 15 text


 APPLICATION CREATE USER UPDATE USER SEARCH USERS DATABASE UI

Slide 16

Slide 16 text


 APPLICATION CREATE USER UPDATE USER SEARCH USERS UI 
 ACTIVE
 RECORDS USER DATABASE

Slide 17

Slide 17 text

public class CreateUser { public void Execute(userDetails) { try { DB.StartTransaction();
 
 var user = new User();
 user.Name = userDetails.Name;
 user.Email = userDetails.Email;
 user.Save();
 
 DB.Commit(); } catch { DB.Rollback();
 throw; } } }

Slide 18

Slide 18 text

public class User { public Guid Id { get; set; }
 public string Name { get; set; }
 public List Interests { get; set; }
 public Address Address { get; set; } public void Save() { … }
 public void Delete() { … }
 public static User Get(Guid id) { … }
 public static List GetAll() { … } }

Slide 19

Slide 19 text

DOMAIN MODEL

Slide 20

Slide 20 text

DOMAIN MODEL ▸ Complex Business Logic ▸ Business rules ▸ Invariants ▸ Calculations ▸ Complex algorithms

Slide 21

Slide 21 text


 APPLICATION CREATE USER UPDATE USER SEARCH USERS UI 
 ACTIVE
 RECORDS USER DATABASE

Slide 22

Slide 22 text


 APPLICATION CREATE USER UPDATE USER SEARCH USERS UI 
 DOMAIN
 MODEL USER DATABASE

Slide 23

Slide 23 text


 APPLICATION CREATE USER UPDATE USER SEARCH USERS UI 
 DOMAIN
 MODEL USER INFRASTRUCTURE

Slide 24

Slide 24 text

DOMAIN MODEL ▸ Complex business logic ▸ Model business domain ▸ Objects: data + behavior ▸ Plain objects ▸ Minimal application level use cases

Slide 25

Slide 25 text

public class UpdateUser { public void Execute(userDetails) { try { var user = usersRepository.Get(userDetails.Id);
 user.UpdateDetails(userDetails);
 usersRepository.Save(user); } catch { DB.Rollback();
 throw; } } }

Slide 26

Slide 26 text

public class User { public Guid Id { get; private set; }
 public string Name { get; private set; }
 public List Interests { get; private set; }
 public Address Address { get; private set; } public void UpdateDetails() { … }
 public void AddInterest() { … }
 public static User InitializeNew() { … } } public interface IUsersRepository { User Get(Guid id);
 void Save(User user);
 void Delete(User user); }

Slide 27

Slide 27 text


 APPLICATION CREATE USER UPDATE USER SEARCH USERS UI 
 DOMAIN
 MODEL USER INFRASTRUCTURE

Slide 28

Slide 28 text

EVENT SOURCED
 DOMAIN MODEL

Slide 29

Slide 29 text

EVENT SOURCED DOMAIN MODEL ▸ Complex Business Logic ▸ Business rules ▸ Invariants ▸ Complex algorithms ▸ Deals w/ money ▸ Data analysis required ▸ Audit required by law

Slide 30

Slide 30 text

EVENT SOURCED DOMAIN MODEL Phone Email Name Id 46464543 [email protected] James 1 34234343 [email protected] John 2

Slide 31

Slide 31 text

public class NewUserInitialized { public Guid UserId { get; private set; }
 public string Name { get; private set; }
 public string Email { get; private set; } } public class NameChanged { public Guid UserId { get; private set; }
 public string NewName { get; private set; } } public class EmailChanged { public Guid UserId { get; private set; }
 public string NewEmail { get; private set; } }

Slide 32

Slide 32 text

EVENT SOURCED DOMAIN MODEL ▸ UserInitialized(1, John, [email protected]) ▸ NameChanged(1, James) ▸ EmailChanged(1, [email protected])

Slide 33

Slide 33 text


 APPLICATION CREATE USER UPDATE USER SEARCH USERS UI 
 DOMAIN
 MODEL USER EVENT STORE

Slide 34

Slide 34 text

Transaction Script Active Record Domain Model Event Sourced Domain Model

Slide 35

Slide 35 text

APPLICATION ARCHITECTURE

Slide 36

Slide 36 text

LAYERED ARCHITECTURE PRESENTATION LAYER BUSINESS LOGIC LAYER DATA ACCESS LAYER

Slide 37

Slide 37 text

HEXAGONAL / PORTS & ADAPTERS / ONION / CLEAN ARCHITECTURE CORE SERVICES INFRASTRUCTURE

Slide 38

Slide 38 text

CQRS - COMMAND QUERY RESPONSIBILITY SEGREGATION WRITE MODEL COMMANDS UI READ MODEL QUERIES

Slide 39

Slide 39 text

«SHLIKHTA» ARCHITECTURE EVERYTHING

Slide 40

Slide 40 text

EVENT SOURCED DOMAIN MODEL • Shlikhta Architecture • Layered Architecture • Hexagonal Architecture • CQRS • Transaction Script • Active Record • Domain Model • Event Sourced Domain Model

Slide 41

Slide 41 text

TESTING STRATEGIES

Slide 42

Slide 42 text

TESTS PYRAMID UI
 /
 End to End Service / API
 layer tests Unit Tests

Slide 43

Slide 43 text

TESTS PYRAMID UI
 /
 End to End Service / API
 layer tests Unit Tests

Slide 44

Slide 44 text

TESTS PYRAMID UI
 /
 End to End Service / API
 layer tests Unit Tests

Slide 45

Slide 45 text

TESTS PYRAMID UI
 /
 End to End Service / API
 layer tests Unit Tests

Slide 46

Slide 46 text

TESTING STRATEGIES • End to end tests • API layer tests • Unit tests • Unit tests • Transaction Script • Active Record • Domain Model • Event Sourced Domain Model

Slide 47

Slide 47 text

LANGUAGE AND TECHNOLOGY

Slide 48

Slide 48 text

PROGRAMMING STYLE • Procedural • Procedural / OOP • OOP • Functional • Transaction Script • Active Record • Domain Model • Event Sourced Domain Model

Slide 49

Slide 49 text

DYNAMIC / STATIC TYPING • Dynamic • Dynamic • Static • Static • Transaction Script • Active Record • Domain Model • Event Sourced Domain Model

Slide 50

Slide 50 text

RAMIFICATIONS ▸ Architectural style / pattern ▸ Testing strategy ▸ Language and technology ▸ Programming style ▸ Language type

Slide 51

Slide 51 text

DECISION HEURISTIC ▸ Is the business logic mostly CRUD / ETL? Yes ▸ Are the data structures simple? yes - Transaction Script ▸ Are the data structures simple? No -Active Record ▸ Is the business logic mostly CRUD / ETL? No ▸ Is advanced analysis required, or dealing w/ money? No
 Domain Model ▸ Is advanced analysis required, or dealing w/ money? Yes
 Event Sourced Domain Model

Slide 52

Slide 52 text

TRANSACTION SCRIPT ACTIVE RECORD DOMAIN MODEL EVENT SOURCED DOMAIN MODEL

Slide 53

Slide 53 text

AGILE ARCHITECTURE

Slide 54

Slide 54 text

TRANSACTION SCRIPT / SHLIKHTA ACTIVE RECORD / LAYERS DOMAIN MODEL / HEXAGONAL EVENT SOURCED DOMAIN MODEL / CQRS

Slide 55

Slide 55 text

DECISION SCOPE

Slide 56

Slide 56 text

CAMPAIGN MANAGEMENT LEAD MANAGEMENT

Slide 57

Slide 57 text


 CAMPAIGN MANAGEMENT 
 LEAD MANAGEMENT CREATIVE CATALOG CAMPAIGN PUBLISHING BILLING USERS MANAGEMENT SALES COMMISSIONS CALCULATION DESK MANAGEMENT VOIP MANAGEMENT

Slide 58

Slide 58 text

SUMMARY

Slide 59

Slide 59 text

Business Driven Architecture

Slide 60

Slide 60 text

No content

Slide 61

Slide 61 text

QUESTIONS?

Slide 62

Slide 62 text

THANK YOU Vladik Khononov Chief Architect @ Internovus @vladikk http://vladikk.com