Как я могу добавить программируемость к своему приложению

Я пишу приложение то есть, в его ядре, механизме правил. Пользователи хотят смочь определить пользовательские правила. Некоторые из них будут довольно простыми алгебраическими выражениями, многие вовлекут некоторых при ветвлении логики, и некоторые будут еще более сложными. Каковы мои опции для того, чтобы сделать это?

Мои пользователи являются довольно умными, опытными в T-SQL и командах Excel, и обычно знакомыми с программированием конструкций, но они не "программисты" по сути.

Я думал об использовании VBA/VSTA; взаимодействие с Excel так или иначе; интеграция своего рода языка сценариев (Ruby? Perl? Tcl?); или прокрутка мое собственное.

В лучшем из всех возможных миров я дам им редактора с цветовым кодированием и подобной IntelliSense интерактивной справкой, непосредственным режимом выполнения для тестирования и экспериментирования, и неродной через отладчик. Они также должны смочь сохранить, получить, отредактировать, и выполнить их правила. Сверкающая скорость не важна.

Моя среда является Windows/.Net 3.5/C#

Какие-либо идеи?

7
задан Jess 8 January 2010 в 20:04
поделиться

13 ответов

Я не оконный человек, так что мои ответы не будут точно соответствовать вашей ситуации. Я бы порекомендовал встроить в ваше приложение полноценный скриптовый интерпретатор языка. Разоблачите некоторые примитивы (т.е. части вашего движка правил, которые вы хотите опубликовать), а затем предоставьте полноценный интерпретатор. Я знаю, что TCL, Python и Guile разработаны таким образом. Лично я бы порекомендовал Python, так как Scheme (guile) немного эзотерична и TCL, похоже, в целом сдает позиции.

5
ответ дан 6 December 2019 в 21:14
поделиться
[

] Для движка правил "от Бога" можно использовать [] Клипы []. Клипы - это экспертная система с открытым исходным кодом, которую вы можете встроить в свои собственные приложения. [

] [

]Если вам нужен настоящий скриптинг, есть масса инструментов, которые можно добавить в скриптинг приложениям с такими языками, как Lua, TCL, REXX и т.д.[

] [

]Независимо от того, что вы делаете, вы должны внимательно ознакомиться с лицензированием. Вложение чужого кода в ваш часто влияет на то, как вы можете лицензировать получаемую программу[

].
0
ответ дан 6 December 2019 в 21:14
поделиться
[

] Если бы структура и правила были понятны, то я бы имитировал интерфейс Query, который содержится в Lucene (java и .net). В основном, ваши правила становятся типами запросов, и вы можете и/или они вместе гораздо больше похожи на то, как это делает Lucene.[

] [

]Наконец, вы можете создать интерфейс, который позволит вашим пользователям выполнять эту работу. Критически важными элементами будут типы запросов и связанные с ними метаданные, которые могут служить элементами, над которыми нужно работать.[

] [

]Например, скажем, что ваша система правил - это механизм электронной коммерции, и вы позволяете своим пользователям определять правила, которые будут вознаграждать покупателей скидкой, если они добавят конкретный товар в свою корзину.[

] [

]Они выберут тип ProductQuery, который будет соответствовать номеру товара, и тогда успешное завершение запроса на товар приведет к автоматическому применению скидки.[

] [

]Надеюсь, это поможет.[

].
0
ответ дан 6 December 2019 в 21:14
поделиться
[

] Это будет не все, о чем вы просите, но я, в зависимости от ваших потребностей, буду расследовать Бу. Это относительно безболезненно строить DSL в Бу, которая относительно читабельна для бизнесменов, что имеет большие преимущества, даже если они не те, кто кодирует правила непосредственно.[

] [

]Oren Eini's Building Domain Specific Languages in Boo довольно хорошо, и только что вышел в окончательной форме. Движок правил - это одна из примеров реализации DSL, которую он изучает. Boo - это полностью собранный статически типизированный Python-подобный язык для .Net, с небольшим, но сильным сообществом, и делает изменение языка под конкретные нужды проще, чем практически любая другая альтернатива, благодаря расширяемому конвейеру компилятора и очень хорошей семантически-умной макросистеме.[

] [

]Приятным в Boo является то, что большинство DSL просто построено на общем базовом классе, который обеспечивает "язык", который вам нужен, но не сильно отличается от кода, который вы будете писать по жестко заданным правилам. Вы можете сделать так, чтобы язык выглядел именно так, как вы хотите, но вам не придётся беспокоиться о ручной парсинге или написании команд управления потоком, или о том, что вы ожидаете от языка.[

] [

]Есть некоторые недостатки: Это не совсем то же самое, что Python или Ruby, документация в основном находится в исходных текстах Boo, и сообщество, да, маленькое. Но если вы можете "преподавать на примере", вы можете зайти довольно далеко. Главное предостережение, которое относится к вашему списку желаний - это завершение кода; завершение кода имеет ограниченную поддержку с некоторыми VS плагинами и с SharpDevelop, но то, что там практически испаряется по мере сборки DSL.[

].
2
ответ дан 6 December 2019 в 21:14
поделиться
[

] Говоря по опыту, потому что наше основное программное обеспечение имеет функцию скриптинга.[

] [

]Мы используем []Actipro SyntaxEditor[] как наш дизайнер скриптинга. Нашим первоначальным требованием было: "Пользователь сможет написать формулу для поля". Эта формула будет использоваться для проверки содержимого поля"[

] [

]. Из этого мы использовали []Dynamic Linq[]. Пользователь смог написать формулу, но при этом смог добавить математические и пользовательские функции. Тогда нам не нужно было больше, но сейчас мы видим ограничения в использовании Dynamic Linq.[

] [

]Если мы хотим сделать новую версию нашего скриптового движка, то теперь мы с нетерпением ждем использования нового DLR-совместимого языка: []IronPython[] и []IronRuby[][

]
0
ответ дан 6 December 2019 в 21:14
поделиться

Вместо встроенного языка сценариев подумайте о программировании графического языка или инструмента, если вы можете определить все возможные правила и сопоставить их с подходящим кодом, вы могли бы предложить конечному пользователю простой и легкий способ визуально добавить поведения и действия в их рабочий процесс.

Предлагать движок правил на основе пользовательского интерфейса проще для изучения и удобнее для непрограммистов. И вы всегда можете добавить встроенный язык сценариев , чтобы позже настроить уже существующие действия.

Кроме того, это общий инструмент, используемый, например, в ETL для создания бизнес-правил

0
ответ дан 6 December 2019 в 21:14
поделиться

В настоящее время мы используем Mozilla's SpiderMonkey, чтобы сделать именно это в нашем веб-приложении. Это JavaScript-движок, позволяющий создавать собственные функции и объекты, соответствующие фактической бизнес-логике в вашем приложении. Javascript::SpiderMonkey - это perl-модуль, который взаимодействует, но я считаю, что с ним работает больше языков.

0
ответ дан 6 December 2019 в 21:14
поделиться

Windows имеет встроенный механизм Windows Script Host с двумя интерпретаторами для VBScript и JScript. Вы можете легко ими пользоваться. Просто проверьте MSDN, чтобы узнать о соответствующих COM-интерфейсах.

0
ответ дан 6 December 2019 в 21:14
поделиться

Не изобретайте свой собственный язык сценариев! Учить новый язык для единой системы - это плохо. Я бы попытался использовать Python, который относительно легко изучить и понять.

0
ответ дан 6 December 2019 в 21:14
поделиться

Поскольку вашей платформой является .NET, встраивание ironpython может сработать для вас. Фактически, автор одной из книг по ironpython использовал его в продукте, который (на первый взгляд) имеет много общего с тем, что вы делаете. Я думаю, он назывался Resolver One.

Править

Это называется Resolver One

Вот ссылка на его книгу .

2
ответ дан 6 December 2019 в 21:14
поделиться

Любая подобная реализация полна рисков. Я бы начал с наименьшего набора настроек, а затем постепенно наращивал бы оттуда свои возможности.

Не пытайтесь программировать в нее всевозможные расширения сразу, если только вы уже не обладаете большим количеством навыков. Выберите одну простую способность за раз - выполнять стандартные SQL-запросы и возвращать наборы записей или что-то в этом роде.

3
ответ дан 6 December 2019 в 21:14
поделиться

Как говорили другие, это плохая практика, но если у вас нет выбора, потому что вам нужно интегрироваться со сторонней библиотекой, которая использует пакет по умолчанию, то вы можете создать свой собственный класс в пакете по умолчанию и получить доступ к другому классу путь. Классы в пакете по умолчанию в основном имеют одно пространство имен, поэтому доступ к другому классу возможен, даже если он находится в отдельном JAR-файле. Просто убедитесь, что файл JAR находится в пути к классам.

Этот трюк не работает, если ваш класс не входит в пакет по умолчанию.

-121--1058234-

Если вы знаете, что все ваши идентификаторы имеют префикс «link-», вы можете просто получить подстроку идентификатора:

$("#my-div a").click(function(){
   alert(this.id.substr(5));
});
-121--4716685-

Lua может быть хорошим решением. Мне действительно интересно, насколько сложной может быть интеграция вашего механизма правил с языком сценариев, который позволяет пользователям писать свои собственные правила.

Хорошим подходом может быть встраивание всего (механизм правил тоже) в интерпретатор сценариев, в противном случае вы бы написали много кода, чтобы объединить то, что пользователь записывает в сценарий, с соответствующими правилами, используемыми в вашей программе.

Однако то , чтобы намереваться такой программируемости требует большого внимания к тому, что ваш язык должен быть в состоянии сделать, начиная с небольшого ядра утилит и затем расширяя его; или вы действительно можете многое планировать, прежде чем начать всю реализацию, но для моего опыта (я писал, как 3-4 переводчика до сих пор) лучший способ - это подогнать его при разработке, конечно, с обратной связью пользователей: это будет необходимо, потому что вы можете предположить, насколько они хороши, но я бы на это не рассчитывал.

0
ответ дан 6 December 2019 в 21:14
поделиться

, что и другие, Lua - это довольно быстрый и простой способ встроить язык сценариев в вашем приложении. Продукт нашей компании имеет функцию макроса, и я был кратко развлекал идею встраивания полной поддержки сценариев как часть этого. Но в конечном итоге мы решили, что ученик будет кошмаром.

Независимо от того, это довольно хорошее введение в встроенное LUA в C #, если вы выберете этот маршрут: http://blog.apterainc.com/software/embedding-lua-and-c/

0
ответ дан 6 December 2019 в 21:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: