Domain-Driven Design (DDD)
Domain-Driven Design (DDD), Eric Evans tərəfindən 2003-cü ildə təqdim edilmiş proqram təminatı dizayn yanaşmasıdır. Bu yanaşma mürəkkəb proqram təminatının dizaynında domain mütəxəssislərinin biliyindən istifadə edərək, real biznes problemlərini həll etməyə yönəlmişdir.
DDD-nin Əsas Prinsipləri
1. Domain Focused
DDD, texniki detallar üzərində deyil, biznes domeni və onun qaydaları üzərində fokuslanır.
2. Domain Experts ilə Əməkdaşlıq
Proqramçılar və biznes mütəxəssisləri arasında sıx əməkdaşlıq vacibdir.
3. Model-Driven Design
Kod və domain modeli arasında sıx əlaqə olmalıdır.
DDD-nin Əsas Anlayışları
Domain (Domen)
Biznes probleminin həll edildiyi sahə. Məsələn, e-ticarət sistemində "Sifarişlər", "Ödənişlər", "Müştərilər" kimi domenlər ola bilər.
Domain Model
Domain-in strukturunu və davranışını təmsil edən konseptual model.
Ubiquitous Language
Domain mütəxəssisləri və proqramçıların eyni terminologiyadan istifadə etdiyi ortaq dil.
Bounded Context
Domain model-in tətbiq olunduğu məhdud kontekst. Hər Bounded Context daxilində Ubiquitous Language tutarlı olmalıdır.
Strategic Design
Context Mapping
Müxtəlif Bounded Context-lər arasındaki əlaqələri müəyyən etmək.
Context Map Nümunələri:
Partnership
İki komanda bir-birinin uğuru üçün məsuliyyət daşıyır.
Shared Kernel
İki kontekst arasında paylaşılan kod və ya model hissələri.
Customer/Supplier
Upstream kontekst downstream kontekstə xidmət göstərir.
Conformist
Downstream kontekst upstream kontekstə uyğunlaşır.
Anticorruption Layer
Xarici sistemlərdən gələn məlumatları öz domain modelinə çevirən qat.
Tactical Design
Entity
Unikal identity-si olan obyektlər.
class Customer {
constructor(customerId, name, email) {
this.customerId = customerId; // Identity
this.name = name;
this.email = email;
}
changeEmail(newEmail) {
if (this.isValidEmail(newEmail)) {
this.email = newEmail;
}
}
isValidEmail(email) {
// Email validation logic
return email.includes('@');
}
}
Value Object
Identity-si olmayan, yalnız dəyərləri ilə müəyyən olunan obyektlər.
class Money {
constructor(amount, currency) {
this.amount = amount;
this.currency = currency;
}
add(other) {
if (this.currency !== other.currency) {
throw new Error('Cannot add different currencies');
}
return new Money(this.amount + other.amount, this.currency);
}
equals(other) {
return this.amount === other.amount &&
this.currency === other.currency;
}
}
Aggregate
Bir qrup entity və value object-in birlikdə idarə edildiyi struktur.
Aggregate Root
Aggregate-ə xaricdən girişin tək nöqtəsi.
Repository
Aggregate-lərin saxlanması və əldə edilməsi üçün interfeys.
class OrderRepository {
async save(order) {
// Save order to database
}
async findById(orderId) {
// Find order by ID
}
async findByCustomerId(customerId) {
// Find orders by customer
}
}
Domain Service
Entity və ya Value Object-lərə aid olmayan biznes məntiqini saxlayan servislər.
class PricingService {
calculateDiscount(customer, order) {
if (customer.isVip()) {
return order.total.multiply(0.1);
}
return new Money(0, order.total.currency);
}
}
DDD və Mikroservislər
Bounded Context = Microservice
Hər Bounded Context ayrı mikroservis ola bilər.
Aggregate Boundaries
Mikroservis sərhədlərini müəyyən etməkdə köməkçi olur.
Event-Driven Communication
Domain Events vasitəsilə mikroservislər arasında kommunikasiya.
DDD Tətbiqi Addımları
1. Domain Kəşf etmək
- Biznes mütəxəssisləri ilə event storming sessiyaları
- Domain-i anlayış və təhlil etmək
- Əsas businessprocess-ləri müəyyən etmək
2. Ubiquitous Language Yaratmaq
- Terminologiyanı razılaşdırmaq
- Sözlük hazırlamaq
- Kod və sənədlərdə eyni dili istifadə etmək
3. Bounded Context-ləri Müəyyən etmək
- Context Map çəkmək
- Kontekst sərhədlərini təyin etmək
- Kontekstlər arası əlaqələri müəyyən etmək
4. Tactical Design Elements Tətbiq etmek
- Entity və Value Object-ləri modelləşdirmək
- Aggregate-ləri dizayn etmək
- Repository və Service-ləri yaratmaq
5. Arquitektur Qərarlar Vermək
- Hər bounded context üçün texnologiya seçimi
- Məlumat bazası strategiyası
- Komunikasiya protokolları
DDD-nin Faydaları
Biznes və Texniki Komandalar Arasında Körpü
- Ortaq dil və anlayış
- Daha yaxşı əməkdaşlıq
- Biznes ehtiyaclarına uyğun həllər
Mürəkkəbliyin İdarə Edilməsi
- Domain məntiqinin təşkili
- Kodun başa düşülən olması
- Texniki borcun azaldılması
Mikroservis Sərhədlərinin Müəyyən Edilməsi
- Natural service boundaries
- Düzgün məlumat modelləşdirilməsi
- Servis autonomiyası
Çətinliklər və Məhdudiyyətlər
Learning Curve
DDD konseptlərini öyrənmək vaxt tələb edir.
Over-Engineering Riski
Sadə problemlər üçün həddindən artıq mürəkkəb həllər.
Domain Expert Dependency
Domain mütəxəssislərinin daimi iştirakı tələb olunur.
Initial Investment
Başlanğıcda daha çox vaxt və səy tələb edir.
Praktiki Tövsiyələr
1. Kiçik Başlamaq
Sadə domain-dən başlayaraq təcrübə qazanmaq.
2. Event Storming İstifadə Etmək
Domain-i kəşf etmək üçün fəal üsullar tətbiq etmək.
3. Ubiquitous Language-i Sənədləşdirmek
Terminologiyanı yazılı şəkildə saxlamaq.
4. Context Map-ləri Yeniləmek
Sistem inkişaf etdikcə context sərhədlərini yeniləmək.
5. Domain Logic-i Qorumaq
Domain məntiqini infrastructure layer-dən ayrı saxlamaq.
Nəticə
Domain-Driven Design mikroservis arxitekturasında çox faydalı yanaşmadır. Bu, biznes domeninin dəqiq modelləşdirilməsi və mikroservis sərhədlərinin düzgün müəyyən edilməsi imkanı verir. DDD-nin düzgün tətbiqi sistemin uzunmüddətli inkişafı və saxlanması üçün möhkəm baza yaradır.