0Pricing
Scala for Backend Engineering & Functional Programming · Ders

Tür Sınıfları ve Örtükler

Özel amaçlı çok biçimlilik için tür sınıflarını kullanmayı ve güçlü soyutlamalar için Scala'nın örtük sisteminden yararlanmayı öğrenin.

Tür Sınıfları ve Örtükler, CoddyKit'te ücretsiz bir Scala for Backend Engineering & Functional Programming dersidir. Bu, 3 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 3 dersten oluşur.

Özel Polimorfizmi Açıklama

Scala'da polimorfizm, farklı türlerle çalışan kod yazmak anlamına gelir. Bir yöntemin temel sınıf ve tüm alt sınıflarıyla çalıştığı kalıtım üzerinden alt tür polimorfizmini gördünüz.

Özel polimorfizm farklıdır. Tek bir işlevin, kalıtım yoluyla ilişkili olmasalar bile kendisine verilen belirli türe göre farklı davranmasını sağlar. Tür Sınıfları tam da burada öne çıkar!

Tür Sınıfları Nedir?

Tür Sınıfı, mevcut türleri değiştirmeden ve kalıtım kullanmadan onlara yeni davranışlar eklemenin bir yolunu sağlayan bir tasarım kalıbıdır.

  • Belirli bir davranış için bir sözleşme (trait) tanımlar.
  • Bu sözleşmeyi farklı türler için uygulayan 'örnekler' (nesneler) sağlar.
  • Doğru davranışı otomatik olarak kapsam içine almak için Scala'nın örtük mekanizmasını kullanır.

Bir Tür Sınıfı Trait'i Tanımlama

İlk olarak istediğimiz davranışı açıklayan bir trait tanımlarız. Bu trait, davranışımızın üzerinde çalışacağı türü temsil eden A adlı bir tür parametresi alır.

Herhangi bir türü insanların okuyabileceği bir dizeye nasıl dönüştüreceğini bilen bir Printable tür sınıfı oluşturalım.

package com.coddykit

trait Printable[A] {
  def format(value: A): String
}

Tür Sınıfı Örnekleri Oluşturma

Şimdi Scala'ya belirli türleri nasıl Printable yapacağını söylememiz gerekiyor. Bunu, her tür için Printable özelliğimizi genişleten örtük nesneler (veya değerler) oluşturarak yaparız.

Bunlara tür sınıfı örnekleri adı verilir.

package com.coddykit

trait Printable[A] {
  def format(value: A): String
}

object PrintableInstances {
  implicit object StringPrintable extends Printable[String] {
    def format(value: String): String = s"'${value}'"
  }

  implicit object IntPrintable extends Printable[Int] {
    def format(value: Int): String = s"${value}i"
  }
}

Örtüklerle Tür Sınıflarını Kullanma

Tür sınıfımızı kullanmak için, tür sınıfından bir örtük parametre alan bir işlev tanımlarız. Scala derleyicisi, bu işlev çağrıldığında kullanılabilir bir Printable[A] örtük örneğini otomatik olarak arar.

Bir örnek bulursa onu işlevin içine ekler!

package com.coddykit

trait Printable[A] {
  def format(value: A): String
}

object PrintableInstances {
  implicit object StringPrintable extends Printable[String] {
    def format(value: String): String = s"'${value}'"
  }

  implicit object IntPrintable extends Printable[Int] {
    def format(value: Int): String = s"${value}i"
  }
}

object PrintableSyntax {
  def print[A](value: A)(implicit p: Printable[A]): Unit = {
    println(p.format(value))
  }
}

object Main {
  import PrintableInstances._
  import PrintableSyntax._

  def main(args: Array[String]): Unit = {
    print("hello")
    print(123)
  }
}

Bağlam Sınırları: Daha Temiz Sözdizimi

Scala, örtük parametreler için bağlam sınırı adı verilen bir kısaltma sunar. (implicit p: Printable[A]) yerine [A: Printable] yazabilirsiniz.

Özellikle birden çok örtük parametreniz olduğunda bu, kodu daha temiz hâle getirir.

package com.coddykit

trait Printable[A] {
  def format(value: A): String
}

object PrintableInstances {
  implicit object StringPrintable extends Printable[String] {
    def format(value: String): String = s"'${value}'"
  }

  implicit object IntPrintable extends Printable[Int] {
    def format(value: Int): String = s"${value}i"
  }
}

object PrintableSyntax {
  // Using context bound: [A: Printable] is shorthand for (implicit p: Printable[A])
  def print[A: Printable](value: A): Unit = {
    // To access the implicit instance, use implicitly[Printable[A]]
    val p = implicitly[Printable[A]]
    println(p.format(value))
  }
}

object Main {
  import PrintableInstances._
  import PrintableSyntax._

  def main(args: Array[String]): Unit = {
    print("world")
    print(456)
  }
}

Özel Türlere Genişletme

Tür sınıflarının gücü, herhangi bir türe, hatta sahibi olmadığınız türlere (örneğin Int veya String) ya da durum sınıfları gibi kendi özel türlerinize yeni davranışlar ekleyebilmenizdir.

Person durum sınıfımızı Printable yapalım.

package com.coddykit

trait Printable[A] {
  def format(value: A): String
}

case class Person(name: String, age: Int)

object PrintableInstances {
  implicit object StringPrintable extends Printable[String] {
    def format(value: String): String = s"'${value}'"
  }

  implicit object IntPrintable extends Printable[Int] {
    def format(value: Int): String = s"${value}i"
  }

  // New instance for our custom Person type
  implicit object PersonPrintable extends Printable[Person] {
    def format(person: Person): String = 
      s"Person(name: ${person.name}, age: ${person.age})"
  }
}

object PrintableSyntax {
  def print[A: Printable](value: A): Unit = {
    val p = implicitly[Printable[A]]
    println(p.format(value))
  }
}

object Main {
  import PrintableInstances._
  import PrintableSyntax._

  def main(args: Array[String]): Unit = {
    val alice = Person("Alice", 30)
    print(alice)
  }
}

Örtükler: Tür Sınıflarından Daha Fazlası

Tür sınıfları başlıca kullanım alanlarından biri olsa da Scala'daki implicit anahtar sözcüğü daha kapsamlı bir mekanizmadır. Şunlar için kullanılabilir:

  • Örtük Parametreler: Tür sınıflarında gördüğümüz gibi değerleri otomatik olarak sağlamak için.
  • Örtük Dönüşümler: Bir türü otomatik olarak başka bir türe dönüştürmek için (kodu takip etmeyi zorlaştırabileceklerinden dikkatli kullanın).
  • Örtük Değerler: Belirli türler için varsayılan değerler sağlamak için; genellikle yürütme bağlamları gibi amaçlarla kullanılır.

Temel fikir, derleyicinin kapsam içindeki uygun örtük tanımları aramasıdır.

Tür Sınıflarının Faydaları

Tür sınıfları çeşitli avantajlar sunar:

  • Genişletilebilirlik: Mevcut türleri değiştirmeden onlara yeni davranışlar ekleyebilirsiniz.
  • Gevşek Bağlantı: Tür tanımını davranışından ayırabilirsiniz.
  • Ad hoc Çok Biçimlilik: İşlevler, gereken davranışı sağlayan herhangi bir türle çalışabilir.
  • Sınanabilirlik: Davranışları yalıtılmış olarak sınamak daha kolaydır.
  • Kalıtım Ek Yükünün Olmaması: Derin kalıtım hiyerarşilerinin karmaşıklığından kaçınmanızı sağlar.

Hızlı Kontrol

Dersimizdeki Printable tür sınıfını ve örneklerini düşünün. DoublePrintable örneğinin bulunmadığını varsayarak print(10.5) çağrısını yaparsanız ne olur?

Özet ve Sonraki Adımlar

Tür Sınıfları ve Scala'nın güçlü örtük sisteminde ustalaştınız!

  • Tür Sınıfları, kalıtım kullanmadan türler için davranış tanımlamanıza olanak tanıyarak ad hoc çok biçimliliği mümkün kılar.
  • Bunlar bir özellikten (sözleşmeden) ve örtük nesnelerden/değerlerden (örneklerden) oluşur.
  • Örtük parametreler ve bağlam sınırları, işlevlerin bu örnekleri otomatik olarak bulup kullanmasını sağlar.

Tür sınıfları, Scala'da işlevsel programlamanın temel taşlarından biridir. Esnek ve sağlam uygulamalar oluşturmak için Cats ve ZIO gibi kütüphanelerde yoğun biçimde kullanılır. Anlayışınızı pekiştirmek için pratik yapmaya devam edin!

Sıkça Sorulan Sorular

“Tür Sınıfları ve Örtükler” dersi ücretsiz mi?

Evet — “Tür Sınıfları ve Örtükler” 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 3 dersten oluşur.

“Tür Sınıfları ve Örtükler” dersinde ne öğreneceğim?

Özel amaçlı çok biçimlilik için tür sınıflarını kullanmayı ve güçlü soyutlamalar için Scala'nın örtük sisteminden yararlanmayı öğrenin. 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, 3 dersinin 3. dersidir.

“Tür Sınıfları ve Örtükler” 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. Jenerikler ve Tür Parametreleri
  2. Varyans: Kovaryans ve Kontravaryans
  3. Tür Sınıfları ve Örtükler
← Scala for Backend Engineering & Functional Programming Sayfasına Dön