2012-05-15 24 views
11

Tôi phải đối mặt với câu hỏi hóc búa sau: Phần mềm của chúng tôi có một lớp cơ sở trừu tượng cho các đối tượng thuật toán. Tất cả các đối tượng này có một execute() phương pháp phổ biến, ví dụ .:Generic (gần như) tự mô tả các thông số trong C++ cùng với một GUI?

class Algorithm 
{ 
public: 
    // [...] 
    virtual void execute() = 0; 
    // [...] 
}; 

Đối với mỗi thuật toán mà chúng tôi muốn thực hiện, chúng tôi chỉ đơn giản là kế thừa từ lớp cơ sở và lưu trữ tất cả đối tượng thuật toán nạp trong một vị trí trung tâm. Càng xa càng tốt.

Sự cố hiện nằm trong các tham số của thuật toán. Chúng tôi muốn có thể mô tả cho mỗi thuật toán các tham số cần được thiết lập (bởi một lớp bên ngoài). Để kết thúc này, chúng tôi đã cho mỗi thuật toán một đối tượng ParameterList có chứa các tham số của nó. Tôi nên làm rõ điều đó đối với chúng tôi, một tham số bao gồm một số loại hình (chẳng hạn như int) và một nhãn (chẳng hạn như "Số lần lặp lại).

Vấn đề bây giờ bắt đầu khi chúng tôi muốn kết nối ParameterList cho một số loại Rõ ràng, các thuật toán của chúng ta sẽ không có "kiến thức" về API đồ họa (Qt, GTK, vv) mà chúng ta đang sử dụng. Tuy nhiên, ở cùng một khía cạnh, chúng ta muốn có thể mô tả các tham số thuật toán ngữ nghĩa, ví dụ bằng cách xác định rằng các thuật toán đòi hỏi một filename. Làm thế nào đây filename sau đó được hiển thị lên đến GUI.

có cách nào để kết hợpnày 210 với một số loại kiến ​​thức ngữ nghĩa?

Tôi nhận thấy rằng câu hỏi này nghe có vẻ rất mơ hồ. Tuy nhiên, tôi không được phép đăng bất kỳ ví dụ mã không tầm thường nào (vì lý do NDA). Vì vậy, có ai đã phải đối mặt với một vấn đề tương tự trong quá khứ?

Để kết thúc: Chúng tôi muốn các đối tượng của mình mô tả các tham số mà chúng yêu cầu đối với GUI, mà không biết chi tiết chính xác của GUI.

+1

OK, xem, * đó là * một câu hỏi hay. Và từ một poster mới, quá. Có hy vọng, sau khi tất cả. –

+0

phương thức ảo khác được triển khai trong mỗi lớp thuật toán cung cấp danh sách các tham số và thông tin cần thiết trên loại (tên tệp -> sau đó là trường văn bản có nút mở tệp, số nguyên -> nút quay ...) v.v. ... GUI yêu cầu các tham số hiển thị cho bản ngã được thực hiện ... tại sao không? – ShinTakezou

Trả lời

9

Một tùy chọn ở đây có thể là sử dụng mẫu khách truy cập. Bạn có thể tạo một lớp cơ sở như thế này:

class Parameter { 
public: 
    virtual ~Parameter() {} // Polymorphic classes need virtual dtors. 

    virtual void accept(ParameterVisitor& v) = 0; 
}; 

Bạn có thể định nghĩa các lớp con như thế này:

class IntParameter: public Parameter { 
public: 
    virtual void accept(ParameterVisitor& v) { 
      v.visit(*this); 
    } 
}; 
class FilenameParameter: public Parameter { 
public: 
    virtual void accept(ParameterVisitor& v) { 
      v.visit(*this); 
    } 
}; 

Lưu ý rằng trong mỗi chức năng accept thành viên, loại *this là loại tĩnh của lớp - cụ thể là, IntParameter& trong trường hợp đầu tiên và FilenameParameter& trong trường hợp thứ hai.

Sau đó bạn có thể định nghĩa một lớp cơ sở ParameterVisitor lớp như thế này:

class ParameterVisitor { 
public: 
    virtual ~ParameterVisitor() {} // Polymorphic classes need virtual dtors. 

    virtual void visit(IntParameter& p) {} 
    virtual void visit(FilenameParameter& p) {} 
    /* .. etc. .. */ 
}; 

Sau đó bạn có thể phân lớp khách truy cập này để lấy lại thông tin loại:

class Gui1ParameterVisitor: public ParameterVisitor { 
public: 
    virtual void visit(IntParameter& p) { 
     /* ... use GUI1 to create a field for an integer. */ 
    } 
    virtual void visit(FilenameParameter& p) { 
     /* ... use GUI1 to create a field for a filename. */ 
    } 
}; 

class Gui2ParameterVisitor: public ParameterVisitor { 
public: 
    virtual void visit(IntParameter& p) { 
     /* ... use GUI2 to create a field for an integer. */ 
    } 
    virtual void visit(FilenameParameter& p) { 
     /* ... use GUI2 to create a field for a filename. */ 
    } 
}; 

lớp ParameterList của bạn có thể sau đó chỉ cần lưu trữ danh sách Parameter* s. Sau đó, bạn có thể xây dựng GUI bằng cách khởi tạo loại khách truy cập thích hợp và sau đó có các cuộc gọi lại visit làm tất cả công việc xây dựng tiện ích con. Điều này kết thúc là an toàn loại và phục hồi thông tin bạn cần. Nó có nhược điểm là mỗi khi bạn tạo một kiểu tham số mới, bạn phải thêm một hàm thành viên mới visit vào lớp ParameterVisitor, nhưng bạn vẫn cần phải làm điều đó để thực hiện tất cả việc xây dựng GUI.

Hy vọng điều này sẽ hữu ích!

+0

điều này là thú vị, nhưng không phải là nó quá phức tạp? Tại sao không phải là một metainformation rất đơn giản về mỗi thông số, mô tả các loại có thể từ đó GUI giải nén giao diện cần thiết? Phân loại "ffi" cho GUI ... hoặc tương tự – ShinTakezou

+1

Vấn đề với metainformation là để xử lý mọi thứ một cách tổng quát, bạn sẽ cần phải thêm một loạt các mã của biểu mẫu "nếu đây là một trường int, đây là cách bạn tạo tiện ích, dưới đây là cách bạn diễn giải tiện ích, v.v. " Cách tiếp cận trên thực hiện điều này theo cách an toàn không yêu cầu bất kỳ phép đúc nào. – templatetypedef

+0

ah, tất nhiên tôi thiếu phần "phản hồi" đặt giá trị được chọn trong GUI trở lại đối tượng. Ok, bây giờ tôi thấy nó :) – ShinTakezou

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