Menggabungkan Domain
Membangun model yang lebih besar
Menggabungkan Domain adalah pelajaran Scala for Backend Engineering & Functional Programming gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Scala for Backend Engineering & Functional Programming, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.
Membangun Model yang Lebih Besar
Ranah nyata tersusun dari bagian-bagian yang lebih kecil. Menyusun ranah berarti menggabungkan ADT, tipe baru, dan nilai tervalidasi yang dimodelkan dengan baik menjadi struktur yang lebih besar dan tetap benar.
- Tipe-tipe kecil yang terfokus dapat disusun menjadi tipe yang lebih besar.
- Setiap bagian mempertahankan invarian-nya sendiri.
case class Money(cents: Long)
case class Product(name: String, price: Money)
object Main:
def main(args: Array[String]): Unit =
println(Product("Book", Money(1999)))Menyusun Produk Bertingkat
Susun tipe produk dengan membuat kelas-kelas kasus bertingkat. Setiap tingkat menambahkan struktur sekaligus tetap mudah dibaca.
case class Address(city: String, zip: String)
case class Customer(name: String, address: Address)
object Main:
def main(args: Array[String]): Unit =
val c = Customer("Ada", Address("London", "E1"))
println(c.address.city)Menyusun dengan Koleksi
Gunakan List, Map, dan Set untuk memodelkan hubungan satu-ke-banyak di dalam ranah Anda.
case class Item(name: String, qty: Int)
case class Order(id: Int, items: List[Item])
object Main:
def main(args: Array[String]): Unit =
val order = Order(1, List(Item("pen", 2), Item("ink", 1)))
println(order.items.map(_.qty).sum)Menyusun Tipe Jumlah
Pilihan yang lebih besar menggabungkan pilihan-pilihan yang lebih kecil. Sebuah varian enumerasi dapat memuat ADT lain, sehingga keputusan tersusun berlapis.
enum Payment:
case Card(last4: String)
case Cash
enum Checkout:
case Completed(payment: Payment)
case Abandoned
object Main:
def main(args: Array[String]): Unit =
val c: Checkout = Checkout.Completed(Payment.Card("1234"))
println(c)Fungsi yang Menyusun Ranah
Operasi ranah adalah fungsi murni dari tipe masukan ke tipe keluaran. Menyusunnya akan membentuk alur kerja.
case class Cart(total: Long)
case class Receipt(total: Long, tax: Long)
object Main:
def checkout(c: Cart): Receipt =
Receipt(c.total, (c.total * 0.2).toLong)
def main(args: Array[String]): Unit =
println(checkout(Cart(1000)))Menyusun Validasi
Ketika setiap bidang dibuat oleh konstruktor cerdas, susun semuanya dengan pemahaman for. Objek secara keseluruhan hanya dibuat jika setiap bagiannya lolos validasi.
object V:
def name(s: String): Option[String] = if s.nonEmpty then Some(s) else None
def age(n: Int): Option[Int] = if n >= 0 then Some(n) else None
case class Person(name: String, age: Int)
object Main:
def make(n: String, a: Int): Option[Person] =
for nm <- V.name(n); ag <- V.age(a) yield Person(nm, ag)
def main(args: Array[String]): Unit =
println(Main.make("Bob", 30))
println(Main.make("", 30))Melipat Data Komposit
Agregasikan struktur yang tersusun dengan fold atau map ditambah sum. Bentuk data memandu perhitungannya.
case class Line(price: Long, qty: Int)
case class Invoice(lines: List[Line])
object Main:
def total(inv: Invoice): Long =
inv.lines.foldLeft(0L)((acc, l) => acc + l.price * l.qty)
def main(args: Array[String]): Unit =
val inv = Invoice(List(Line(100, 2), Line(50, 4)))
println(total(inv))Memperbarui Model yang Tidak Dapat Diubah
Susun perubahan dengan copy, yang mengembalikan nilai baru dengan bidang-bidang tertentu yang diganti. Nilai asli tetap tidak tersentuh.
case class Account(id: Int, balance: Long)
object Main:
def deposit(a: Account, amt: Long): Account =
a.copy(balance = a.balance + amt)
def main(args: Array[String]): Unit =
val a = Account(1, 100)
println(deposit(a, 50))Memodelkan Mesin Keadaan
Susun tipe jumlah dan fungsi transisi untuk memodelkan mesin keadaan yang hanya memiliki transisi yang sah.
enum Light:
case Red, Green, Yellow
object Main:
def next(l: Light): Light = l match
case Light.Red => Light.Green
case Light.Green => Light.Yellow
case Light.Yellow => Light.Red
def main(args: Array[String]): Unit =
println(next(Light.Red))
println(next(Light.Green))Melapiskan Ranah dan Operasi
Jaga agar tipe data tetap murni dan tempatkan perilaku di dalam fungsi atau metode. Model yang tersusun ditambah sekumpulan transformasi membentuk pustaka ranah kecil.
case class Temp(celsius: Double):
def toF: Double = celsius * 9 / 5 + 32
object Main:
def main(args: Array[String]): Unit =
val t = Temp(25.0)
println(t.toF)Menggabungkan Semuanya
Model yang lengkap menyusun tipe baru, produk, jumlah, koleksi, dan konstruksi tervalidasi. Hasilnya sulit digunakan secara keliru dan mudah dipahami.
- Bangun tipe-tipe kecil terlebih dahulu.
- Susun menjadi agregat.
- Nyatakan operasi sebagai fungsi murni.
case class Sku(value: String)
case class Line(sku: Sku, qty: Int)
case class Basket(lines: List[Line]):
def count: Int = lines.map(_.qty).sum
object Main:
def main(args: Array[String]): Unit =
val b = Basket(List(Line(Sku("A"), 2), Line(Sku("B"), 3)))
println(b.count)Pemeriksaan Singkat
Uji pemahaman Anda tentang penyusunan ranah.
Ringkasan
Anda telah mempelajari cara menyusun ranah.
- Buat produk dan jumlah bertingkat untuk memodelkan struktur yang kaya.
- Gunakan koleksi untuk hubungan satu-ke-banyak.
- Susun validasi dengan pemahaman
for. - Perbarui secara tidak dapat diubah dengan
copy. - Jaga data tetap murni dan nyatakan operasi sebagai fungsi.
case class User(id: Int, name: String)
case class Post(author: User, text: String)
object Main:
def main(args: Array[String]): Unit =
val p = Post(User(1, "Ada"), "hello")
println(p.copy(text = "hi"))Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menggabungkan Domain” gratis?
Ya — teks lengkap “Menggabungkan Domain” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Scala for Backend Engineering & Functional Programming, upgrade ke CoddyKit PRO. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Menggabungkan Domain”?
Membangun model yang lebih besar Kamu berlatih Scala for Backend Engineering & Functional Programming dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Scala for Backend Engineering & Functional Programming?
Tidak diperlukan pengalaman sebelumnya. Scala for Backend Engineering & Functional Programming di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Menggabungkan Domain” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Scala for Backend Engineering & Functional Programming ini?
Ya. Setiap pelajaran Scala for Backend Engineering & Functional Programming menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pemodelan dengan ADT
- Konstruktor Cerdas
- Newtype
- Menggabungkan Domain