W odpowiedzi na późne wejście Tima do dyskusji (która dotyczy również jednego z bardzo wczesnych komentarzy Lwa).
Jako jeden z tych, którzy argumentowali za separacją wyjścia od destruktorów w statechart (argument oparty na prawdziwym przypadku użycia, o interakcji z rzeczywistym światem, tj. I / O) dawno temu, kiedy został przesłany do Boost, zgadzam się, że mogą wystąpić problemy z umieszczeniem wyjścia logika w destruktorach. Nie jest zaskakujące, że David Abrahams przedstawił przekonujące argumenty dotyczące również bezpieczeństwa wyjątków. Z tych powodów Statechart nie wymaga umieszczania logiki w destruktorach - ale pozwala - zgodnie ze zwykłymi radami.
Logika, która powinna zawsze działać tylko jako część przejścia ze stanu (a nie zniszczenia obiektu stanu stanu jako całości), może (i powinna, jeśli trzeba wykonać również czyszczenie zasobów), zostać rozdzielona na osobną akcję exit ().
W przypadku „cienkiego” stanu bez aktywnego stanu (zasobów), wystarczy wykonać akcje wejścia / wyjścia, możesz wykonać te akcje w ctor i d'tor i upewnić się, że konstruktor i destruktor nie rzucają. Nie ma powodu, aby - nie ma stanu, na którym mógłby wykonać RAII - nie ma nic złego w tym, że obsługa błędów w tych miejscach wywołuje odpowiednie zdarzenia. Nadal może być konieczne rozważenie, czy chcesz, aby akcje wyjścia, które zmieniają stan zewnętrzny, były uruchamiane po zniszczeniu automatu stanowego ... i umieść je w akcji wyjścia, jeśli nie chcesz, aby występowały w tym przypadku ...
Statechart modeluje aktywację jako instancję obiektu, więc jeśli twój konstruktor ma do wykonania rzeczywistą pracę / aktywację / instancję i jest w stanie zawieść, tak że stan nie może zostać wprowadzony, Statechart obsługuje to, dając ci możliwość zmapowania wyjątku do zdarzenie. Jest to obsługiwane w sposób, który działa w górę hierarchii stanów w poszukiwaniu stanu zewnętrznego, który obsługuje zdarzenie wyjątku, analogicznie do sposobu, w jaki stos zostałby rozwinięty w modelu wywołania opartym na stosie wywołań.
To wszystko jest dobrze udokumentowane - sugeruję przeczytanie dokumentacji i wypróbowanie tego. Sugeruję, abyś używał destruktorów do czyszczenia „zasobów oprogramowania” i akcji wyjścia w celu wykonania „akcji wyjścia w świecie rzeczywistym”.
Warto zauważyć, że propagacja wyjątków jest pewnym problemem we wszystkich środowiskach sterowanych zdarzeniami, a nie tylko w wykresach stanu. Najlepiej jest rozważać i uwzględniać błędy / błędy w projekcie swojego wykresu stanu i wtedy i tylko wtedy, gdy nie możesz sobie z nimi poradzić w inny sposób, skorzystaj z mapowania wyjątków. Przynajmniej to działa dla mnie - ymmmv ....