Як розробити розширюване програмне забезпечення (архітектура плагіна)? [зачинено]


75

Мені потрібні ресурси, які розповідатимуть про те, як розробити програмне забезпечення таким чином, щоб воно розширювалось, тобто щоб інші люди могли писати додаткові компоненти / плагіни, що додають йому функціональність.

Що ви порадите? Будь-які книги там обговорюють цю тему?
Я віддав би перевагу чомусь короткому і суттєвому; трохи теорії та купа конкретних прикладів.

Я не націлений на конкретну мову, я хочу мати можливість зрозуміти основну ідею, щоб я міг реалізувати її будь-якою мовою.

І з тієї ж причини я вважаю за краще не робити це, використовуючи фреймворк, який створив хтось інший (за винятком випадків, коли фреймворк не дуже високого рівня, тобто не приховує занадто багато), на даний момент я хочу навчитися лише предмет і експериментуйте з різними способами його реалізації. Крім того, фреймворк зазвичай передбачає знання користувача про тему.

ОНОВЛЕННЯ

Я не питаю про ООП або дозволяю передавати мої класи у спадок. Я говорю про розробку програми, яка буде розгорнута в системі, так що її можна розширити сторонніми доповненнями ПІСЛЯ розгортання.

Наприклад, Notepad ++ має архітектуру плагіна, де ви можете розмістити файл .dll у папці плагінів, і він додає функціональність додатку, якого там не було, наприклад, вибір кольору, вставку фрагмента чи багато інших речей. (широкий спектр функціональних можливостей).


Я думаю, ви виявите, що більшість середовищ плагінів забезпечують базові класи для використання при написанні плагіна. Ваш спеціальний плагін третьої сторони походить від базового класу та розширює його функціональність "стандартного плагіна".
Kieveli

3
Ви побачите, що розширювана природа програмного забезпечення, таких як Firefox та Notepad ++, походить від його коріння дизайну ОО. Той самий директор, який робить ваші класи розширюваними, допоможе зробити ваше загальне програмне забезпечення розширюваним.
orokusaki

Відповіді:


25

1
Моторошний, Архітектура плагінів за допомогою посилання C # - це код, який виглядає точно так само, як POC, який я колись писав. Не вистачало лише одного: спостерігача за файловою системою для підбору нових модулів під час виконання. Чудово підходить для демонстрацій: "Помістіть dll у цей каталог і ... Вуаля! Новий вибір меню."
Guge

1
прийнято через це посилання codeguru.com/cpp/misc/misc/plug-insadd-ins/article.php/c3879, якого я спочатку не помітив!
hasen

Дякую. Асанте. Шукрія. Шукран. Тенкю тру. Обов’язковий. Мерсі. Грації. Арігато. Се ся. Навазіш.
bugmagnet

дуже цікаві речі! Дякую!
Sander Versluys

16

OSGI - це хороший практичний приклад технічної основи, що дозволяє робити те, що вам потрібно.

Теорія тут .

(Безкоштовно!) Книга є .

Розширюваність і можливість писати плагін повинні мати справу із життєвим циклом служби

  • додавання / видалення послуги / плагіна на місці
  • управління залежностями між службами
  • управління станами послуг (оголошено, встановлено, запущено, зупинено, ...)

Для чого призначена OSGI?

Однією з основних функцій модуля є одиниця розгортання ... те, що ми можемо або створити, або завантажити та встановити, щоб розширити функціональність нашого додатку.

Тут ви знайдете хороший вступ про центральне поняття послуги (яке пов’язане з вашим запитанням і яке пояснює деякі проблеми, пов’язані з послугами, ключовим компонентом для розширення).

Екстракт:

Чому тоді послуги так важливі, якщо без них можна створити стільки додатків? Ну, сервіси - це найвідоміший спосіб відокремити програмні компоненти один від одного.

Одним з найважливіших аспектів служб є те, що вони суттєво мінімізують проблеми завантаження класу, оскільки вони працюють з екземплярами об'єктів, а не з іменами класів. Екземпляри, створені постачальником, а не споживачем. Зменшення складності досить дивно

Служби не тільки мінімізують конфігурацію, вони також значно зменшують кількість спільних пакетів.


Що таке osgi? Я подивився веб-сайт, але не розумію, як це пов’язано з моїм запитанням!
hasen


"додавання / видалення служби / плагіна безпосередньо" дійсно корисно лише для додатків серверного типу, які постійно працюють; інші програми можуть завантажувати останню версію плагіна під час їх запуску.
Raedwald 03.03.11

5

Впроваджуйте принципи SOLID у своєму додатку.

1. Принцип єдиної відповідальності: Клас повинен нести лише одну відповідальність (тобто лише одна потенційна зміна в специфікації програмного забезпечення повинна мати вплив на специфікацію класу

2. Відкритий / закритий принцип: Суб'єкти програмного забезпечення ... повинні бути відкриті для розширення, але закриті для модифікації

3. Принцип заміщення Ліскова: Об'єкти в програмі повинні бути замінені екземплярами їх підтипів, не змінюючи правильності цієї програми

4. Принцип розділення інтерфейсу: Багато клієнтських інтерфейсів кращі за один інтерфейс загального призначення

5. Принцип інверсії залежності: Слід залежати від абстракцій . Не залежать від конкрементів

Запитання щодо Stackoverflow:

Приклад принципу єдиної відповідальності

Чи є відкритий / закритий принцип гарною ідеєю?

Який принцип заміщення Лісковим?

Принцип сегрегації інтерфейсу - Програма до інтерфейсу

Що таке принцип інверсії залежності і чому він важливий?


4

Ви намагаєтесь досягти двох конкуруючих цілей:

  1. Компоненти вашого програмного забезпечення повинні мати багато самих себе, тому їх можна використовувати повторно
  2. Компоненти вашого програмного забезпечення мають дуже мало оголювати себе, тому їх можна використовувати повторно

Пояснення: Щоб заохотити повторне використання коду, ви повинні мати можливість розширити існуючі класи та викликати їх методи. Це неможливо, коли методи оголошені "приватними", а класи "остаточними" (і не можуть бути розширені). Тож для досягнення цієї мети все повинно бути загальнодоступним та доступним. Немає приватних даних чи методів.

Випустивши другу версію свого програмного забезпечення, ви виявите, що багато ідей версії 1 були абсолютно неправильними. Вам потрібно змінити багато інтерфейсів або ваш код, імена методів, видалити методи, зламати API. Якщо ви зробите це, багато людей відвернуться. Отже, щоб мати можливість розвивати своє програмне забезпечення, компоненти не повинні піддавати нічого, що не є абсолютно необхідним - ціною повторного використання коду.

Приклад: Я хотів спостерігати положення курсору (каретки) у SWT StyledText. Карета не призначена для продовження. Якщо ви це зробите, ви виявите, що код містить перевірки типу "це клас у пакеті org.eclipse.swt", і багато методів є приватними, остаточними і не такими. Мені довелося скопіювати близько 28 класів із SWT у свій проект, щоб лише реалізувати цю функцію, тому що все заблоковано.

SWT - це приємний фреймворк, який можна використовувати, а пекло розширювати.



2

Ну це залежить від мови.

  • У C / C ++ я майже впевнений, що існує функція loadlibrary, яка дозволяє відкривати бібліотеку під час виконання та викликати її експортовані функції. Зазвичай це робиться в C / C ++.
  • У .NET є Reflection, який пропонує подібну (але більш широку) до loadlibrary. Також є цілі бібліотеки, побудовані на Reflection, такі як Managed Extension Framework, або Mono.Addins, які вже роблять більшу частину важкої роботи для вас.
  • У Java також є Reflection. І є JPF (Java Plugin Framework), який використовується в таких матеріалах, як Eclipse IIRC.

Залежно від того, якою мовою ви користуєтесь, я можу порекомендувати підручник / книги. Сподіваюсь, це було корисно.


"loadlibrary": не у стандартній C / C ++.
Raedwald 03.03.11


0

Оформити замовлення "CAB" - Структура блоків блоку додатків для композиції Microsoft . Я думаю, у них теж є "веб-версія" ...


0

Я щойно розпочав розробку інтелектуального клієнтського додатка. Це два варіанти, які я розглядаю.

Використання простору імен System.AddIn від Microsoft . Виглядає дуже багатообіцяючим, проте це може бути дещо складним для нашого кінцевого рішення.

Або інтелектуальний клієнт - композитний блок додатків інтерфейсу від Microsoft

Нещодавно я розглядав можливість використання компонентів як блоку додаткового інтерфейсу користувача, так і простору імен System.AddIn для створення власного. Оскільки вихідний код доступний для САС, його легко розширити. Я думаю, що нашим кінцевим рішенням буде полегшена версія CAB, яка, безумовно, використовує блок додатків Unity


0

Архітектура плагінів стає дуже популярною завдяки своїй розширюваності і, отже, гнучкості.

Для c ++ сервер Apache httpd насправді базується на плагінах, але замість цього використовується концепція модуля. Більшість функцій apache реалізовані як модулі, такі як кеш-пам'ять, перезапис, балансування навантаження та навіть модель потоку. Це дуже модульне програмне забезпечення, яке я коли-небудь бачив.

А для Java Eclipse - це, безумовно, плагін. Ядром Eclipse є система модулів OSGI, яка управляє пакетами, ще одна концепція плагіна. Комплект може надати точки розширення, на яких ми можемо будувати модулі з меншими зусиллями. Найскладніша річ в OSGI - це її динамічна характеристика, що означає, що комплекти можуть бути встановлені або видалені під час виконання. Більше ніякого синдрому зупинки світу!


0

Якщо ви працюєте з .Net, наше дослідження дало два підходи: сценарій та композиція.

Сценарії

Ви розширюєте функціональність того, що можуть робити ваші класи, організовуючи їх за допомогою скриптів. Це означає виставити те, що складено вашою улюбленою мовою .Net, динамічною мовою.

Деякі варіанти, які ми знайшли вартими вивчення:

Склад

Якщо ви починаєте проект із .Net 4 або новішої версії, вам слід уважно ознайомитися з Менеджер управління керованим розширенням (MEF). Це дозволяє розширити функціональність своїх програм плагіном.

Менеджер керованих розширень (MEF) - це складний рівень для .NET, який покращує гнучкість, ремонтопридатність та перевірку великих програм. MEF може бути використаний для розширення сторонніх плагінів, або він може принести переваги вільно пов'язаної плагіноподібної архітектури для звичайних програм.

Управління надбудовами Framework - це також гарне читання.


0

Оскільки я не маю достатньо реп-балів, щоб залишити коментар, я публікую це як відповідь. SharpDevelop - це середовище розробки для розробки програм на C # / VB.NET / Boo. Він має досить вражаючу архітектуру, яка дозволяє розширювати себе різними способами - від нових пунктів меню до підтримки розробки для цілком нових мов.

Він використовує трохи конфігурації XML, щоб діяти як шар склеювання між ядром IDE та реалізацією плагіна. Він обробляє пошук, завантаження та встановлення версій плагінів з коробки. Розгортання нових плагінів полягає в простому копіюванні у новий файл конфігурації xml та необхідних збірок (DLL) та перезапуску програми. Ви можете прочитати про це в книзі «розсічення додатки Csharp» оригінальний автор (и) - Крістіан Хольм, Майк Крюгер, Бернхард Spuida заявки від сюди . Здається, книга не доступна на цьому сайті, але я знайшов копію, яка, можливо, все ще є тут

Також знайшли відповідне питання тут


-8

Замість того, щоб заново винаходити колесо, використовуйте рамки в руках. Eclipse та Netbeans підтримують розширення на основі плагінів. Однак вам доведеться працювати на Java.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.