แต่จะเกิดอะไรขึ้นถ้าเหตุการณ์ใดเหตุการณ์หนึ่งควรทำให้ระบบภายนอกไม่อยู่ในการควบคุมของคุณที่จะ "จัดส่งรายการ" ให้กับลูกค้าหากคุณเพิ่งเล่นซ้ำเหตุการณ์รายการนั้นจะถูกจัดส่งสองครั้ง
ในการเลือกตัวอย่างที่เฉพาะเจาะจงลองพิจารณาว่าวิธี "ผลกระทบข้างเคียง" อย่างน้อยหนึ่งครั้งอาจมีผลอย่างไร
State currentState = State.InitialState
for(Event e : events) {
currentState = currentState.apply(e)
}
for(SideEffect s : currentState.querySideEffects()) {
performSideEffect(s)
ดังนั้นโมเดลโดเมนจะติดตามสิ่งที่ต้องทำ แต่ปล่อยให้ทำจริงกับแอปพลิเคชัน
ในบริบทของการรันคำสั่งแนวคิดพื้นฐานจะมีลักษณะเหมือนกัน ผลข้างเคียงที่เกิดขึ้นจริงเกิดขึ้นนอกธุรกรรมที่อัพเดตโมเดล
ดังนั้นการทดสอบหน่วยสำหรับแบบจำลองของคุณอาจดูเหมือน
{
// Given
State currentState = State.InitialState
// When
Events events = List.of(OrderPlaced)
// Then
List.of(SendEmail) === currentState.applyAll(events).querySideEffects()
}
{
// Given
State currentState = State.InitialState
// When
Events events = List.of(OrderPlaced, EmailSent)
// Then
List.EMPTY === currentState.applyAll(events).querySideEffects()
}
ประเด็นหลักที่นี่เป็น
- การอัปเดตโมเดลไม่มีผลข้างเคียง ผลข้างเคียงที่เกิดขึ้นจริงเกิดขึ้นนอกธุรกรรมที่อัพเดตโมเดล
- เหตุการณ์ที่อธิบายถึงผลของผลข้างเคียงต้องกลับมา