ADT'lerle Modelleme
Geçersiz durumları temsil edilemez hâle getirin
ADT'lerle Modelleme, CoddyKit'te ücretsiz bir Scala for Backend Engineering & Functional Programming dersidir. Bu, 4 dersinin 1. 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.
Cebirsel Veri Türleri
Cebirsel veri türleri (ADT), işlevsel alan modellemesinin temelidir. Verileri kesin biçimde açıklamak için çarpım türlerini (AND) ve toplam türlerini (OR) birleştirir.
- Çarpım: birkaç alan içeren bir kayıt.
- Toplam: birkaç seçenek arasından biri.
case class Point(x: Int, y: Int) // product type
object Main:
def main(args: Array[String]): Unit =
println(Point(1, 2))Çarpım Türleri
Bir çarpım türü değerleri bir araya getirir. Scala'da bir case class çarpım türüdür: bir örnek tüm alanlarını aynı anda barındırır.
case class User(name: String, age: Int)
object Main:
def main(args: Array[String]): Unit =
val u = User("Ada", 36)
println(u.name)
println(u.age)Toplam Türleri
Bir toplam türü, birkaç seçenekten tam olarak biri olan değerdir. Scala 3 numaralandırmaları bunu doğrudan ifade eder.
enum PaymentMethod:
case Cash
case Card(number: String)
case Crypto(wallet: String)
object Main:
def main(args: Array[String]): Unit =
val p: PaymentMethod = PaymentMethod.Card("1234")
println(p)Geçersiz Durumları İfade Edilemez Kılma
Temel ilke şudur: türleri, geçersiz verilerin oluşturulamayacağı şekilde tasarlayın. Tür sistemi hatalı bir durumu yasaklıyorsa, bu durum için çalışma zamanı denetimine hiçbir zaman ihtiyaç duymazsınız.
enum Connection:
case Disconnected
case Connected(sessionId: String)
object Main:
def main(args: Array[String]): Unit =
// No way to have a sessionId while Disconnected
val c: Connection = Connection.Connected("abc")
println(c)Kötü Tasarım ve İyi Tasarım
Boş değer kabul eden alanlara sahip düz bir kayıt, geçersiz durumları mümkün kılar. Her durumu bir seçenek olarak modellemek bunları ortadan kaldırır.
- Kötü:
case class Conn(connected: Boolean, sessionId: String), sessionId varken connected=false olmasına izin verir. - İyi: bir toplam türü alanı doğru duruma bağlar.
enum Door:
case Open
case Closed
case Locked(key: String)
object Main:
def main(args: Array[String]): Unit =
val d: Door = Door.Locked("k1")
println(d)Çarpımları ve Toplamları Birleştirme
Gerçek modellerde çarpımlar toplamların, toplamlar da çarpımların içinde iç içe bulunur. Her seçenek, kendine ait alan çarpımını taşıyabilir.
case class Address(city: String, zip: String)
enum Contact:
case Email(value: String)
case Postal(address: Address)
object Main:
def main(args: Array[String]): Unit =
val c: Contact = Contact.Postal(Address("Paris", "75001"))
println(c)ADT'lerle Örüntü Eşleştirme
ADT'leri örüntü eşleştirmeyle kullanırsınız. Tür kapalı olduğundan, bir seçeneği atlarsanız derleyici uyarır.
enum Shape:
case Circle(r: Double)
case Rect(w: Double, h: Double)
object Main:
def area(s: Shape): Double = s match
case Shape.Circle(r) => 3.14159 * r * r
case Shape.Rect(w, h) => w * h
def main(args: Array[String]): Unit =
println(area(Shape.Rect(2, 3)))Özyinelemeli ADT'ler
ADT'ler kendilerine başvurabilir; böylece ağaçları, listeleri ve ifadeleri doğal biçimde modelleyebilirsiniz.
enum Expr:
case Num(value: Int)
case Add(left: Expr, right: Expr)
object Main:
def eval(e: Expr): Int = e match
case Expr.Num(v) => v
case Expr.Add(l, r) => eval(l) + eval(r)
def main(args: Array[String]): Unit =
val e = Expr.Add(Expr.Num(2), Expr.Num(3))
println(eval(e))Option ile İsteğe Bağlılık
Muhtemelen bulunmayan bir alanı modellemek için null yerine Option kullanın. Tür, yokluğu açıkça belirtir ve bunun ele alınmasını zorunlu kılar.
case class Profile(name: String, nickname: Option[String])
object Main:
def main(args: Array[String]): Unit =
val p = Profile("Grace", None)
println(p.nickname.getOrElse("(none)"))Miktarları Kesin Biçimde Modelleme
İlkel tür saplantısının yerine alan türlerini kullanın. Ham Int ve String değerleri yerine anlamlı miktarları sarmalayın; böylece türler amacı belgeler ve karıştırmaları önler.
case class Quantity(value: Int)
case class Price(cents: Long)
case class LineItem(qty: Quantity, price: Price)
object Main:
def main(args: Array[String]): Unit =
val item = LineItem(Quantity(3), Price(500))
println(item)ADT'ler Neden Önemlidir
ADT'ler doğruluk ve açıklık sağlar.
- Geçersiz durumlar oluşturulamaz.
- Eksiksiz eşleştirme, atlanan durumları derleme zamanında yakalar.
- Verilerin yapısı, alanı belgeler.
enum OrderStatus:
case Pending
case Shipped(tracking: String)
case Delivered(at: Long)
object Main:
def main(args: Array[String]): Unit =
val s: OrderStatus = OrderStatus.Shipped("TRK1")
println(s)Kısa Kontrol
ADT tabanlı modellemeyi ne kadar anladığınızı test edin.
Özet
ADT'lerle alan modellemeyi öğrendiniz.
- Çarpım türleri (
case class) alanları AND ile birleştirir. - Toplam türleri (
enum) OR ile seçenek sunar. - Zengin alanları ve özyinelemeli yapıları modellemek için bunları iç içe kullanın.
- Null yerine
Optionkullanın. - Geçersiz durumların ifade edilemeyeceği şekilde tasarlayın.
enum Event:
case Created(id: Int)
case Deleted(id: Int, reason: String)
object Main:
def describe(e: Event): String = e match
case Event.Created(id) => s"created $id"
case Event.Deleted(id, reason) => s"deleted $id: $reason"
def main(args: Array[String]): Unit =
println(describe(Event.Deleted(1, "spam")))Sıkça Sorulan Sorular
“ADT'lerle Modelleme” dersi ücretsiz mi?
Evet — “ADT'lerle Modelleme” 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.
“ADT'lerle Modelleme” dersinde ne öğreneceğim?
Geçersiz durumları temsil edilemez hâle getirin 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 1. dersidir.
“ADT'lerle Modelleme” 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
- ADT'lerle Modelleme
- Akıllı Oluşturucular
- Yeni Türler
- Alanları Birleştirme