CodeBlanks Logo Icon CodeBlanks

State Encoding

Phantom ile durum makinelerini öğrenirsin.

State encoding

Phantom türler, bir durum makinesinin aşamalarını türe kodlamak için kullanılabilir. Her durum kendi phantom argümanıyla temsil edilir; geçiş fonksiyonları yalnızca doğru durumdaki değerleri kabul eder. Böylece geçersiz geçişler derleme hatası olur.

type Order<S> = { amount: number };

type Pending = Order<"pending">;
type Paid = Order<"paid">;
type Shipped = Order<"shipped">;

function pay(o: Pending): Paid { return o; }
function ship(o: Paid): Shipped { return o; }

Geçiş fonksiyonları

Geçiş fonksiyonları giriş ve çıkış türlerini phantom argümanlarla ayırır; örneğin pay fonksiyonu Order<"pending"> alır ve Order<"paid"> döndürür. Bu, fonksiyonun yalnızca doğru sıradaki çağrılabilmesini sağlar.

const p: Pending = { amount: 10 };
const paid = pay(p);        // Pending -> Paid
const shipped = ship(paid); // Paid -> Shipped

const bad = ship(p);  // hata: Pending, Paid değil

Uygulama State encoding ile sipariş akışı

Order<S> generic türünü tanımla (gövde amount: number). Pending, Paid, Shipped türlerini phantom argümanlarla oluştur. pay(o: Pending): Paid ve ship(o: Paid): Shipped fonksiyonlarını yaz. Bir Pending değerinden başla, pay ve ship ile akışı uygula, sonucun amount değerini console.log ile yazdır.

Başlangıç kodu

index.ts
// Order<S> generic türünü tanımla (S gövdede kullanılmasın)

// Pending, Paid, Shipped türlerini phantom argümanlarla oluştur

// pay ve ship geçiş fonksiyonlarını yaz

// Pending değerinden başla, pay ve ship uygula, sonucu yazdır

Örnek çözüm

index.ts
type Order<S> = { amount: number };

type Pending = Order<"pending">;
type Paid = Order<"paid">;
type Shipped = Order<"shipped">;

function pay(o: Pending): Paid {
  return o;
}

function ship(o: Paid): Shipped {
  return o;
}

const p: Pending = { amount: 10 };
const shipped = ship(pay(p));

console.log(shipped.amount);

Beklenen çıktı

10

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Phantom ile state encoding'in temel avantajı nedir?

  • Çalışma zamanında durum kontrolü yapılması
  • Daha hızlı kod yürütme
  • Daha az bellek kullanımı
  • Geçersiz durum geçişlerinin derleme zamanında yakalanması Doğru cevap

Açıklama: Phantom ile her durum ayrı bir tür olduğu için yanlış sıradaki geçişler (örneğin Pending'i ship etmek) derleme hatası verir; runtime kontrolüne gerek kalmaz.

2 Geçiş fonksiyonu imzası

Soru
type Order<S> = { amount: number };
type Pending = Order<"pending">;
type Paid = Order<"paid">;

function pay(o: Pending): ____ { return o; }
Cevap
type Order<S> = { amount: number };
type Pending = Order<"pending">;
type Paid = Order<"paid">;

function pay(o: Pending): Paid { return o; }

Açıklama: pay fonksiyonu Pending alır ve Paid döndürür; bu, durum geçişini tür düzeyinde zorlar ve yanlış sırayı engeller.

3 State encoding parçaları

Kavram Anlamı
Pending durumu ödenmemiş sipariş
Paid durumu ödenmiş sipariş
pay fonksiyonu Pending alır Paid döndürür
ship(p) çağrısı derleme hatası (yanlış durum)

İleri seviye bölümündeki tüm dersler