0Pricing
Scala for Backend Engineering & Functional Programming · บทเรียน

การประกอบโดเมน

สร้างแบบจำลองที่มีขนาดใหญ่ขึ้น

การประกอบโดเมน เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน

การสร้างแบบจำลองขนาดใหญ่ขึ้น

โดเมนจริงประกอบขึ้นจากส่วนย่อย ๆ การประกอบโดเมน หมายถึงการรวม ADT, นิวไทป์ และค่าที่ผ่านการตรวจสอบความถูกต้อง ซึ่งมีการออกแบบแบบจำลองอย่างเหมาะสม ให้กลายเป็นโครงสร้างที่ใหญ่ขึ้นและยังคงถูกต้อง

  • ชนิดข้อมูลขนาดเล็กที่มุ่งเน้นเฉพาะด้านสามารถประกอบเป็นชนิดข้อมูลที่ใหญ่ขึ้นได้
  • แต่ละส่วนยังคงเงื่อนไขคงรูปของตนเองไว้
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)))

การซ้อนผลิตภัณฑ์

ประกอบชนิดผลิตภัณฑ์ด้วยการซ้อนคลาสกรณี แต่ละระดับจะเพิ่มโครงสร้างโดยยังอ่านได้ง่าย

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)

การประกอบด้วยคอลเลกชัน

ใช้ List, Map และ Set เพื่อจำลองความสัมพันธ์แบบหนึ่งต่อหลายภายในโดเมนของคุณ

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)

การประกอบชนิดผลรวม

ตัวเลือกที่ใหญ่ขึ้นเกิดจากการรวมตัวเลือกที่เล็กกว่า ตัวแปรสมาชิกของ enum เองก็สามารถบรรจุ ADT อื่นไว้ได้ ทำให้การตัดสินใจเป็นชั้น ๆ

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)

ฟังก์ชันที่ประกอบโดเมน

การดำเนินการของโดเมนคือฟังก์ชันบริสุทธิ์จากชนิดข้อมูลนำเข้าไปยังชนิดข้อมูลส่งออก การประกอบฟังก์ชันเหล่านี้จะสร้างกระบวนงาน

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)))

การประกอบการตรวจสอบความถูกต้อง

เมื่อแต่ละฟิลด์สร้างด้วยตัวสร้างอัจฉริยะ ให้ประกอบฟิลด์เหล่านั้นด้วยนิพจน์แบบ for ออบเจ็กต์ทั้งหมดจะถูกสร้างขึ้นก็ต่อเมื่อทุกส่วนผ่านการตรวจสอบความถูกต้อง

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))

การพับข้อมูลแบบผสม

รวมโครงสร้างที่ประกอบขึ้นด้วย fold หรือ map ร่วมกับ sum รูปร่างของข้อมูลจะช่วยชี้แนวทางการคำนวณ

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))

การอัปเดตแบบจำลองที่เปลี่ยนแปลงไม่ได้

ประกอบการเปลี่ยนแปลงด้วย copy ซึ่งส่งคืนค่าใหม่ที่แทนที่ฟิลด์ที่เลือกไว้ ค่าดั้งเดิมจะไม่ถูกแก้ไข

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))

การจำลองเครื่องสถานะ

ประกอบชนิดผลรวมและฟังก์ชันการเปลี่ยนสถานะเพื่อจำลองเครื่องสถานะที่มีเฉพาะการเปลี่ยนสถานะที่ถูกต้องตามกฎเท่านั้น

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))

การแบ่งชั้นโดเมนและการดำเนินการ

คงชนิดข้อมูลให้บริสุทธิ์ และใส่พฤติกรรมไว้ในฟังก์ชันหรือเมธอด แบบจำลองที่ประกอบขึ้นพร้อมชุดการแปลงจะกลายเป็นไลบรารีโดเมนขนาดเล็ก

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)

นำทุกอย่างมาประกอบกัน

แบบจำลองที่สมบูรณ์ประกอบด้วยนิวไทป์ ผลิตภัณฑ์ ผลรวม คอลเลกชัน และการสร้างที่ผ่านการตรวจสอบความถูกต้อง ผลลัพธ์คือโครงสร้างที่นำไปใช้ผิดได้ยากและทำความเข้าใจได้ง่าย

  • สร้างชนิดข้อมูลขนาดเล็กก่อน
  • ประกอบเป็นโครงสร้างรวม
  • แสดงการดำเนินการในรูปฟังก์ชันบริสุทธิ์
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)

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเกี่ยวกับการประกอบโดเมน

สรุปทบทวน

คุณได้เรียนรู้การประกอบโดเมน

  • ซ้อนผลิตภัณฑ์และผลรวมเพื่อจำลองโครงสร้างที่หลากหลาย
  • ใช้คอลเลกชันสำหรับความสัมพันธ์แบบหนึ่งต่อหลาย
  • ประกอบการตรวจสอบความถูกต้องด้วยนิพจน์แบบ for
  • อัปเดตโดยไม่เปลี่ยนแปลงค่าด้วย copy
  • คงข้อมูลให้บริสุทธิ์และแสดงการดำเนินการเป็นฟังก์ชัน
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"))

คำถามที่พบบ่อย

บทเรียน “การประกอบโดเมน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การประกอบโดเมน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การประกอบโดเมน”

สร้างแบบจำลองที่มีขนาดใหญ่ขึ้น คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การประกอบโดเมน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม

ได้ บทเรียน Scala for Backend Engineering & Functional Programming ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การสร้างแบบจำลองด้วย ADT
  2. ตัวสร้างอัจฉริยะ
  3. ชนิดข้อมูลใหม่
  4. การประกอบโดเมน
← กลับไปที่ Scala for Backend Engineering & Functional Programming