Pisanie aplikacji z obsługą wtyczek

0

Na rynku istnieje multum aplikacji które można rozszerzać wtyczkami, np przeglądarki internetowe, odtwarzacze audio (winamp/aimp/foobar...), komunikatoryIM itd.

Zastanawiam się, jak się tworzy takie aplikacje, czym się kierować, jak podejść do zagadnienia aby aplikacja była 'developer friendly' dla tworzenia wtyczek, i żeby one miały sens (czytaj mogły dosyć mocno ingerować w działanie samej aplikacji).

Czy to polega po prostu na tym, by wystawić swoje metody/api?
Domyślam się, że cała aplikacja powinna być zaprojektowana w tym aspekcie.
Jakby ktoś mógł mnie nakierować, wskazać materiały albo napisać coś od siebie z doświadczenia, będę wdzięczny ;)

Aby nie było tak abstrakcyjnie - chcę napisać sobie w pythonie aplikację, która będzie miała 2 wtyczki, jedna to wysylanie plików na ftp/sftp, a druga to klient gg...
Oczywiście to tylko po to, by się czegoś nowego nauczyć.

0

Sposobów jest dużo. Począwszy od użycia gotowej platformy komponentowej (dla Javy np. Eclipse RCP albo OSGi).
Jeśli nie chcesz nic nowego to zapewne będzie ci potrzebny kontener IoC do składania aplikacji, a w samej aplikacji miejsca w których będziesz z kontenera wyciągał sobie odpowiednie obiekty i ich używał.
Pewne szczególne wtyczki można by też zrealizować za pomocą AoP, ale akurat nie w przypadku o którym mówisz.

1

To co ma mój system wtyczek do PHP:

  • automatyczne ładowanie kodu i inicjowanie który jest po prostu wgrany w odpowiednie miejsce

  • najlepiej wtyczka jeśli mieści się w jednym, swoim katalogu typu \plugins\moja_wtyczka*

  • obsługa zdarzeń: pewne moduły generują zdarzenia, które wtyczki mogą zacząć obserwować (register/unregister lub hook/unhook) i reagować na nie (GoF się kłania)
    przykłady: "plugins-all-loaded", "app-before-close", "doc-before-close", "text-buffor-changed", "doc-before-print", "doc-saved" etc.

  • przydaje się rejestr obiektów (register), czyli:

    • activeDoc = dynamic_cast<DocManagerIntf *>(oregister["doc-manager"]).getActiveDoc()
      (jest to zamiana singletonów na interfejsy, zmiejsza zależność pluginów od konkretnych klas / definicji)
  • dobrze jeśli wtyczki ładują się etapowo:
    a) dla każdej wtyczki:
    a.1) załadowanie kodu i uruchomienie inicjalizacji
    b) wszystkie wtyczki załadowane
    c) dla każdej wtyczki:
    c.1) uruchomienie funkcji / wywołanie zdarzenia "wszystkie wtyczki załadowane"

  • dzięki tej etapowości nie masz problemu (lub jest mniejszy) z zależnościami cyklicznymi

  • powinna być dostępna w aplikacji lista wszystkich wtyczek, z wymaganymi atrybutami (np. widoczna/nie, typ wtyczki, etc)
    może być dostępna przez odpowiednie funkcje

  • dobrze jeśli wtyczka ma kilka funkcji standardowych, dzięki którym możesz je przeglądać i widzieć w aplikacji jako osobne byty, np:
    a) podaj nazwę, opis i wersję wtyczki
    b) uruchom konfigurację wtyczki (np. okno)
    c) odinstaluj wtyczkę
    d) instalacja powinna się odbywać automatycznie - przy pierwszym załadowaniu więc nie trzeba do tego funkcji

Link dla Python-a:
http://stackoverflow.com/questions/932069/building-a-minimal-plugin-architecture-in-python

Dla C/C++ to nie jest proste - w językach statycznych jest to trudniejsze.
Ale też coś znalazłem:

  • Qt: QPluginLoader
  • Poco/ClassLoader

1 użytkowników online, w tym zalogowanych: 0, gości: 1