Trả lời cho cuộc thảo luận muộn của Tim (cũng là một trong những ý kiến rất sớm từ Lev).
Là một trong những người tranh luận về việc tách lối ra khỏi các hàm hủy trong statechart (đối số dựa trên trường hợp sử dụng thực tế, về tương tác với thế giới thực, tức là I / O) khi nó được gửi tới Boost, tôi đồng ý rằng có thể có vấn đề trong việc thoát ra logic trong các hàm hủy. David Abrahams không có gì ngạc nhiên khi đưa ra những lập luận thuyết phục liên quan đến an toàn ngoại lệ. Vì những lý do đó, Statechart không yêu cầu bạn đưa logic vào các hàm hủy - nhưng nó cho phép bạn - với lời khuyên thông thường.
Logic chỉ nên chạy như một phần của quá trình chuyển đổi ra khỏi trạng thái (không phá hủy toàn bộ đối tượng statechart) có thể (và nếu có cả việc dọn dẹp tài nguyên để làm) được tách thành một hành động thoát () riêng biệt.
Đối với trạng thái "mỏng" không có trạng thái hoạt động (tài nguyên), chỉ cần thực hiện các hành động nhập / thoát, bạn có thể thực hiện các hành động đó trong ctor và d'tor và đảm bảo rằng hàm tạo và hàm hủy không ném. Không có lý do gì để họ - không có trạng thái thực hiện RAII trên - không có gì xấu khi xử lý lỗi ở những nơi này đưa ra các sự kiện thích hợp. Bạn vẫn có thể cần xem xét liệu bạn có muốn các hành động thoát làm thay đổi trạng thái bên ngoài để chạy khi phá hủy máy trạng thái hay không ... và đưa chúng vào hành động thoát nếu bạn không muốn chúng xảy ra trong trường hợp này ...
Mô hình Statechart kích hoạt như là khởi tạo một đối tượng, vì vậy nếu hàm tạo của bạn có công việc thực sự / kích hoạt / khởi tạo và nếu nó có thể thất bại thì trạng thái không thể được nhập vào Statechart hỗ trợ bằng cách cung cấp cho bạn khả năng ánh xạ ngoại lệ tới biến cố. Điều này được xử lý theo cách xây dựng hệ thống phân cấp trạng thái đang tìm kiếm trạng thái bên ngoài xử lý sự kiện ngoại lệ, tương tự như cách ngăn xếp sẽ không có kết quả cho mô hình gọi dựa trên ngăn xếp cuộc gọi.
Đây là tất cả tài liệu tốt - tôi khuyên bạn nên đọc tài liệu và thử nó. Tôi khuyên bạn nên sử dụng các hàm hủy để dọn sạch "tài nguyên phần mềm" và các hành động thoát để thực hiện "các hành động thoát trong thế giới thực".
Điều đáng chú ý là sự lan truyền ngoại lệ là một vấn đề trong tất cả các môi trường hướng sự kiện, không chỉ statecharts. Tốt nhất là lý do và bao gồm các lỗi / lỗi trong thiết kế statechart của bạn và nếu và chỉ khi bạn không thể xử lý chúng theo cách khác để ánh xạ ngoại lệ. Ít nhất điều đó làm việc cho tôi - ymmmv ....