0Pricing
Scala for Backend Engineering & Functional Programming · Ders

Yeni Türler

Tür güvenli sarmalayıcılar

Yeni Türler, CoddyKit'te ücretsiz bir Scala for Backend Engineering & Functional Programming dersidir. Bu, 4 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, Scala for Backend Engineering & Functional Programming öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Scala for Backend Engineering & Functional Programming kursu toplamda 4 dersten oluşur.

Tür Güvenli Sarmalayıcılar

Yeni tür, tek bir temel değeri saran ayrı bir türdür. UserId ve ProductId gibi her ikisi de Int olan değerlerin karıştırılmasını önler.

case class UserId(value: Int)
case class ProductId(value: Int)

object Main:
  def main(args: Array[String]): Unit =
    val u = UserId(1)
    val p = ProductId(1)
    println(u.value == p.value) // values equal, types differ

İlkel Tür Saplantısı Sorunu

İlkel tür saplantısı, alan kavramları için String ve Int türlerinin aşırı kullanılmasıdır. Bu, ad beklenen yerde e-posta göndermek gibi anlamsız işlemlere izin verir. Yeni türler, her kavrama kendi türünü vererek bunu düzeltir.

case class Email(value: String)
case class City(value: String)

object Main:
  def greet(c: City): String = s"Welcome to ${c.value}"

  def main(args: Array[String]): Unit =
    println(greet(City("Berlin")))

Durum Sınıfı Yeni Türleri

En basit yeni tür, tek alanlı bir case class'tır. Hazır olarak eşitlik, okunabilir bir toString ve örüntü eşleştirme sağlar. Bedeli, her değer için bir nesne oluşturulmasıdır.

case class OrderId(value: String)

object Main:
  def main(args: Array[String]): Unit =
    val id = OrderId("ORD-42")
    println(id)
    println(id.value)

Opak Tür Yeni Türleri

Sıfır nesne oluşturma için yeni türü bir opak tür ile uygulayın. Çalışma zamanında temel tür gibi davranır, ancak derleme zamanında ondan ayrıdır.

object Ids:
  opaque type UserId = Int
  def apply(i: Int): UserId = i
  extension (u: UserId) def value: Int = u

object Main:
  def main(args: Array[String]): Unit =
    val u = Ids(7)
    println(u.value)

Uzantılarla Davranış Ekleme

Bir yeni türe işlemlerini extension yöntemleriyle verin ve yalnızca alan kavramı için anlamlı olanları açığa çıkarın.

object Money:
  opaque type Cents = Long
  def apply(n: Long): Cents = n
  extension (c: Cents)
    def +(o: Cents): Cents = c + o
    def toDollars: Double = c / 100.0

object Main:
  def main(args: Array[String]): Unit =
    val total = Money(250) + Money(750)
    println(total.toDollars)

İşlev İmzalarında Yeni Türler

Yeni türler imzaları kendini açıklayıcı hâle getirir ve bağımsız değişken sırası hatalarını derleme zamanında yakalar. Farklı yeni türlere sahip iki parametreyi yanlışlıkla yer değiştiremezsiniz.

case class Width(value: Int)
case class Height(value: Int)

object Main:
  def area(w: Width, h: Height): Int = w.value * h.value

  def main(args: Array[String]): Unit =
    println(area(Width(4), Height(5)))

Yeni Türler ve Koleksiyonlar

Yeni türle anahtarlanmış bir Map, ham Int ile anahtarlanmış bir Map'ten daha açık ve güvenlidir. Tür, yanlış anahtar türünün kullanılmasını önler.

case class UserId(value: Int)

object Main:
  def main(args: Array[String]): Unit =
    val names = Map(UserId(1) -> "Ada", UserId(2) -> "Bob")
    println(names(UserId(2)))

Doğrulanmış Yeni Türler

Yeni türü akıllı yapıcıyla birleştirerek sarmalayıcının da değişmez koşulları uygulamasını sağlayın. Burada bir NonEmptyString hiçbir zaman boş olamaz.

case class NonEmptyString private (value: String)
object NonEmptyString:
  def of(s: String): Option[NonEmptyString] =
    if s.nonEmpty then Some(NonEmptyString(s)) else None

object Main:
  def main(args: Array[String]): Unit =
    println(NonEmptyString.of("hi"))
    println(NonEmptyString.of(""))

Gösterim Seçme

İhtiyaçlarınıza göre seçim yapın.

  • case class: en kolay seçenektir, örüntü eşleştirmeye uygundur ve bir nesne oluşturur.
  • opaque type: sıfır maliyetlidir, kutulama yapmaz; sık kullanılan kod yolları ve büyük koleksiyonlar için idealdir.
object Temp:
  opaque type Kelvin = Double
  def apply(d: Double): Kelvin = d
  extension (k: Kelvin) def value: Double = k

object Main:
  def main(args: Array[String]): Unit =
    val readings = List(Temp(300.0), Temp(310.5))
    println(readings.map(_.value).sum)

Yanlışlıkla Dönüştürmeleri Önleme

Aynı temel tür üzerindeki iki yeni tür örtük olarak birbirine dönüşmez. Aralarında geçiş yapmak için amacı belgeleyen açık bir işlev yazmanız gerekir.

case class Meters(value: Double)
case class Feet(value: Double)

object Main:
  def toFeet(m: Meters): Feet = Feet(m.value * 3.281)

  def main(args: Array[String]): Unit =
    println(toFeet(Meters(2.0)))

Yeni Türler Ne Zaman Kullanılır

Bir ilkel tür alan anlamı taşıdığında yeni türleri tercih edin.

  • Tanımlayıcılar, birimler ve biçimlendirilmiş dizeler.
  • Basitlik için case class, performans için opaque type kullanın.
  • Değişmez koşullar varsa akıllı yapıcı ekleyin.
object Domain:
  opaque type Sku = String
  def of(s: String): Option[Sku] =
    if s.startsWith("SKU-") then Some(s) else None
  extension (k: Sku) def raw: String = k

object Main:
  def main(args: Array[String]): Unit =
    println(Domain.of("SKU-9").map(_.raw))

Kısa Kontrol

Yeni türleri ne kadar anladığınızı test edin.

Özet

Yeni türleri öğrendiniz.

  • Yeni türler, temel değerlerden birini ayrı bir tür içinde sarar.
  • İlkel tür saplantısını giderir ve bağımsız değişkenlerin karıştırılmasını önler.
  • Basitlik için case class, sıfır maliyet için opaque type kullanın.
  • Doğrulanmış sarmalayıcılar için akıllı yapıcı ekleyin.
  • Yeni türler arasındaki dönüşümler her zaman açıkça yapılır.
object Ids:
  opaque type AccountId = Long
  def apply(n: Long): AccountId = n
  extension (a: AccountId) def value: Long = a

object Main:
  def main(args: Array[String]): Unit =
    val acc = Ids(1001L)
    println(acc.value)

Sıkça Sorulan Sorular

“Yeni Türler” dersi ücretsiz mi?

Evet — “Yeni Türler” 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 Scala for Backend Engineering & Functional Programming kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Scala for Backend Engineering & Functional Programming kursu toplamda 4 dersten oluşur.

“Yeni Türler” dersinde ne öğreneceğim?

Tür güvenli sarmalayıcılar Scala for Backend Engineering & Functional Programming 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.

Scala for Backend Engineering & Functional Programming öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Scala for Backend Engineering & Functional Programming, 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 3. dersidir.

“Yeni Türler” 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 Scala for Backend Engineering & Functional Programming dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Scala for Backend Engineering & Functional Programming 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. ADT'lerle Modelleme
  2. Akıllı Oluşturucular
  3. Yeni Türler
  4. Alanları Birleştirme
← Scala for Backend Engineering & Functional Programming Sayfasına Dön