Effect hangi sorunu çözüyor?
TypeScript’te bir kullanıcıyı getiren fonksiyonun tipi genelde şöyledir:
function getUser(id: string): Promise<User>
Tip sana sadece “bir kullanıcı gelecek” diyor. Oysa gerçekte ağ kopabilir, kullanıcı hiç olmayabilir, istek takılıp kalabilir. Bunların hiçbiri tipte görünmüyor. Derleyici bilmediği için seni de uyarmıyor.
Effect bu sözleşmeyi değiştiriyor. Fonksiyon bir Promise yerine üç bilgi taşıyan bir değer döndürüyor:
function getUser(id: string): Effect<User, NotFound | HttpError, never>
Sırasıyla: başarı (ne dönüyor), hata (ne ters gidebilir) ve gereksinim (çalışmak için neye ihtiyaç var, örneğin bir veritabanı bağlantısı). Buradaki never, hiçbir ek gereksinim olmadığı anlamına geliyor.
Hata tipi kodla birlikte değişiyor
İşin güzel tarafı, hata listesinin kod değiştikçe güncellenmesi. Videodaki örnekte getUser’a sırayla şunlar ekleniyor:
- Üç kez, giderek uzayan aralıklarla yeniden deneme (retry).
- İki saniyelik bir zaman aşımı (timeout).
catchTagileNotFoundhatasını yakalayıp yerine varsayılan bir değer döndürme.
Sonuçta NotFound hata listesinden kayboluyor, çünkü onu ele aldın. Ama listeye yeni bir zaman aşımı hatası ekleniyor, çünkü zaman aşımı koyunca böyle bir ihtimal doğdu. Yani tip, kodun o noktasında gerçekte ne olabileceğini anlatıyor.
Zod, ayrı bir retry kütüphanesi ve elle yazılmış zaman aşımıyla benzer şeyler yapılabilir. Fark şu: O araçlar birbirini tanımıyor. Effect hepsini tek bir modelde birleştirip tipleri baştan sona taşıyor.
4.0’da ne değişti?
30 Eylül’de çıkan 4.0, Effect ekibine göre baştan yazılmış bir sürüm. İşleri zamanlayan “fiber” çalışma zamanı da yenilendi. Ekibin kendi ölçümleri:
- En küçük paket boyutu: 35,6 kB’den 7,1 kB’ye (yaklaşık 5 kat küçük). Göç rehberi aynı şey için yaklaşık 6,3 kB diyor. Yani rakamlar ölçüm yöntemine göre biraz oynuyor.
- İş hacmi: Saniyede 0,71 milyon görevden 4,57 milyona (yaklaşık 6,4 kat).
- Bellek: 50.000 fiber için 157,5 MB’den 21,8 MB’ye.
Bunlar bağımsız testler değil, ekibin kendi rakamları.
Paket yapısı da sadeleşti. Eskiden ayrı olan @effect/platform, @effect/rpc, @effect/cluster gibi paketlerin işlevleri artık ana effect paketinin içinde. Kalan ek paketlerin hepsi aynı sürüm numarasını taşıyor ve birlikte yayımlanıyor. Çekirdek effect paketinin hiçbir çalışma zamanı bağımlılığı yok.
Kodunda göreceğin değişikliklerden bazıları:
Context.TagyerineContext.ServiceEffect.catchAllyerineEffect.catchEithermodülünün yeni adıResultRuntimetipi kaldırıldı
Bir not: Bir zamanlar rakip olan fp-ts kütüphanesi bir süre önce Effect’e katıldı. fp-ts’in kendi sayfası, Effect’i fp-ts’in üçüncü sürümü olarak görebileceğini söylüyor.
Dikkat edilecekler
- Her modül kararlı değil.
ai,cli,cluster,http,rpc,sqlgibi modüller “kararsız” olarak işaretli. Bunlar küçük sürümlerde de kırıcı değişiklik alabilir. Göç rehberi açıkça söylüyor: Ana pakete taşınmaları onları kararlı yapmadı. - Schema çok değişti. Kendi göç rehberi var.
- Otomatik dönüştürücü yok. Videoya göre resmî bir codemod çıkmadı. Ekibin önerisi, göç rehberini kodlama ajanına verip işin çoğunu ona yaptırmak.
- Uzun destek var. 4.x, en az Eylül 2029’a kadar hata düzeltmesi alacak.
Bir de eski bir eleştiri var: Effect bir yardımcı kütüphane gibi bir köşeye eklenmiyor. Ciddi kullandığında uygulamanı onun modeline göre yazmaya başlıyorsun. Videodaki geliştirici de küçük bir projede yarım yamalak kullanmaktansa hiç kullanmamayı öneriyor.
Effect’in yaratıcısı Michael Arnaldi’nin sıfır bağımlılık, ajanlar ve Effect Cluster üzerine anlattıklarını Syntax bölümü yazısında özetledik.
Düşün
- Kendi kodunda en çok hangi hatalar “sürpriz” çıkıyor? Bunlar tipte görünseydi ne değişirdi?
- Bir kütüphanenin projenin tamamını kendi modeline çekmesi, hangi durumda kabul edilebilir bir bedel?
Videoyu izle
Kaynaklar (7, İngilizce)
- Better Stack: Effect 4.0 Just Got a Lot Harder to Ignore (video) (yeni sekmede açılır)
- Effect Blog: Effect 4.0 release (yeni sekmede açılır)
- GitHub: Effect-TS/effect (yeni sekmede açılır)
- Effect: Migrating from v3 to v4 (MIGRATION.md) (yeni sekmede açılır)
- Effect: Error handling renames (v3 to v4) (yeni sekmede açılır)
- fp-ts README: fp-ts is joining the Effect-TS ecosystem (yeni sekmede açılır)
- npm: effect (yeni sekmede açılır)
Kendi cümlelerimizle yazılmış bir özettir, çeviri değildir. Tüm kaynaklar yukarıda.