Tôi đang ở trong một dự án hệ thống phân tán được viết bằng java nơi chúng tôi có một số lớp tương ứng với các đối tượng kinh doanh trong thế giới thực rất phức tạp. Các đối tượng này có rất nhiều phương thức tương ứng với các hành động mà người dùng (hoặc một số tác nhân khác) có thể áp dụng cho các đối tượng đó. Kết quả là, các lớp này trở nên rất phức tạp.
Cách tiếp cận kiến trúc chung của hệ thống đã dẫn đến rất nhiều hành vi tập trung vào một vài lớp và rất nhiều tình huống tương tác có thể xảy ra.
Để làm ví dụ và để giữ mọi thứ dễ dàng và rõ ràng, hãy nói rằng Robot và Xe hơi là các lớp trong dự án của tôi.
Vì vậy, trong lớp Robot tôi sẽ có rất nhiều phương thức theo mẫu sau:
- ngủ(); isS ngủAvaliable ();
- thức giấc(); isAwakeAvaliable ();
- đi bộ (Hướng); isWalkAvaliable ();
- bắn (Hướng); isShootAvaliable ();
- TurnOnAlert (); isTurnOnAlertAv Available ();
- lần lượt TắtAlert (); isTurn OfferAlertAv Available ();
- nạp điện(); isRechargAv Available ();
- tắt nguồn(); isPowerPackAv Available ();
- stepInCar (Xe hơi); isStepInCarAv Available ();
- stepOutCar (Xe hơi); isStepOutCarAv Available ();
- tự hủy(); isSelfDesturationAv Available ();
- chết(); isDieAv Available ();
- isAlive (); la thưc tỉnh(); isAlertOn (); getBatteryLevel (); getCienRidingCar (); getAmmo ();
- ...
Trong lớp Xe hơi, nó sẽ tương tự:
- bật(); isTurnOnAvaliable ();
- tắt(); isTurn OfferAvaliable ();
- đi bộ (Hướng); isWalkAvaliable ();
- tiếp nhiên liệu (); isRefuelAv Available ();
- tự hủy(); isSelfDesturationAv Available ();
- tai nạn(); isCrashAv Available ();
- isOperational (); isOn (); getFuelLevel (); getCienPasbah ();
- ...
Mỗi trong số này (Robot và Xe hơi) được triển khai như một cỗ máy trạng thái, trong đó một số hành động có thể xảy ra ở một số tiểu bang và một số thì không. Các hành động thay đổi trạng thái của đối tượng. Các phương thức hành động ném IllegalStateException
khi được gọi ở trạng thái không hợp lệ và các isXXXAvailable()
phương thức cho biết liệu hành động đó có khả thi tại thời điểm đó hay không. Mặc dù một số người dễ dàng suy luận từ trạng thái (ví dụ, ở trạng thái ngủ, tỉnh táo là có sẵn), một số không (để bắn, nó phải tỉnh táo, còn sống, có đạn và không đi xe hơi).
Hơn nữa, các tương tác giữa các đối tượng cũng phức tạp. Ví dụ, Xe chỉ có thể chứa một hành khách Robot, vì vậy nếu một người khác cố gắng vào, một ngoại lệ sẽ bị ném; Nếu xe gặp nạn, hành khách sẽ chết; Nếu robot chết trong xe, anh ta không thể bước ra ngoài, ngay cả khi chính Xe vẫn ổn; Nếu Robot ở trong Xe, anh ta không thể vào xe khác trước khi bước ra ngoài; Vân vân.
Kết quả của điều này, như tôi đã nói, các lớp này trở nên thực sự phức tạp. Để làm cho mọi thứ tồi tệ hơn, có hàng trăm tình huống có thể xảy ra khi Robot và Xe tương tác. Hơn nữa, phần lớn logic đó cần phải truy cập dữ liệu từ xa trong các hệ thống khác. Kết quả là việc kiểm tra đơn vị trở nên rất khó khăn và chúng tôi có rất nhiều vấn đề kiểm thử, một vấn đề gây ra vấn đề khác trong một vòng luẩn quẩn:
- Các thiết lập testcase rất phức tạp, bởi vì chúng cần tạo ra một thế giới phức tạp đáng kể để thực hiện.
- Số lượng bài kiểm tra là rất lớn.
- Bộ thử nghiệm mất vài giờ để chạy.
- Phạm vi kiểm tra của chúng tôi là rất thấp.
- Mã kiểm tra có xu hướng được viết vài tuần hoặc vài tháng so với mã mà họ kiểm tra hoặc hoàn toàn không bao giờ.
- Rất nhiều thử nghiệm cũng bị hỏng, chủ yếu là do các yêu cầu của mã thử nghiệm đã thay đổi.
- Một số tình huống rất phức tạp, đến nỗi chúng không hết thời gian chờ trong quá trình thiết lập (chúng tôi đã định cấu hình thời gian chờ trong mỗi thử nghiệm, trong trường hợp xấu nhất là 2 phút và thậm chí thời gian này chúng hết thời gian, chúng tôi đảm bảo rằng đó không phải là một vòng lặp vô hạn).
- Lỗi thường xuyên trượt vào môi trường sản xuất.
Kịch bản Robot và Xe hơi đó là sự đơn giản hóa quá mức những gì chúng ta có trong thực tế. Rõ ràng, tình trạng này là không thể quản lý. Vì vậy, tôi đang yêu cầu trợ giúp và gợi ý để: 1, Giảm độ phức tạp của các lớp; 2. Đơn giản hóa các kịch bản tương tác giữa các đối tượng của tôi; 3. Giảm thời gian thử nghiệm và sửa đổi mã cần kiểm tra.
EDIT:
Tôi nghĩ rằng tôi đã không rõ ràng về các máy nhà nước. Robot tự nó là một cỗ máy trạng thái, với các trạng thái "ngủ", "thức", "sạc lại", "chết", v.v ... Xe là một cỗ máy trạng thái khác.
EDIT 2: Trong trường hợp bạn tò mò về hệ thống của tôi thực sự là gì, các lớp tương tác là những thứ như Server, IPAddress, Disk, Backup, User, SoftwareLicense, v.v. Kịch bản Robot và xe hơi chỉ là một trường hợp mà tôi tìm thấy Điều đó đủ đơn giản để giải thích vấn đề của tôi.