xime: Modularność i koncepcja wtyczek

tech • 548 słów • 3 minuty czytania

Ta notatka jest częścią serii xime. Zapoznaj się z pozostałymi wpisami.

O tym, co to wtyczka i czym może stać się dla użytkownika programu, można dowiedzieć się na Wikipedii:

Wtyczka (ang. plug-in) to dodatek do istniejącego programu rozszerzający jego możliwości lub automatyzujący żmudne czynności.

Wtyczka może stać się źródłem dodatkowej, dowolnej funkcjonalności, jakiej zabrakło w głównym programie. Oczywiście zdarza się, tak jak w naszym przypadku, że to właśnie wtyczki odpowiadają za całą (lub prawie całą) funkcjonalność programu, a bez nich sam program staje się bezużyteczny.

Nie ma rzeczy doskonałych, każda rzecz posiada jakieś zalety i wady, także modułowość i system wtyczek.

Jedną z głównych zalet jest modularność, gdzie system wtyczek zapewnia dodatkową funkcjonalność rozszerzającą program. Dzięki takiemu podejściu użytkownik może dowolnie konfigurować funkcje, wygląd i zachowanie programu. Zyskujemy przez to oszczędność zasobów i szybkość działania. Użytkownik sam zarządza wtyczkami i ładowana jest tylko ta funkcjonalność jakiej potrzebuje.

Kolejną zaletą jest rozproszenie prac nad projektem. Autorzy programu mogą zając się jego rozwojem, a dzięki rozbudowanemu API niezależni programiści mogą w tym czasie tworzyć i rozwijać wtyczki, dodając nową funkcjonalność jakiej społeczność użytkowników może się domagać.

Jestem świadomy tego, że zapewne większość wtyczek, przynajmniej w początkowej fazie, będzie mojego autorstwa.

Może nie istnieją jakieś wielkie wady w koncepcji wtyczek w naszym projekcie, ale za to pojawia się kilka problemów.

Jako, że jednym z głównych cech naszego komunikatora jest wieloplatformowość, to właśnie ona jest źródłem kilku problemów. Chodzi o GUI we wtyczkach. Sama aplikacja korzysta z wxWidgets, a API w domyśle ma być niezależne od wszelkich bibliotek i języka, więc GUI może sprawiać problemy. Dobrym pomysłem może być wykorzystanie XML-owego formatu opisu okien, dialogów i innych zasobów, w naszym przypadku systemu XRC (XML-based resource system).

W takim wypadku pozostanie do rozwiązania kwestia obsługi tak utworzonego okna. Oczywiście będzie możliwość wykorzystania we wtyczkach biblioteki wxWidgets, gdy komuś na tym będzie zależało. W Windowsowej wersji aplikacja będzie rozpowszechniana ze stosowną biblioteką DLL, a deweloperzy będą mieli dostęp do pliku lib.

Inną obawą związaną z cross-platformowością i wtyczkami jest to, że twórcy wtyczek mogą olewać zadbanie o wieloplatformowość. Idealnym rozwiązaniem byłoby pisanie takiego kodu, aby przenośność i wydanie wersji na inne systemy ograniczałoby się do przekompilowania kodu na innym systemie. Taką możliwość chyba będą mieli tylko Ci deweloperzy, którzy wykorzystają wxWidgets w swoich pracach, a nie każdy przecież musi z niej korzystać.

Odnośnie tematu wtyczek nasuwają mi się jeszcze dwie sprawy.

Okno ustawień. Czy pluginy będą mogły dodawać swoje zakładki z opcjami w dowolne miejsce w tym oknie? Czy w dowolnej gałęzi okna będą mogły dodać swoją zakładkę i zarządzać istniejącymi? A może lepiej po prostu stworzyć jedną gałąź dla wtyczek i tam dodawać? Pierwsza opcja daje większą swobodę i możliwości, ale w jakimś stopniu nie jest bezpieczna oraz może wprowadzać zamieszanie i zamęt wśród użytkowników. Druga natomiast trochę ogranicza…

Obsługa sieci we wtyczkach. Jak już napisałem, obsługę poszczególnych sieci będą zapewniać wtyczki. Nasuwa się pytanie, czy niskopoziomowa obsługa sieci powinna być zaimplementowana w core? Wtedy połączeniem, wysyłaniem i odbieraniem danych opiekowałby się sam program, a dane wędrowałyby do wtyczki. Ciekawe rozwiązanie, ale pojawia się problem z bibliotekami do obsługi sieci/protokołów komunikacyjnych, bo przeważnie taka niskopoziomowa obsługa jest w nich zaimplementowana. W przypadku, kiedy sam pogram zarządzałby połączeniami zredukowałaby się liczba wszelakich wątków i można byłoby połączenia obsługiwać asynchronicznie.

Ale te kwestie już bardziej dotyczą samego API, o którym za jakiś czas sobie “porozmawiamy” ;)

Komentarze (0)

Dodaj komentarz

/dozwolony markdown/

/nie zostanie opublikowany/