mind your business. and its logic
TRANSCRIPT
AND ITS LOGICMIND YOUR BUSINESS
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
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, [email protected])
▸ NameChanged(1, James)
▸ EmailChanged(1, [email protected])
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