Как централизованно поддерживать математическую формулу в С# (web), чтобы ее можно было изменить, если это необходимо? - программирование
Подтвердить что ты не робот

Как централизованно поддерживать математическую формулу в С# (web), чтобы ее можно было изменить, если это необходимо?

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

Зеленый = Он может продолжить
Красный = Не позволяйте ему продолжать
Желтый = Разрешить продолжить, но предупредить

Эти формулы работают с различными текстовыми полями на странице. Так, например, если textbox1 имеет "10", а texbox2 имеет "30"... Формула может быть:
T1 * T2 > 600? "ЗЕЛЕНЫЙ": "КРАСНЫЙ"

Мой вопрос:
Можно ли как-то централизовать эти формулы?

Зачем мне это нужно?
Прямо сейчас, если есть какое-либо изменение в формуле, мы должны также реплицировать изменение на стороне сервера (нарушение DRY, сложный для поддержания кода)

Один вариант может заключаться в
- хранить (простую) формулу в виде текста с заполнителями в конфиге (?)
- заменить заполнители на значения в javascript, а также на серверный код
- использовать eval() для вычисления в JS
- используйте трюки, обозначенные здесь для С#

В этом подходе к проблеме могут быть разные интерпретации одной и той же математической строки в JS и С#.

Я понимаю смысл или должен быть представлен этот вопрос?!!: P

4b9b3361

Ответ 1

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

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

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

Основным преимуществом является обслуживание и FUD, которые в противном случае вы могли бы синхронизировать проверку клиента и сервера. Там также экономия времени, когда вам никогда не приходилось писать JavaScript-код проверки.

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

Ответ 2

Microsoft.CSharp.CSharpCodeProvider провайдер может скомпилировать код на лету. В частности, см. CompileAssemblyFromFile.

Это позволит вам выполнять код во время выполнения из web.config, например; однако используйте их с осторожностью.

Ответ 3

Вы можете писать классы С# для моделирования своих выражений с помощью таких классов, как выражение, значение, BooleanExpr и т.д. (абстрактное дерево синтаксиса)

например.

Expression resultExpression = new ValueOf("T1").Times(new ValueOf("T2")).GreaterThan(600).IfElse("RED","GREEN")
                                    ^Variable              ^Variable        ^Value=>BoolExpr   ^(Value, Value) => Value

Эти выражения затем могут быть использованы для оценки в С# AND, чтобы испустить Java script для проверок:

String result = resultExpression.bind("T1", 10).bind("T2",20).evaluate() //returns "RED"
String jsExpression resultExpression.toJavaScript // emits T1 * T2 > 600 ? "RED" : "GREEN"

Ответ 4

Вы можете сделать класс калькулятора низкого уровня, который использует строки в качестве входных данных, и толкает и выталкивает вещи в стек. Посмотрите " Обратный Польский Калькулятор". Если количество используемых вами входов не изменяется, это будет довольно гладкий способ хранения ваших уравнений. Вы могли бы хранить их в текстовом файле или в файле конфигурации очень легко.

например:

string Equation = "V1,V2,+";

string ParseThis = Equation.Replace("V1", "34").Replace("V2", "45");

foreach(string s in ParseThis.split(',')) {
   if (s == "+") {
     val1 = stack.Pop();
     val2 = stack.Pop();
     return int.parse(val1) + int.Parse(val2);
   }
   else {
     stack.Push(s);
   }
}

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

извинения, если какой-либо синтаксис неверен, но это должно заставить вас двигаться в правильном направлении.

Ответ 5

Простейшим решением было бы реализовать формулы один раз на стороне сервера С# и использовать AJAX для оценки выражений от клиента при внесении изменений. Это может замедлить страницу.

Если вы хотите, чтобы формулы оценивались на стороне клиента и на стороне сервера, но записывались только один раз, я думаю, вам нужно будет сделать что-то вроде:

  • Вытяните формулы в отдельный класс
  • Для клиента:
  • Для серверной части:
    • Вызов в класс формул, передающий значения из данных формы (или управляющих, если это веб-формы)
    • Возьмите необходимые действия, используя результаты формул

.. или вы могли бы сделать обратное и написать формулы в Javascript и использовать механизм Javascript для С# для оценки этого сервера на стороне сервера.

Я бы не тратил время на создание настраиваемого языка выражений или написание кода для перевода С# на Javascript, как это было предложено некоторыми другими ответами. Как показано в вопросах, с которыми я связан, они уже существуют. Это отвлекает вас от вашей бизнес-проблемы. Я бы нашел существующее решение, которое подходит и помогает кому-то другому.