2010-03-04 48 views
6

Tôi thấy mình làm điều này theo thời gian, và tôi tự hỏi nếu đó là một mùi thiết kế, hoặc nếu có một mẫu thiết kế tốt hơn tôi có thể sử dụng.Lặp lại một danh sách các loại

Có một quy trình với một số bước được biết đến tại thời gian biên dịch, nhưng có khả năng thay đổi trên đường. Tôi nắm bắt tính phổ biến trong một lớp Step trừu tượng, viết một StepLister trả về một danh sách các bước, một cho mỗi lớp dẫn xuất của Bước, và sau đó một StepsRunner gọi StepLister, sau đó lặp lại trong danh sách và chạy từng bước. Đôi khi một bước sẽ phụ thuộc vào kết quả của bước trước đó, đôi khi không.

Mọi đề xuất?

Trả lời

2

Cách tiếp cận của bạn có vẻ hợp lý với tôi (kết hợp các trình lặp/chiến lược).

Đôi khi một bước sẽ phụ thuộc vào kết quả của bước trước đó, đôi khi không.

Điểm này có thể là điều thú vị. Vì tôi không biết mỗi bước phải làm gì đặc biệt, tôi không thể đưa ra ý tưởng gì ngoài những ý tưởng chung chung.

Phụ thuộc giữa tất cả các bước có thể được lập mô hình thông qua cây cú pháp interpreter-like thay vì các bước tuần tự bạn thực hiện. Do đó, StepRunner của bạn sẽ bị loại bỏ theo các phương thức ngữ cảnh/giải thích. Một ý tưởng khác có thể là sử dụng monads, cho phép bạn liên tục dán các bước lại với nhau, nhưng tôi không biết điều này sẽ dễ dàng tích hợp khái niệm hướng đối tượng hiện tại của bạn như thế nào (vì monads thường được sử dụng trong chức năng programming).

Có lẽ bạn không cần phải (quá mức) làm phức tạp mọi thứ ở tất cả;)

1

Tôi không chắc chắn tôi hiểu câu hỏi đúng, nhưng kể từ khi bạn đang chạy bước theo thứ tự, tôi sẽ giả sử rằng có một số thông tin theo ngữ cảnh được lưu giữ và do đó bạn đang nói về việc chọn bước tiếp theo dựa trên kết quả của hiện tại.

Điều này, trên thực tế, những gì một automaton là về. Bạn có các trạng thái khác nhau được liên kết với nhau bằng các hiệu ứng chuyển tiếp.

Rất dễ dàng để yêu cầu mỗi bước trả lại một số tag, có lẽ chỉ đơn thuần là một chuỗi hoặc một loại được xác định phù hợp.

Sau đó, bạn xác định ô tô bằng cách xác định bước tiếp theo cho mỗi đầu ra có thể có của bước hiện tại. Ví dụ, tôi thực sự sử dụng một khung công tác (tại nơi làm việc) để chuyển các tệp đó thành tệp xml ... mặc dù tôi không thích thực tế là có rất ít kiểm tra được thực hiện trên toàn bộ hoặc không được chuyển đổi được xác định chính xác.

Lưu ý rằng trong C++ nó có thể được kiểm tra tại thời gian biên dịch (Tôi đang nghĩ đến việc sử dụng Boost.Variant và một số thủ thuật lập trình metatemplate).

Các vấn đề liên quan