Tetapi, bagaimana jika salah satu peristiwa menyebabkan sistem eksternal yang tidak dalam kendali Anda untuk "mengirimkan barang" kepada pelanggan jika Anda hanya memutar ulang acara, barang tersebut akan dikirim dua kali.
Untuk memilih contoh spesifik, mari pertimbangkan bagaimana pendekatan "setidaknya satu kali" untuk efek samping dapat bekerja.
State currentState = State.InitialState
for(Event e : events) {
currentState = currentState.apply(e)
}
for(SideEffect s : currentState.querySideEffects()) {
performSideEffect(s)
Jadi model domain melacak apa yang perlu dilakukan; tetapi meninggalkan tindakan aktual ke aplikasi
Dalam konteks menjalankan perintah, ide dasarnya terlihat sama. Efek samping yang sebenarnya terjadi di luar transaksi yang memperbarui model.
Jadi tes unit untuk model Anda bisa terlihat seperti
{
// 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()
}
Poin utama di sini adalah
- Memperbarui model ini bebas efek samping; efek samping yang sebenarnya terjadi di luar transaksi yang memperbarui model.
- Suatu peristiwa yang menggambarkan hasil dari efek samping perlu kembali.