Kotlin Academy · Ders

Arrow'un Temel Türleriyle İşlevsel Alan Modellemesi

Karmaşık alanları Either, NonEmptyList ve doğrulanmış hata biriktirme kullanarak modelleyin.

4. ders / 413 adım

Arrow'un Temel Türleriyle İşlevsel Alan Modellemesi, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 4. 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, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.

İşlevsel Alan Modelleme Nedir

İşlevsel alan modelleme, iş kurallarını türlerle ifade etmek için cebirsel türleri (Either, Option, mühürlü sınıflar) kullanır. Geçersiz durumlar derleme zamanında ifade edilemez hâle gelir ve hatalar işlev imzalarında açıkça belirtilir; gizli istisnalar yoktur.

Satır İçi ve Değer Sınıflarıyla Değer Nesneleri

İlkel türlere anlam kazandırmak ve ilkel tür takıntısını önlemek için Kotlin değer sınıflarını kullanın. Tür sistemi, PostId beklenen yerde UserId geçirilmesini reddeder:

@JvmInline value class UserId(val value: Long)
@JvmInline value class PostId(val value: Long)

fun findUser(id: UserId): Either<UserError, User> = TODO()
// findUser(PostId(1L))  // Compile error!

Alan Hataları İçin Mühürlü Sınıflar

Hataları mühürlü sınıf hiyerarşileri olarak modelleyin. Her alt sınıf yalnızca ilgili hata durumuyla ilişkili verileri taşır:

sealed class UserError {
    data class NotFound(val id: UserId) : UserError()
    data class EmailTaken(val email: String) : UserError()
    data class ValidationFailed(val field: String, val reason: String) : UserError()
}

Validated: Birden Çok Hatayı Biriktirme

Yalnızca ilk hatayı değil, tüm doğrulama hatalarını tek seferde bildirmek istediğinizde Arrow'un Validated türünü (veya Raise DSL'deki zipOrAccumulate işlecini) kullanın. Hataları bir NonEmptyList içinde biriktirir:

import arrow.core.Validated
import arrow.core.valid
import arrow.core.invalid

fun validateName(name: String): Validated<String, String> =
    if (name.isNotBlank()) name.valid() else "Name is blank".invalid()

Doğrulamaları Birleştirme

Birden çok Validated sonucunu birleştirmek için zip() kullanın. Bunlardan biri Invalid ise tüm hatalar biriktirilir:

val result: Validated<NonEmptyList<String>, User> =
    validateName(name).zip(validateEmail(email)) { n, e -> User(n, e) }
        .mapLeft { it }

Geçersiz Durumların İfade Edilememesini Sağlama

Boş değer içerebilen bir email alanına ve isVerified bayrağına sahip bir User kullanmak yerine, tür sisteminin doğrulanmamış bir kullanıcının e-postasına erişilmesini engellemesi için mühürlü alt sınıflar kullanın:

sealed class User {
    data class Unverified(val id: UserId, val pendingEmail: String) : User()
    data class Verified(val id: UserId, val email: String) : User()
}

Akıllı Kurucular

Herkese açık kurucular yerine Either veya Option döndüren eşlik eden nesne fabrika işlevlerini kullanın. Böylece örneklerin her zaman geçerli durumda olması sağlanır:

class Email private constructor(val value: String) {
    companion object {
        fun of(raw: String): Either<String, Email> =
            if (raw.contains("@") && raw.length <= 255) Email(raw).right()
            else "Invalid email format".left()
    }
}

Ya-Hep-Ya-Hiç ve Seçenek Türlerini İşlem Hattında Birleştirme

Gerçek bir alan işlemi genellikle depo aramalarını (Option) doğrulamalarla (Either) zincirler. Bunları akıcı biçimde birleştirmek için Arrow'un either { } bloğunu ve .bind() işlecini kullanın:

fun createPost(authorId: UserId, title: String, body: String): Either<PostError, Post> = either {
    val author = userRepo.findById(authorId).toEither { PostError.AuthorNotFound }.bind()
    val validTitle = validateTitle(title).bind()
    postRepo.save(Post(author, validTitle, body))
}

Değişmezlik ve Kopyalama

Alan varlıkları değişmez olmalıdır. Yeni durumlar türetmek için veri sınıflarını ve copy() işlevini kullanın. Arrow'un arrow-optics içindeki Lens yapısı, değişiklik yapmadan iç içe geçmiş alanları pratik biçimde güncellemenizi sağlar:

val updated = user.copy(email = "new@example.com")
// Arrow Optics:
val emailLens = User.email
val updatedWithLens = emailLens.set(user, "new@example.com")

Mühürlü Sınıflarla Tür Güvenli Yapılandırma

Derleyicinin her durumu ele almanızı zorunlu kılması için uygulama yapılandırmasının çeşitlerini mühürlü sınıflarla modelleyin:

sealed class DbConfig {
    data class Postgres(val url: String, val user: String, val pass: String) : DbConfig()
    data class InMemory(val dbName: String = "test") : DbConfig()
}

Faydalara Genel Bakış

Arrow'un temel türleriyle işlevsel alan modelleme şunları sağlar:

  • Alan kodunda boş işaretçi istisnası oluşmaması
  • Hataların işlev imzalarında görünür olması
  • Mühürlü hiyerarşiler üzerinde kapsamlı when denetimleri
  • Test edilebilir saf işlevler
  • Kendini belgeleyen kod

Kısa Kontrol

Alan hataları için istisna fırlatmak yerine bir sealed class hiyerarşisi kullanmanın başlıca yararı nedir?

Özet: Arrow'un Temel Türleriyle İşlevsel Alan Modelleme

Temel çıkarımlar:

  • Değer sınıfları ilkel tür takıntısını önler
  • Mühürlü hata hiyerarşileri hata durumlarının eksiksiz ve tür güvenli biçimde ele alınmasını sağlar
  • Akıllı kurucular geçerli örnekleri garanti eder
  • either { }.bind(), hata verebilen işlemleri temiz biçimde birleştirir
  • Değişmez veriler + güvenli durum geçişleri için copy() / Arrow Optics
Başlamak ücretsiz

Yapay zeka eğitmeniyle Kotlin öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
51
Dersler
203

Sıkça Sorulan Sorular

“Arrow'un Temel Türleriyle İşlevsel Alan Modellemesi” dersi ücretsiz mi?

Evet — “Arrow'un Temel Türleriyle İşlevsel Alan Modellemesi” 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 Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.

“Arrow'un Temel Türleriyle İşlevsel Alan Modellemesi” dersinde ne öğreneceğim?

Karmaşık alanları Either, NonEmptyList ve doğrulanmış hata biriktirme kullanarak modelleyin. Kotlin 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.

Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Kotlin 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 4. dersidir.

“Arrow'un Temel Türleriyle İşlevsel Alan Modellemesi” 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 Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Kotlin 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. Either : İstisnasız Türlendirilmiş Hata İşleme
  2. Arrow Raise DSL: Türü Belirlenmiş Hataları Birleştirme
  3. Option ve Nullable: Hangisi Ne Zaman Kullanılır
  4. Arrow'un Temel Türleriyle İşlevsel Alan Modellemesi
← Kotlin Academy Sayfasına Dön