Flutter Dev Talk
#ARCH-11 Architecture Learning — Mapper, Domain Invariant & Business Rule
Payment flow’da API’dan kelgan ma’lumotni Domain Model’ga aylantirish faqat fieldlarni ko‘chirish emas.
Muhim savol:
Tashqi tizimdan kelgan ma’lumotga qachondan boshlab ishonishimiz mumkin?
Masalan, Payment API quyidagicha response qaytardi:
{
"bill_id": "12345",
"amount": -100000,
"commission": 1500,
"status": "CREATED"
}
Bu yerda uchta tushunchani ajratishimiz kerak.
1️⃣ Mapper — Data’ni tarjima qilish
PaymentStatus mapStatus(String status) {
return switch (status) {
'CREATED' => PaymentStatus.created,
'PAID' => PaymentStatus.paid,
'EXPIRED' => PaymentStatus.expired,
_ => throw FormatException('Unknown status'),
};
}
Mapper API representation’ni application tushunadigan formatga aylantiradi.
2️⃣ Domain Invariant — Model doim valid bo‘lishi kerak
class Payment {
Payment({
required this.amount,
required this.commission,
}) {
if (amount <= 0 || commission < 0) {
throw ArgumentError('Invalid payment');
}
}
// Summalar eng kichik pul birligida
final int amount;
final int commission;
int get total => amount + commission;
}
Invariant — model mavjud bo‘lishi uchun bajarilishi shart bo‘lgan qoida.
Masalan, bizning taxminiy talabimizda:
- amount > 0
- commission >= 0
-
Bu shartlar buzilsa, valid Payment yaratib bo‘lmaydi.
3️⃣ Business Rule — Payment qilish mumkinmi?
bool canPay({
required Payment payment,
required int balance,
}) {
return balance >= payment.total;
}
Payment modeli valid bo‘lishi uning to‘lanishi mumkinligini anglatmaydi.
Masalan:
Amount: 100 000
Commission: 1 500
Total: 101 500
Balance: 100 000
Payment valid, lekin balans yetarli emas.
Flow:
Payment API
↓
PaymentDto
↓
Mapper → API data validmi?
↓
Payment Model → Invariant bajarilganmi?
↓
Business Rule → Payment qilish mumkinmi?
↓
Application → Payment flow
💡 Senior yondashuvi
Mapper tashqi data’ni tarjima qiladi. Domain Model o‘z invariantlarini himoya qiladi. Business Rule esa operation bajarilishiga ruxsat borligini aniqlaydi.
Biroq client’dagi canPay tekshiruvi serverning yakuniy validation’ini almashtirmaydi. Balans yoki payment status tekshiruvdan keyin o‘zgarishi mumkin.
🎯 Asosiy xulosa:
Valid Payment ≠ Payable Payment
Model valid bo‘lishi boshqa, shu model bilan payment operation bajarishga ruxsat bo‘lishi boshqa masala.
Architecture’da muhim narsa har bir `if`ni alohida layer’ga chiqarish emas, balki har bir qoida uchun to‘g‘ri owner tanlashdir.
@flutterDevTalk
113 ·