Ancak, olaylardan biri, kontrolünüzde olmayan harici bir sistemin müşteriye yalnızca bir öğe göndermesine neden olursa, öğeyi iki kez gönderirseniz ne olur?
Belirli bir örnek seçmek için, yan etkilere "en az bir kez" yaklaşımının nasıl işleyebileceğini düşünelim.
State currentState = State.InitialState
for(Event e : events) {
currentState = currentState.apply(e)
}
for(SideEffect s : currentState.querySideEffects()) {
performSideEffect(s)
Böylece etki alanı modeli ne yapılması gerektiğini izler; ancak gerçek işi uygulamaya bırakır
Komut çalıştırma bağlamında, temel fikir aynı görünüyor. Gerçek yan etkiler , modeli güncelleyen işlemin dışında gerçekleşir .
Böylece modeliniz için birim testleri şöyle görünebilir:
{
// 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()
}
Burada ana noktalar
- Modelin güncellenmesi yan etkisizdir; gerçek yan etkiler, modeli güncelleyen işlemin dışında gerçekleşir.
- Yan etkinin sonucunu açıklayan bir olayın geri gelmesi gerekir.