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