Akıllı Oluşturucular
Doğrulanmış oluşturma
Akıllı Oluşturucular, CoddyKit'te ücretsiz bir Scala for Backend Engineering & Functional Programming dersidir. Bu, 4 dersinin 2. 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.
Doğrulanmış Oluşturma
Akıllı yapıcı, bir değer üretmeden önce girdileri doğrulayan fabrikadır. Elinizde tuttuğunuz her örneğin türün değişmez koşullarını karşılamasını garanti eder.
- Ham yapıcı gizlidir.
- Yalnızca doğrulanmış oluşturma public olur.
class Age private (val value: Int)
object Age:
def of(v: Int): Option[Age] =
if v >= 0 then Some(new Age(v)) else None
object Main:
def main(args: Array[String]): Unit =
println(Age.of(30).map(_.value))Private Yapıcı
Birincil yapıcıyı private olarak işaretlemek, çağıranların doğrulamayı atlamasını engeller. Eşlik eden nesne tek giriş noktası hâline gelir.
class Percentage private (val value: Int)
object Percentage:
def of(v: Int): Option[Percentage] =
if v >= 0 && v <= 100 then Some(new Percentage(v)) else None
object Main:
def main(args: Array[String]): Unit =
println(Percentage.of(50).map(_.value))
println(Percentage.of(150))Option Döndürme
Option döndürmek, oluşturmanın başarısız olabileceğini belirtir. Çağıran None durumunu ele almak zorundadır; böylece geçersiz veriler sessizce akışa karışmaz.
class NonEmpty private (val value: String)
object NonEmpty:
def of(s: String): Option[NonEmpty] =
if s.nonEmpty then Some(new NonEmpty(s)) else None
object Main:
def main(args: Array[String]): Unit =
println(NonEmpty.of("").map(_.value))
println(NonEmpty.of("hi").map(_.value))Hata Ayrıntısı İçin Either Döndürme
Doğrulamanın neden başarısız olduğunu açıklamak istediğinizde Either[Error, T] döndürün. Left, açıklayıcı bir ileti taşır.
class Username private (val value: String)
object Username:
def of(s: String): Either[String, Username] =
if s.isEmpty then Left("empty")
else if s.length > 10 then Left("too long")
else Right(new Username(s))
object Main:
def main(args: Array[String]): Unit =
println(Username.of(""))
println(Username.of("ada").map(_.value))case class ile Akıllı Yapıcılar
Private yapıcılı bir case class da kullanılabilir. Oluşturulan apply ve copy üyelerinin de denetlenmesi gerektiğini unutmayın; bu nedenle özel bir fabrika tanımlayın ve yapıcıyı private tutun.
case class Email private (value: String)
object Email:
def of(s: String): Option[Email] =
if s.contains("@") then Some(Email(s)) else None
object Main:
def main(args: Array[String]): Unit =
println(Email.of("a@b.com"))
println(Email.of("bad"))Doğrulanmış Değerleri Zincirleme
Akıllı yapıcılar Option veya Either döndürdüğünden, daha büyük doğrulanmış nesneler oluşturmak için bunları for ifadeleriyle birleştirebilirsiniz.
case class Name private (value: String)
object Name:
def of(s: String): Option[Name] =
if s.nonEmpty then Some(Name(s)) else None
case class Person(name: Name, age: Int)
object Main:
def make(n: String): Option[Person] =
for nm <- Name.of(n) yield Person(nm, 20)
def main(args: Array[String]): Unit =
println(Main.make("Bob"))Girdiyi Normalleştirme
Akıllı yapıcı verileri de normalleştirebilir; örneğin boşlukları kırpabilir veya harfleri küçültebilir. Böylece tüm örnekler kurallı bir biçimi paylaşır.
case class Tag private (value: String)
object Tag:
def of(s: String): Option[Tag] =
val clean = s.trim.toLowerCase
if clean.nonEmpty then Some(Tag(clean)) else None
object Main:
def main(args: Array[String]): Unit =
println(Tag.of(" Scala "))Değişmez Koşullar Her Zaman Geçerlidir
Bir değer akıllı yapıcıdan geçtiğinde değişmez koşulu tüm yaşam süresi boyunca garanti edilir. Sonraki kod, yeniden denetim yapmadan bu değere güvenebilir.
case class PositiveInt private (value: Int)
object PositiveInt:
def of(n: Int): Option[PositiveInt] =
if n > 0 then Some(PositiveInt(n)) else None
object Main:
def doubleIt(p: PositiveInt): Int = p.value * 2 // always positive
def main(args: Array[String]): Unit =
PositiveInt.of(5).foreach(p => println(Main.doubleIt(p)))Opak Türlerle Birleştirme
Sıfır maliyetli doğrulanmış değerler için akıllı yapıcıyı opak türle birleştirin. Hiçbir sarmalayıcı nesne oluşturulmaz; yine de oluşturma doğrulamayla sınırlandırılır.
object Domain:
opaque type Score = Int
def of(n: Int): Option[Score] =
if n >= 0 && n <= 100 then Some(n) else None
extension (s: Score) def value: Int = s
object Main:
def main(args: Array[String]): Unit =
println(Domain.of(88).map(_.value))Birden Çok Doğrulama Kuralı
Birden fazla denetimi sırayla uygulayın. İlk başarısız kural kısa devre yaparak açık bir hata döndürür.
object Password:
def of(s: String): Either[String, String] =
if s.length < 8 then Left("too short")
else if !s.exists(_.isDigit) then Left("need a digit")
else Right(s)
object Main:
def main(args: Array[String]): Unit =
println(Password.of("abc"))
println(Password.of("abcdef12"))Akıllı Yapıcılar Ne Zaman Kullanılır
Ham oluşturmanın ihlal edebileceği değişmez koşullara sahip bir tür olduğunda bunları kullanın.
- Sınırlandırılmış sayılar, boş olmayan dizeler ve biçimlendirilmiş kimlikler.
- Basit evet/hayır durumları için
Option, nedenleri belirtmek içinEitherdöndürün. - Ham yapıcıyı private tutun.
case class Port private (value: Int)
object Port:
def of(n: Int): Option[Port] =
if n >= 1 && n <= 65535 then Some(Port(n)) else None
object Main:
def main(args: Array[String]): Unit =
println(Port.of(8080))
println(Port.of(70000))Kısa Kontrol
Akıllı yapıcıları ne kadar anladığınızı test edin.
Özet
Akıllı yapıcıları öğrendiniz.
- Girdileri eşlik eden bir fabrikada doğrulayın.
- Ham yapıcıyı private yapın.
- Başarısızlığın ele alınmasını zorunlu kılmak için
OptionveyaEitherdöndürün. - İsteğe bağlı olarak girdiyi kurallı bir biçime normalleştirin.
- Böylece değişmez koşullar değerin tüm yaşam süresi boyunca geçerli kalır.
case class Even private (value: Int)
object Even:
def of(n: Int): Option[Even] =
if n % 2 == 0 then Some(Even(n)) else None
object Main:
def main(args: Array[String]): Unit =
println(Even.of(4))
println(Even.of(5))Sıkça Sorulan Sorular
“Akıllı Oluşturucular” dersi ücretsiz mi?
Evet — “Akıllı Oluşturucular” 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.
“Akıllı Oluşturucular” dersinde ne öğreneceğim?
Doğrulanmış oluşturma 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 2. dersidir.
“Akıllı Oluşturucular” 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