all p: Product | { let confirmedStatuses = Confirmed + Processing + Shipped + Delivered let confirmedItems = {oi: OrderItem | some o: Order | oi in o.items and o.status in confirmedStatuses} let productItems = {oi: confirmedItems | oi.product = p} let totalQuantity = sum oi: productItems | oi.quantity totalQuantity <= p.stock } } 基本⽂法 - 制約条件
{ // 共通プロパティ val id: ID<Product> val name: ProductName val code: ProductCode // 商品タイプによる分岐 val productType: ProductType get() = when (this) { is PhysicalProduct -> ProductType.PHYSICAL is DigitalProduct -> ProductType.DIGITAL is ServiceProduct -> ProductType.SERVICE } }
Order): OrderResult = when (order.status) { is OrderStatus.Pending -> validateAndConfirm(order) is OrderStatus.Confirmed -> prepareShipment(order) is OrderStatus.Shipped -> trackDelivery(order) is OrderStatus.Delivered -> completeOrder(order) // 全てのケースが強制的にハンドリングされる }