2011-07-29 31 views
5

Tôi đang làm việc trên Windows. Tôi phải xem một số bộ API nhất định cho Windows 2008 trở lên và các bộ API khác nhau cho các hương vị khác của Windows. Tôi muốn biết cách tốt nhất để thiết kế loại đó của công cụ này là gì, do đó mã trình điều khiển chính của tôi không có #ifdefNền tảng mô hình thiết kế C++ cụ thể api

Ví dụ: Trong Windows 2008 Chúng tôi có API

EVT_HANDLE WINAPI EvtOpenLog(
    __in EVT_HANDLE Session, 
    __in LPCWSTR Path, 
    __in DWORD Flags 
); 

và Đối với Windows 2003, chúng tôi có một API khác cũng vậy.

HANDLE OpenEventLog(
    __in LPCTSTR lpUNCServerName, 
    __in LPCTSTR lpSourceName 
); 

Điều tôi đang tìm kiếm là có một số loại trình bao bọc API trong mã của tôi để xử lý nội bộ các cuộc gọi này.

+0

Bạn có nói rằng bạn muốn mã trình điều khiển chính của bạn sử dụng cùng một API cấp cao bất kể API phụ thuộc vào hương vị cơ bản không? –

+0

có thể là GUIFactory trong sách thiết kế mẫu. bạn có thể đưa ra một số ví dụ về apis nào và khác biệt như thế nào? –

Trả lời

6

Bạn có thể viết Lớp trừu tượng nền tảng, sẽ hiển thị giao diện chung cho tất cả các loại api và cho mỗi cổng thì bạn có thể triển khai giao diện. Bạn có thể cung cấp sự trừu tượng hóa như là một thư viện riêng biệt cho mỗi cổng để đảm bảo rằng ứng dụng gọi điện của bạn vẫn giữ nguyên chỉ thư viện được thay đổi liên kết.

+0

Về cơ bản đây là con đường để đi. Có hai cách để thực hiện nó, hoặc sử dụng một lớp riêng biệt cho mỗi nền tảng theo một giao diện chung hoặc bạn sử dụng một Mặt tiền có tất cả các ifdef trong mã. Trong trường hợp thứ hai bạn không cần một lớp và chỉ có thể có chức năng đứng một mình. – rioki

0

Một cách tiếp cận sẽ là có giao diện trong tiêu đề không thay đổi và có các tệp .cpp riêng biệt cho mỗi nền tảng mà bạn yêu cầu. Sau đó, bạn chỉ biên dịch .cpp mà bạn cần cho một nền tảng nhất định.

Cách tiếp cận thứ hai là có một giao diện lớp cơ sở không thay đổi và có các lớp con sửa đổi mã khi cần thiết thông qua các hàm ảo, nhưng tôi không khuyên bạn sử dụng phương pháp này.

Tuy nhiên, một cách tiếp cận khác sẽ là sử dụng một cái gì đó giống như thành ngữ PIMPL (con trỏ để triển khai). Cách tiếp cận này sẽ cho phép giao diện tiêu đề của bạn không bao giờ thay đổi và cũng sẽ ẩn tất cả dữ liệu nền tảng cụ thể trong việc triển khai lớp riêng tư. Here's a semi-decent article on this design pattern.

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