0Pricing
TypeScript Academy · Ders

Akıcı Sorgu DSL'si Tasarlama

Zincirlenebilir ve kendini doğrulayan bir sorgu API'si oluşturun.

Akıcı Sorgu DSL'si Tasarlama, CoddyKit'te ücretsiz bir TypeScript Academy dersidir. Bu, 4 dersinin 2. 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 4 dersten oluşur.

Akıcı Sorgu DSL'si Tasarlama

Her adımın dönüş türleri aracılığıyla izin verilen sonraki adımları daralttığı, zincirlenebilir bir sorgu DSL'si tasarlıyoruz. Sonuç SQL gibi okunur ve geçersiz sıralamalar derleme zamanında reddedilir.

Hedef Gramer

Şunu istiyoruz: from, ardından isteğe bağlı ve tekrarlanabilir where, sonra da sonlandırıcı select. from işleminden önce select kullanamaz ve from işlemini iki kez çağıramazsınız.

Durum Arayüzleri

Her aşamayı bir sonraki aşamayı döndüren bir arayüz olarak modelleyin.

interface Builder {
  from(table: string): FromStage;
}
interface FromStage {
  where(cond: string): FromStage; // repeatable
  select(...cols: string[]): Result;
}
interface Result { sql: string; }

Sırayı Zorunlu Kılma

select yalnızca FromStage üzerinde bulunduğundan, bunu başlangıçtaki Builder üzerinde çağırmak derleme hatasıdır. Sıra, tamamen her aşamanın kullanıma açtığı yöntemlerle zorunlu kılınır.

declare const db: Builder;
db.from("users").select("id"); // ok
db.select("id");               // Error: select missing on Builder

Seçilen Sütunları İzleme

Hangi sütunların seçildiğini hatırlamak için bir hayalet jenerik ekleyin; böylece sonuç türü kesin olur.

interface FromStage<T extends string = never> {
  where(c: string): FromStage<T>;
  select<C extends string>(...cols: C[]): Result<C>;
}
interface Result<C extends string> { columns: C[]; }

Her Çağrıyla Kısıtları Daraltma

Her where çağrısı, kısıtları tür içinde de biriktirebilir. Burada basit tutuyoruz, ancak bu örüntü bağlanmış parametreleri izlemek üzere genelleştirilebilir.

const q = db.from("users").where("age > 18").where("active = true");
// still FromStage; select remains available

from İşleminin Tekrarlanmasını Önleme

FromStage, from işlemini kullanıma açmadığından bunu iki kez çağıramazsınız. Gramer bunu yapısal olarak yasaklar; çalışma zamanı korumasına gerek yoktur.

db.from("a").from("b"); // Error: from does not exist on FromStage

Sonlandırıcı Adım

select, ne where ne de from işlemini kullanıma açan Result değerini döndürerek zinciri sonlandırır. Yalnızca sonuç okuma işlemleri kullanılabilir.

const r = db.from("users").select("id", "name");
r.columns; // ("id" | "name")[]
// r.where(...) -> Error: where not on Result

Tür Güvenli Sütun Kısıtları

Bilinmeyen sütunların reddedilmesi için sütunları başka bir jenerikle bilinen bir tablo şemasıyla kısıtlayın; böylece bu DSL'yi önceki ORM fikirleriyle birleştirin.

interface Table<Cols extends string> {
  select<C extends Cols>(...cols: C[]): Result<C>;
}
// db.from gives Table<"id" | "name" | "age">

İsteğe Bağlı ve Zorunlu Adımlar

Bir adımdan sonraki yöntemi yalnızca o adım tamamlandıktan sonra kullanıma açarak adımı zorunlu kılın. Örneğin, where çağrılana kadar select yöntemini göstermeyen bir aşama döndürerek en az bir where işlemi zorunlu tutun. Aynı zincirlenmiş türler, sorgunun yürütülmesiyle elde edilen sonuç satırı türünü de çıkarabilir; böylece derleme zamanı grameri çalışma zamanı verilerine bağlanır.

Bunun Önemi

Bu şekilde tasarlanan akıcı bir DSL kendi kendini belgeler ve yanlış kullanılmasına izin vermez: otomatik tamamlama yalnızca geçerli sonraki adımları gösterir ve yasa dışı sıralamalar hiçbir zaman derlenmez. Bu, kullanımı kolay oluşturucu kitaplıklarının temelidir.

Hızlı Kontrol

Akıcı DSL tasarımı konusundaki anlayışınızı doğrulayın.

Özet

Akıcı bir sorgu DSL'sini tür düzeyinde durum makinesi olarak tasarladınız: her aşama arayüzü bir sonrakini döndürür ve yalnızca geçerli yöntemleri kullanıma açar. Hayalet jenerikler seçilen sütunları izler, sonlandırıcı aşamalar zinciri bitirir ve sütun kısıtları bilinmeyen adları reddeder; bunların tümü dönüş türleriyle zorunlu kılınır.

Sıkça Sorulan Sorular

“Akıcı Sorgu DSL'si Tasarlama” dersi ücretsiz mi?

Evet — “Akıcı Sorgu DSL'si Tasarlama” 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 4 dersten oluşur.

“Akıcı Sorgu DSL'si Tasarlama” dersinde ne öğreneceğim?

Zincirlenebilir ve kendini doğrulayan bir sorgu API'si oluşturun. 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, 4 dersinin 2. dersidir.

“Akıcı Sorgu DSL'si Tasarlama” 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. Tür Düzeyi DSL Nedir?
  2. Akıcı Sorgu DSL'si Tasarlama
  3. Derleme Zamanında Girdi Doğrulama
  4. Tür Düzeyi DSL'lerde Hata Mesajları
← TypeScript Academy Sayfasına Dön