2008-08-11 32 views
15

Có quy trình chung cho khả năng mở rộng lập trình vào mã của bạn không?Đề xuất để thêm khả năng của plugin?

Tôi tự hỏi quy trình chung là thêm khả năng loại tiện ích vào hệ thống bạn đang viết để chức năng có thể được mở rộng thông qua một số API plugin thay vì phải sửa đổi mã lõi của hệ thống.

Những việc như vậy có xu hướng phụ thuộc vào ngôn ngữ mà hệ thống đã được viết hoặc có phương pháp chung để cho phép điều này không?

Trả lời

3

Đây thường là thứ mà bạn sẽ phải tự phơi bày, vì vậy có, nó sẽ phụ thuộc vào ngôn ngữ mà hệ thống của bạn được viết (mặc dù thường có thể viết trình bao bọc cho các ngôn ngữ khác).

Nếu, ví dụ, bạn có một chương trình được viết bằng C, cho Windows, các plugin sẽ được viết cho chương trình của bạn dưới dạng tệp DLL. Khi chạy, bạn sẽ tải các DLL này theo cách thủ công và hiển thị một số giao diện cho chúng. Ví dụ, các DLL có thể trưng ra một hàm gimme_the_interface() có thể chấp nhận một cấu trúc chứa đầy các con trỏ hàm. Những con trỏ chức năng này sẽ cho phép DLL thực hiện cuộc gọi, đăng ký callbacks, vv

Nếu bạn ở trong C++, bạn sẽ sử dụng hệ thống DLL, ngoại trừ bạn có thể vượt qua một đối tượng thay vì cấu trúc. thực hiện một giao diện cung cấp chức năng (hoàn thành điều tương tự như cấu trúc, nhưng ít xấu xí hơn). Đối với Java, bạn sẽ tải các tệp lớp theo yêu cầu thay vì các tệp DLL, nhưng ý tưởng cơ bản sẽ giống nhau.

Trong mọi trường hợp, bạn sẽ cần xác định giao diện chuẩn giữa mã và plugin để bạn có thể khởi chạy plugin và các plugin có thể tương tác với bạn.

P.S. Nếu bạn muốn xem ví dụ điển hình về hệ thống plugin C++, hãy xem foobar2000 SDK. Tôi đã không sử dụng nó trong một thời gian, nhưng nó được sử dụng để thực sự được thực hiện tốt. Tôi cho rằng nó vẫn là.

+0

Vâng, tôi sợ nó sẽ là một câu trả lời như thế này. Tuy nhiên, ngược lại là nó có nghĩa là bạn có toàn quyền kiểm soát những plugin nào tôi có thể làm. – kaybenleroll

1
  1. Tìm hiểu xem bạn muốn đặt lại số lần tối thiểu nào trên trình tạo plugin. Sau đó, tạo một hoặc nhiều Giao diện mà người viết phải triển khai cho mã của bạn để biết khi nào và ở đâu để thực thi mã.

  2. Tạo API mà người viết có thể sử dụng để truy cập một số chức năng trong mã của bạn.

Bạn cũng có thể tạo lớp cơ sở mà người viết phải kế thừa. Điều này sẽ làm cho việc kết nối API dễ dàng hơn. Sau đó, sử dụng một số loại phản ánh để quét một thư mục và tải các lớp bạn tìm thấy phù hợp với yêu cầu của bạn.

Một số người cũng tạo ngôn ngữ kịch bản cho hệ thống của họ hoặc triển khai thông dịch viên cho một tập hợp con của một ngôn ngữ hiện có. Đây cũng là một con đường có thể đi.

Điểm mấu chốt là: Khi bạn lấy mã để tải, chỉ có trí tưởng tượng của bạn mới có thể ngăn bạn.
Chúc may mắn.

4

Tôi đã sử dụng API dựa trên sự kiện cho plugin trong quá khứ. Bạn có thể chèn các móc cho các trình cắm thêm bằng cách gửi đi các sự kiện và cung cấp quyền truy cập vào trạng thái ứng dụng.Ví dụ, nếu bạn đang viết một ứng dụng viết blog, bạn có thể muốn nâng một sự kiện ngay trước khi một bài đăng mới được lưu vào cơ sở dữ liệu và cung cấp HTML bài đăng cho plugin để thay đổi khi cần thiết.

2

Tôi bị cám dỗ để chỉ cho bạn cuốn sách Design Patterns cho câu hỏi chung chung này: p

Nghiêm túc, tôi nghĩ câu trả lời là không. Bạn không thể viết mã mở rộng theo mặc định, sẽ khó để viết/mở rộng và không hiệu quả một cách khủng khiếp (Mozilla bắt đầu với ý tưởng là XPCOM rất có thể mở rộng, được sử dụng ở mọi nơi, và bây giờ họ nhận ra đó là một sai lầm và bắt đầu xóa nó nơi nó không có ý nghĩa).

điều cần làm là xác định các phần của hệ thống có thể mở rộng có ý nghĩa và hỗ trợ API thích hợp cho các trường hợp này (ví dụ: plugin hỗ trợ ngôn ngữ trong trình chỉnh sửa). Bạn sẽ sử dụng các mẫu có liên quan, nhưng việc triển khai cụ thể tùy thuộc vào lựa chọn nền tảng/ngôn ngữ của bạn.

IMO, nó cũng giúp sử dụng ngôn ngữ động - giúp bạn có thể tinh chỉnh mã lõi vào thời gian chạy (khi thật cần thiết). Tôi đánh giá cao khả năng mở rộng của Mozilla hoạt động theo cách đó khi viết các phần mở rộng của Firefox.

1

Nếu bạn đang sử dụng ngôn ngữ được biên dịch như C hoặc C++, bạn nên xem xét hỗ trợ plugin thông qua ngôn ngữ kịch bản. Cả Python và Lua là các ngôn ngữ tuyệt vời được sử dụng để viết một số lượng lớn các ứng dụng (Civ4 và Blender sử dụng Python, Supreme Commander sử dụng Lua, v.v.).

Nếu bạn đang sử dụng C++, hãy xem thư viện tăng trăn. Nếu không, python sẽ phân phối các tiêu đề có thể được sử dụng trong C, và thực hiện một công việc khá tốt để ghi lại API C/python. Các tài liệu dường như ít hoàn thành cho Lua, nhưng tôi có thể không có được tìm kiếm đủ cứng. Dù bằng cách nào, bạn có thể cung cấp một nền tảng kịch bản khá vững chắc mà không có số lượng công việc khủng khiếp. Nó vẫn không phải là tầm thường, nhưng nó cung cấp cho bạn một cơ sở rất tốt để làm việc.

2

Tôi nghĩ có hai khía cạnh cho câu hỏi của bạn:

Thiết kế của hệ thống được mở rộng (các mẫu thiết kế, đảo ngược tầm kiểm soát và các khía cạnh kiến ​​trúc khác) (http://www.martinfowler.com/articles/injection.html). Và, ít nhất với tôi, có những mô hình/kỹ thuật này là nền tảng/ngôn ngữ độc lập và có thể được xem như là một "thủ tục chung".

Bây giờ, thực hiện của họ là ngôn ngữ và nền tảng dependend (ví dụ như trong C/C++ bạn có những thứ thư viện năng động, vv)

Vài 'khung' đã được phát triển để cung cấp cho bạn một môi trường lập trình cung cấp cho bạn khả năng cắm/mở rộng nhưng như một số người khác đề cập đến, đừng quá điên rồ làm mọi thứ có thể cắm được.

Trong thế giới Java một đặc điểm kỹ thuật tốt để xem xét là OSGi (http://en.wikipedia.org/wiki/OSGi) với một số triển khai một IMHO tốt nhất là Equinox (http://www.eclipse.org/equinox/)

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