Kiến trúc mô đun cho đường ống xử lý


8

Tôi đang cố gắng thiết kế kiến ​​trúc của một hệ thống mà tôi sẽ triển khai trong C ++ và tôi đã tự hỏi liệu mọi người có thể nghĩ ra một cách tiếp cận tốt hay phê phán cách tiếp cận mà tôi đã thiết kế cho đến nay.

Trước hết, vấn đề chung là một đường ống xử lý hình ảnh. Nó chứa một số giai đoạn và mục tiêu là thiết kế một giải pháp có tính mô đun cao, sao cho bất kỳ giai đoạn nào cũng có thể dễ dàng hoán đổi và thay thế bằng một đoạn mã tùy chỉnh (để người dùng có thể tăng tốc độ nếu họ biết rằng một giai đoạn nhất định bị hạn chế theo một cách nhất định trong vấn đề của mình).

Suy nghĩ hiện tại là một cái gì đó như thế này:

struct output; /*Contains the output values from the pipeline.*/

class input_routines{
    public:
    virtual foo stage1(...){...}
    virtual bar stage2(...){...}
    virtual qux stage3(...){...}
    ...
}

output pipeline(input_routines stages);

Điều này sẽ cho phép mọi người phân lớp input_routines và ghi đè bất kỳ giai đoạn nào họ muốn. Điều đó nói rằng, tôi đã làm việc trong các hệ thống như thế này trước đây và tôi thấy phân lớp và các công cụ mặc định có xu hướng lộn xộn, và có thể khó sử dụng, vì vậy tôi không ham chơi về việc tự viết một cái. Tôi cũng đã suy nghĩ về một cách tiếp cận STLish hơn, trong đó các giai đoạn khác nhau (có 6 hoặc 7) sẽ được mặc định các tham số mẫu.

Bất cứ ai cũng có thể đưa ra một lời phê bình về mô hình ở trên, suy nghĩ về cách tiếp cận mẫu hoặc bất kỳ kiến ​​trúc nào khác xuất hiện trong tâm trí?


1
Bạn có chắc chắn không muốn sử dụng ngôn ngữ gia đình Lisp cho loại dự án này?
Công việc

Ồ, tôi chắc chắn muốn sử dụng ngôn ngữ gia đình Lisp cho dự án này, một cách bi thảm, tôi đang thêm chức năng vào thư viện hình ảnh C ++ hiện có.
anjruu

Câu trả lời:


2

Thiết kế phụ thuộc nhiều vào những gì các giai đoạn khác nhau thực sự làm. Tôi chủ yếu thích các hàm ảo thuần túy hơn các hàm ảo không thuần túy (các lớp trừu tượng).

Các giai đoạn phổ biến có thể được nhóm lại với nhau trong các lớp con trừu tượng. Bằng cách xuất phát từ lớp trừu tượng chính, bạn vẫn có thể điều chỉnh mọi giai đoạn, nhưng bằng cách xuất phát từ một lớp con, bạn có thể sử dụng lại hành vi hiện có đã được viết. Nó có xu hướng ít lộn xộn hơn, như bạn đề cập cho các phương thức ảo.

Nếu các giai đoạn khác nhau cũng có thể tự tồn tại (bên ngoài toàn bộ đường ống), cũng xem xét các lớp viết để ngăn cách hành vi này.


2

Có thể tạo một danh sách các functor trong một nhà máy, thực hiện các giai đoạn. Mã giả:

functorFactory() {
  return [ foo(), bar(), baz() ]
}

Người dùng có thể thực hiện lại nhà máy hoặc chỉ thao túng danh sách functor. Mã giả

myFactory() {
  return [ foo(), myBar() ]
}

hoặc là

myFactory() {
  return functorFactory()[2] = myBar()
}

Khi thiết lập xong, bạn có thể gọi từng functor bằng kết quả cuối cùng.


+1: điều này mang lại sự linh hoạt tối đa, vì người dùng được phép thực sự thêm các bước / loại bỏ các bước nếu họ muốn.
Matthieu M.

1
Điều đó có vẻ tuyệt vời, nhưng làm thế nào tôi thực hiện điều này trong C ++? Tôi không thể có một mảng các con trỏ hàm, vì mỗi con trỏ hàm sẽ có một kiểu khác nhau nếu các hàm trả về những thứ khác nhau và các mảng chỉ có thể giữ các đối tượng cùng loại. Cảm ơn!
anjruu

0

Hãy xem Monads như được triển khai trong Haskell, điều đó có thể cho bạn ý tưởng hay về cách thiết lập mọi thứ. Haskell có loại điều này thực sự đúng.


0

Tôi sẽ xác định một loại trung gian. Tất cả các hình ảnh sẽ được chuyển đổi sang định dạng này; mỗi giai đoạn sẽ lấy một Trung cấp và trả lại một Trung cấp - không phải cùng một giai đoạn, một giai đoạn mới.

Một giai đoạn sẽ là thế này:

Intermediate DoSomething(const Intermediate &i);

Tôi thường tránh các giải pháp dựa trên kế thừa nói chung trừ khi chúng là một bản đồ khá rõ ràng về vấn đề, ví dụ, các đối tượng trong thế giới 3D.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.