Mind Your Business. And Its Logic

Post on 22-Jan-2018

148 Views

Category:

Software

1 Downloads

Preview:

Click to see full reader

Transcript

AND ITS LOGICMIND YOUR BUSINESS

Vladik Khononov Chief Architect @ Internovus

@vladikk

http://vladikk.com

BUSINESS LOGIC

PRESENTATION LAYER

BUSINESS LOGIC LAYER

DATA ACCESS LAYER

💵

PRESENTATION LAYER

BUSINESS LOGIC LAYER

DATA ACCESS LAYER

Transaction Script

Active Record

Domain Model

Event Sourced Domain Model

TRANSACTION SCRIPT

TRANSACTION SCRIPT

▸ Simple Business Logic

▸ CRUD

▸ Input Validation

▸ Extract Transform Load (ETL)

▸ Simple Data Structures

▸ Always leave the database in a consistent state

APPLICATIONCREATE USER UPDATE USER SEARCH USERS

DATABASE

UI

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;

}

}

}

ACTIVE RECORD

ACTIVE RECORD

▸ Simple Business Logic

▸ CRUD

▸ Input Validation

▸ Extract Transform Load (ETL)

▸ Complex Data Structures

▸ References / Collections

▸ Multiple Tables

USER INTERESTS

ID

NAME Hasmany

ADDRESSCOUNTRY CITY

STREET

APPLICATIONCREATE USER UPDATE USER SEARCH USERS

DATABASE

UI

APPLICATIONCREATE USER UPDATE USER SEARCH

USERS

UI

ACTIVE

RECORDSUSER

DATABASE

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;

}

}

}

public class User {

public Guid Id { get; set; }public string Name { get; set; }public List<Interest> Interests { get; set; }public Address Address { get; set; }

public void Save() { … }public void Delete() { … }public static User Get(Guid id) { … }public static List<User> GetAll() { … }

}

DOMAIN MODEL

DOMAIN MODEL

▸ Complex Business Logic

▸ Business rules

▸ Invariants

▸ Calculations

▸ Complex algorithms

APPLICATIONCREATE USER UPDATE USER SEARCH

USERS

UI

ACTIVE

RECORDSUSER

DATABASE

APPLICATIONCREATE USER UPDATE USER SEARCH USERS

UI

DOMAINMODEL

USER

DATABASE

APPLICATIONCREATE USER UPDATE USER SEARCH USERS

UI

DOMAINMODEL

USER

INFRASTRUCTURE

DOMAIN MODEL

▸ Complex business logic

▸ Model business domain

▸ Objects: data + behavior

▸ Plain objects

▸ Minimal application level use cases

public class UpdateUser {

public void Execute(userDetails) {

try {

var user = usersRepository.Get(userDetails.Id);user.UpdateDetails(userDetails);usersRepository.Save(user);

} catch {

DB.Rollback();throw;

}

}

}

public class User {

public Guid Id { get; private set; }public string Name { get; private set; }public List<Interest> 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);

}

APPLICATIONCREATE USER UPDATE USER SEARCH USERS

UI

DOMAINMODEL

USER

INFRASTRUCTURE

EVENT SOURCED DOMAIN MODEL

EVENT SOURCED DOMAIN MODEL

▸ Complex Business Logic

▸ Business rules

▸ Invariants

▸ Complex algorithms

▸ Deals w/ money

▸ Data analysis required

▸ Audit required by law

EVENT SOURCED DOMAIN MODEL

PhoneEmailNameId

46464543one@gmail.comJames1

34234343two@gmail.comJohn2

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; }

}

EVENT SOURCED DOMAIN MODEL

▸ UserInitialized(1, John, john@gmail.com)

▸ NameChanged(1, James)

▸ EmailChanged(1, james@gmail.com)

APPLICATIONCREATE USER UPDATE USER SEARCH USERS

UI

DOMAINMODEL

USER

EVENT STORE

Transaction Script

Active Record

Domain Model

Event Sourced Domain Model

APPLICATION ARCHITECTURE

LAYERED ARCHITECTURE

PRESENTATION LAYER

BUSINESS LOGIC LAYER

DATA ACCESS LAYER

HEXAGONAL / PORTS & ADAPTERS / ONION / CLEAN ARCHITECTURE

CORE

SERVICES

INFRASTRUCTURE

CQRS - COMMAND QUERY RESPONSIBILITY SEGREGATION

WRITE MODEL

COMMANDS

UI

READ MODEL

QUERIES

«SHLIKHTA» ARCHITECTURE

EVERYTHING

EVENT SOURCED DOMAIN MODEL

• Shlikhta Architecture

• Layered Architecture

• Hexagonal Architecture

• CQRS

• Transaction Script

• Active Record

• Domain Model

• Event Sourced Domain Model

TESTING STRATEGIES

TESTS PYRAMID

UI/

End to End

Service / APIlayer tests

Unit Tests

TESTS PYRAMID

UI/

End to End

Service / APIlayer tests

Unit Tests

TESTS PYRAMID

UI/

End to End

Service / APIlayer tests

Unit Tests

TESTS PYRAMID

UI/

End to End

Service / APIlayer tests

Unit Tests

TESTING STRATEGIES

• End to end tests

• API layer tests

• Unit tests

• Unit tests

• Transaction Script

• Active Record

• Domain Model

• Event Sourced Domain Model

LANGUAGE AND TECHNOLOGY

PROGRAMMING STYLE

• Procedural

• Procedural / OOP

• OOP

• Functional

• Transaction Script

• Active Record

• Domain Model

• Event Sourced Domain Model

DYNAMIC / STATIC TYPING

• Dynamic

• Dynamic

• Static

• Static

• Transaction Script

• Active Record

• Domain Model

• Event Sourced Domain Model

RAMIFICATIONS

▸ Architectural style / pattern

▸ Testing strategy

▸ Language and technology

▸ Programming style

▸ Language type

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? NoDomain Model

▸ Is advanced analysis required, or dealing w/ money? YesEvent Sourced Domain Model

TRANSACTION SCRIPT

ACTIVE RECORD

DOMAIN MODEL

EVENT SOURCED DOMAIN MODEL

AGILE ARCHITECTURE

TRANSACTION SCRIPT / SHLIKHTA

ACTIVE RECORD / LAYERS

DOMAIN MODEL / HEXAGONAL

EVENT SOURCED DOMAIN MODEL / CQRS

DECISION SCOPE

CAMPAIGN MANAGEMENT LEAD MANAGEMENT

CAMPAIGN MANAGEMENT

LEAD MANAGEMENT

CREATIVE CATALOG

CAMPAIGN PUBLISHING

BILLING

USERS MANAGEMENT

SALES

COMMISSIONS CALCULATION

DESK MANAGEMENT

VOIP MANAGEMENT

SUMMARY

Business Driven Architecture

QUESTIONS?

THANK YOU

Vladik Khononov Chief Architect @ Internovus

@vladikk

http://vladikk.com

top related