0Pricing
TypeScript Academy · Ders

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 ProductId

Toplama 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

  1. Birim karışıklığını önleyen markalı/opak türler
  2. Etiketli kimlikler ve alan modelleme kalıpları
  3. Alan modelleme — toplamalar, değişmezler ve hizmetler
← TypeScript Academy Sayfasına Dön