Jak zaprojektować oprogramowanie rozszerzalne (architekturę wtyczek)? [zamknięte]

Potrzebuję zasobów, które mówią o tym, jak zaprojektować oprogramowanie, aby było rozszerzalne, tzn. aby inni ludzie mogli pisać dodatki/wtyczki, które dodają do niego funkcjonalność.

Co polecacie? Są jakieś książki, które omawiają ten temat?
Wolałbym coś, co jest krótkie i rzeczowe; trochę teorii i kilka konkretnych przykładów.

Nie kieruję się konkretnym językiem, chcę być w stanie zrozumieć podstawową ideę, aby móc ją zaimplementować w dowolnym język.

I z tego samego powodu wolę nie robić tego używając frameworka zbudowanego przez kogoś innego (chyba, że framework nie jest zbyt wysokopoziomowy, tzn. nie ukrywa zbytnio }), w tej chwili chcę tylko dokształcać się w tym temacie i eksperymentować z różnymi sposobami jego implementacji. Dodatkowo, framework zazwyczaj zakłada wiedzę użytkownika na ten temat.

UPDATE

Nie pytam o OOP ani o pozwolenie na dziedziczenie moich zajęć. Mówię o zaprojektowaniu aplikacji, która zostanie wdrożona w systemie, tak aby mogła zostać rozszerzona o dodatki innych firm po jej wdrożeniu.

Na przykład Notepad++ ma architekturę wtyczek, w której można umieścić a .plik dll w folderze wtyczek i dodaje funkcjonalność do aplikacji, której nie było, takie jak wybieranie kolorów, wstawianie fragmentów lub wiele innych rzeczy (szeroki zakres funkcjonalności).

Author: Laurel, 2008-11-27

13 answers

 24
Author: bugmagnet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-24 04:51:23

OSGI {[2] } jest dobrym praktycznym przykładem RAM technicznych pozwalających robić to, czego szukasz.

Teoria jest tutaj .

The (free!) książka jest tam .

Rozszerzalność i możliwość zapisu wtyczki muszą radzić sobie z cyklem życia usługi

  • dodawanie / usuwanie serwisu / wtyczki na miejscu
  • zarządzanie zależnościami między usługami
  • zarządzanie stanami usług (zadeklarowanych, zainstalowanych, uruchomionych, stopped,...)

Do czego służy OSGI ?

Jedną z głównych funkcji modułu jest Jednostka Wdrażania ... coś, co możemy zbudować lub pobrać i zainstalować, aby rozszerzyć funkcjonalność naszej aplikacji.

Znajdziesz tu dobre wprowadzenie , na temat Centralnego pojęcia serwis (które jest związane z twoim pytaniem i które wyjaśniają niektóre problemy związane z usługami, kluczowym elementem dla rozciągliwość).

Ekstrakt:

Dlaczego usługi są tak ważne, skoro tak wiele aplikacji można zbudować bez nich? Cóż, usługi są najbardziej znanym sposobem oddzielenia komponentów oprogramowania od siebie.

Jednym z najważniejszych aspektów usług jest to, że znacznie minimalizują problemy z ładowaniem klas, ponieważ działają z instancjami obiektów, a nie z nazwami klas. Przypadki, które są tworzone przez dostawcę, a nie konsumenta. Redukcja złożoność jest dość zaskakująca

Usługi nie tylko minimalizują konfigurację, ale także znacznie zmniejszają liczbę współdzielonych pakietów.

 13
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-27 09:12:47

Starasz się osiągnąć dwa konkurencyjne cele:

  1. komponenty Twojego oprogramowania muszą ujawnić Wiele samych siebie, aby mogły być ponownie użyte
  2. komponenty Twojego oprogramowania muszą ujawniać bardzo niewiele samych siebie, aby mogły być ponownie użyte

Explanation: aby zachęcić do ponownego użycia kodu, powinieneś być w stanie rozszerzyć istniejące klasy i wywołać ich metody. Nie jest to możliwe, gdy metody są zadeklarowane jako "prywatne", A klasy są "ostateczne" (i nie może być Rozszerzony). Aby więc osiągnąć ten cel, wszystko powinno być publiczne i dostępne. Brak prywatnych danych lub metod.

Kiedy wydasz drugą wersję swojego oprogramowania, przekonasz się, że wiele pomysłów wersji 1 było zwyczajnie błędnych. Musisz zmienić wiele interfejsów lub kod, nazwy metod, usunąć metody, złamać API. Jeśli to zrobisz, wielu ludzi się odwróci. Aby więc móc rozwijać swoje oprogramowanie, Komponenty nie mogą ujawniać niczego, co nie jest absolutnie konieczne - kosztem ponownego użycia kodu.

Przykład: chciałem obserwować położenie kursora (karetki) w tekście w stylu SWT. Karetka nie powinna być przedłużana. Jeśli to zrobisz, zobaczysz, że kod zawiera czeki typu " is this class in the package org.zaćmienie.swt " i wiele metod jest prywatnych i końcowych i tak dalej. Musiałem skopiować około 28 klas z SWT do mojego projektu, aby zaimplementować tę funkcję, ponieważ wszystko jest zablokowane.

SWT to fajny framework do wykorzystania i piekło do rozciągnięcia.

 4
Author: Aaron Digulla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-27 09:27:33

Oczywiście istnieje słynna zasada Open Closed - http://en.wikipedia.org/wiki/Open/closed_principle

 3
Author: LenW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-27 08:52:05

Zaimplementuj stałe zasady w swojej aplikacji.

1. Zasada jednolitej odpowiedzialności: klasa powinna mieć tylko jedną odpowiedzialność (tzn. tylko jedna potencjalna zmiana w specyfikacji oprogramowania powinna mieć wpływ na specyfikację klasy

2.Zasada otwarcia / zamknięcia: encje oprogramowania ... powinny być otwarte dla rozszerzenia, ale zamknięte dla modyfikacji

3. Zastąpienie liskowa zasada: obiekty w programie powinny być wymienne z instancjami ich podtypów bez zmiany poprawności tego programu

4. Zasada segregacji interfejsów: wiele interfejsów specyficznych dla klienta jest lepszych niż jeden interfejs ogólnego przeznaczenia

5. Zasada inwersji zależności: należy polegać na abstrakcjach . Nie zależy od konkrecji

Pytania dotyczące Stackoverflow:

Przykład Zasada Jednej Odpowiedzialności

Czy zasada otwarta / zamknięta to dobry pomysł?

Na czym polega zasada substytucji Liskowa?

Zasada segregacji interfejsu-Program do interfejsu

Czym jest zasada inwersji zależności i dlaczego jest ona ważna?

 3
Author: Ravindra babu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:09

Cóż to zależy od języka.

  • w C / C++ jestem prawie pewien, że istnieje funkcja loadlibrary, która pozwala na otwarcie Biblioteki w czasie wykonywania i wywołanie jej eksportowanych funkcji. Zazwyczaj tak się to robi w C / C++.
  • W. NET jest odbicie, które jest podobne (ale szersze) do loadlibrary. Istnieją również całe biblioteki zbudowane w oparciu o refleksję, takie jak Managed Extension Framework, czy Mono.Dodatki, które wykonują większość ciężkich robót za Ciebie już.
  • w Javie istnieje również odbicie. I jest JPF (Java Plugin Framework), który jest używany w takich rzeczach jak Eclipse IIRC.

W zależności od tego, jakiego języka używasz, mogę polecić jakiś tutorial/książki. Mam nadzieję, że to było pomocne.

 2
Author: joemoe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-25 21:15:39

Artykuł Pisanie aplikacji opartych na wtyczkach jasno wyjaśnia obowiązki poszczególnych części architektury na bardzo prostym przykładzie; podany jest kod źródłowy (VB.Net). uważam, że jest to bardzo pomocne w zrozumieniu podstawowych pojęć.

 1
Author: Tom Juergens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-25 21:10:02

Checkout " CAB " - Framework bloków składowych aplikacji firmy Microsoft . Myślę, że mają też "wersję internetową" tego...

 0
Author: Thomas Hansen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-27 08:41:53

Właśnie zacząłem tworzyć inteligentną aplikację kliencką. Rozważam dwie opcje.

Za pomocą systemu Microsoftu .AddIn przestrzeń nazw. Wygląda bardzo obiecująco, jednak może to być trochę skomplikowane dla naszego rozwiązania końcowego.

Lub Smart Client- Composite UI Application Block od Microsoft

Ostatnio przyjrzałem się komponentom zarówno Composite UI Application Block, jak i systemowi.AddIn namespace to build my own. Od źródła kod jest dostępny dla kabiny, którą można łatwo rozszerzyć. Myślę, że naszym rozwiązaniem końcowym będzie lekka wersja CAB, zdecydowanie przy użyciu Unity Application Block

 0
Author: Rohan West,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-27 08:48:28

Architektura wtyczek staje się bardzo popularna ze względu na jej rozszerzalność, a tym samym elastyczność.

W c++ serwer Apache httpd jest w rzeczywistości oparty na wtyczkach, ale zamiast tego używa się koncepcji modułu. Większość funkcji apache jest zaimplementowana jako moduły, takie jak cache, rewrite, load balancing, a nawet threading model. Jest to bardzo modułowe oprogramowanie, jakie kiedykolwiek widziałem.

A dla Javy Eclipse jest zdecydowanie oparte na wtyczkach. Rdzeniem Eclipse jest system modułów OSGI, które zarządzają pakietami, innym koncepcja wtyczki. Pakiet może zapewnić punkty rozszerzeń, na których możemy budować Moduły przy mniejszym wysiłku. Najbardziej skomplikowaną rzeczą w OSGI jest jej dynamiczna charakterystyka, co oznacza, że pakiety mogą być instalowane lub odinstalowywane w czasie wykonywania. Nie ma już syndromu stop-the-world!

 0
Author: yanky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-14 04:21:24

Jeśli pracujesz z. Net, nasze badania przyniosły dwa podejścia: Skryptowe i kompozycyjne.

Scripting

Rozszerzasz funkcjonalność tego, co mogą robić twoje klasy, aranżując je za pomocą skryptów. Oznacza to pokazanie tego, co jest skompilowane w ulubionym języku. Net w dynamicznym języku.

Niektóre opcje, które uznaliśmy za warte poznania:

Skład

Jeśli rozpoczynasz projekt z. Net 4 lub nowszym, musisz dobrze przyjrzeć się Managed Extensibility Framework (MEF). Pozwala na rozszerzenie funkcjonalności aplikacji w sposób wtyczki.

Managed Extensibility Framework (MEF) jest warstwą składową dla . NET, który poprawia elastyczność, łatwość konserwacji i testowalność Duże zastosowania. MEF może być używany do wtyczek innych firm rozciągliwość, lub może przynieść korzyści płynące z luźno sprzężonego Architektura podobna do wtyczek do zwykłych aplikacji.

Managed Add-in Framework to również dobra lektura.

 0
Author: Ricardo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-26 13:11:39

Ponieważ nie mam wystarczającej ilości punktów reputacji, aby zostawić komentarz, zamieszczam to jako odpowiedź. SharpDevelop jest IDE do tworzenia aplikacji w języku C# / VB. NET / Boo. ma dość imponującą architekturę, która pozwala na rozbudowę na wiele sposobów-od nowych pozycji menu po wsparcie programistyczne dla zupełnie nowych języków.

Używa trochę konfiguracji XML, aby działać jako warstwa kleju między rdzeniem IDE a implementacją wtyczki. Zajmuje się lokalizacją, załadunkiem i wersjonowanie wtyczek po wyjęciu z pudełka. Wdrożenie nowych wtyczek jest sprawą prostego skopiowania w Nowym pliku konfiguracyjnym XML i wymaganych zestawów (DLL) i ponownego uruchomienia aplikacji. Możesz przeczytać więcej na ten temat w książce "rozcinanie aplikacji csharp" przez oryginalnego autora(s) - Christian Holm, Mike Krüger, Bernhard Spuida aplikacji z TUTAJ. Książka nie wydaje się być dostępna na tej stronie, ale znalazłem kopię, która może nadal być w pobliżu TUTAJ

Znaleziono również podobne pytanie tutaj

 0
Author: Shreyas Murali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-12 07:31:22

Zamiast na nowo wymyślać koło, używaj RAM w ręku. Eclipse i Netbeans obsługują rozszerzenia oparte na wtyczkach. Musisz jednak pracować w Javie.

 -8
Author: questzen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-27 08:38:34