Alan modelleme — toplamalar, değişmezler ve hizmetler
Cart gibi toplamaları markalı kimliklerle modelleyin ve değişmezleri fabrikalar ile hizmetler aracılığıyla zorunlu kılın.
Alan modelleme — toplamalar, değişmezler ve hizmetler, CoddyKit'te ücretsiz bir TypeScript Academy dersidir. Bu, 3 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, TypeScript Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. TypeScript Academy kursu toplamda 3 dersten oluşur.
Giriş
Amaç: Markalı kimlikleri kullanarak bir Cart toplaması modelleyin ve miktar > 0 gibi kuralların fabrikalarda ve hizmetlerde uygulanmasını sağlayın.
- Markalı kimlikler varlık sınırlarını birbirinden ayırır
- Fabrikalar Sonuç birleşimleri döndürür
- Hizmet işlevleri geçersiz geçişlerden kaçınır
Varlıklar ve markalar
Markalı kimlikler, ikisi de dize olmasına rağmen CartId ile ProductId değerlerini uyumsuz kılar. Bu, karışıklıkları önler.
type Brand<Tag extends string, T> = T & { readonly __brand: Tag }
type CartId = Brand<"CartId", string>
type ProductId = Brand<"ProductId", string>
type Result<T> = { ok: true; value: T } | { ok: false; error: string }
const cartId = (s: string): CartId => s as CartId
const productId = (s: string): ProductId => s as ProductIdToplama ve değişmez
Fabrikalar kuralları doğrular: miktar > 0 olmalıdır. Yalnızca geçerli Line nesneleri oluşturulabilir.
type Money = number & { readonly __brand: "Money" }
const money = (n: number): Money => n as Money
interface Line { productId: ProductId; qty: number; price: Money }
interface Cart { id: CartId; lines: Line[]; total: Money }
function makeLine(productId: ProductId, qty: number, price: Money): Result<Line> {
if (!Number.isInteger(qty) || qty <= 0) return { ok: false, error: "qty must be > 0" }
return { ok: true, value: { productId, qty, price } }
}
function makeCart(id: CartId): Cart { return { id, lines: [], total: money(0) } }Hizmet: öğe ekleme
Hizmet işlevleri güvenli geçişler gerçekleştirir ve toplamları yeniden hesaplar. Toplamlar geçersizse işlev, durumu bozmak yerine hata döndürür.
function addItem(cart: Cart, line: Line): Result<Cart> {
const lines = [...cart.lines, line]
const totalNum = lines.reduce((s, x) => s + (x.qty * (x.price as number)), 0)
if (!Number.isFinite(totalNum) || totalNum < 0) return { ok: false, error: "invalid total" }
return { ok: true, value: { ...cart, lines, total: (totalNum as unknown) as Money } }
}
// Usage
const c0 = makeCart(cartId("c1"))
const l = makeLine(productId("p1"), 2, money(10))
const c1 = l.ok ? addItem(c0, l.value) : { ok: false, error: "bad line" }Sınır eşleme
Sınır noktalarında (ör. uygulama programlama arayüzlerinde) veri aktarım nesnelerine dönüştürün ve geri ayrıştırırken doğrulayın. Fabrikalar verilerin doğru olmasını sağlar.
type CartDTO = { id: string; lines: { productId: string; qty: number; price: number }[]; total: number }
function serialize(c: Cart): CartDTO {
return {
id: c.id as unknown as string,
lines: c.lines.map(x => ({ productId: x.productId as unknown as string, qty: x.qty, price: x.price as unknown as number })),
total: c.total as unknown as number
}
}
function parse(dto: CartDTO): Result<Cart> {
const id = cartId(dto.id)
const lines: Line[] = []
for (const raw of dto.lines) {
const l = makeLine(productId(raw.productId), raw.qty, money(raw.price))
if (!l.ok) return { ok: false, error: l.error }
lines.push(l.value)
}
const totalNum = lines.reduce((s, x) => s + (x.qty * (x.price as number)), 0)
return { ok: true, value: { id, lines, total: money(totalNum) } }
}İpuçları
En iyi uygulamalar:
- Doğrulamayı fabrikalarda merkezileştirin.
- Hizmet işlevlerini saf ve belirlenebilir tutun.
- Marka dönüşümlerini yalnızca sistem sınırlarında yapın.
Değişmez kontrolü
Hızlı kontrol: Miktar > 0 gibi bir değişmezi nasıl uygulamalısınız?
Özet
Özet: Markalı kimlikler, fabrikalar ve hizmetlerle birlikte değişmezleri uygular. Tüm giriş noktaları girdiyi doğruladığı için geçersiz durumlar oluşturulamaz.
Sıkça Sorulan Sorular
“Alan modelleme — toplamalar, değişmezler ve hizmetler” dersi ücretsiz mi?
Evet — “Alan modelleme — toplamalar, değişmezler ve hizmetler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve TypeScript Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. TypeScript Academy kursu toplamda 3 dersten oluşur.
“Alan modelleme — toplamalar, değişmezler ve hizmetler” dersinde ne öğreneceğim?
Cart gibi toplamaları markalı kimliklerle modelleyin ve değişmezleri fabrikalar ile hizmetler aracılığıyla zorunlu kılın. TypeScript Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
TypeScript Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te TypeScript Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 3 dersinin 3. dersidir.
“Alan modelleme — toplamalar, değişmezler ve hizmetler” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu TypeScript Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her TypeScript Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Birim karışıklığını önleyen markalı/opak türler
- Etiketli kimlikler ve alan modelleme kalıpları
- Alan modelleme — toplamalar, değişmezler ve hizmetler