Tôi đã được cung cấp một số mã Java để xem xét, mô phỏng một cuộc đua xe hơi, trong đó bao gồm việc triển khai một máy trạng thái cơ bản. Đây không phải là một máy trạng thái khoa học máy tính cổ điển, mà chỉ là một đối tượng có thể có nhiều trạng thái và có thể chuyển đổi giữa các trạng thái của nó dựa trên một loạt các tính toán.
Để chỉ mô tả vấn đề, tôi đã có một lớp Xe hơi, với một lớp enum lồng nhau xác định một số hằng số cho trạng thái của Xe (như TẮT, IDLE, DRIVE, REVERSE, v.v.). Trong cùng một lớp Xe này, tôi có một chức năng cập nhật, về cơ bản bao gồm một câu lệnh chuyển đổi lớn, chuyển sang trạng thái hiện tại của ô tô, thực hiện một số tính toán và sau đó thay đổi trạng thái của ô tô.
Theo như tôi có thể thấy, trạng thái Cars chỉ được sử dụng trong lớp riêng của nó.
Câu hỏi của tôi là, đây có phải là cách tốt nhất để đối phó với việc thực hiện một bộ máy nhà nước có bản chất được mô tả ở trên? Nghe có vẻ như là giải pháp rõ ràng nhất, nhưng trong quá khứ tôi luôn nghe rằng "các câu lệnh chuyển đổi là xấu".
Vấn đề chính tôi có thể thấy ở đây là câu lệnh chuyển đổi có thể trở nên rất lớn khi chúng ta thêm nhiều trạng thái (nếu thấy cần thiết) và mã có thể trở nên khó sử dụng và khó bảo trì.
Điều gì sẽ là một giải pháp tốt hơn cho vấn đề này?
object.state = object.function(object.state);