سؤال

لدي تطبيق حيث يمكن للمستخدم تحديد نقاط القياس الخاصة به لكل كائن.سيتم بعد ذلك استخدام قيم هذه القياسات لتصنيف الكائن على النحو التالي: أ - يحتاج إلى خدمة، ب - يجب جدولة الخدمة خلال X أيام، ج - لا حاجة إلى خدمة ATM

ومع ذلك، يمكن أن تكون هذه الكائنات أي شيء تقريبًا ولا توجد طريقة يمكننا من خلالها ترميز كيفية تجميع القيم المقاسة في تصنيف ما، فنحن بحاجة إلى ترك ذلك للمستخدم.

هل لديك أي اقتراحات حول كيف يمكننا توفير طريقة للمستخدم لإدخال الصيغ الخاصة به لهذا الغرض؟ليس من الضروري أن يكون الأمر مقاومًا للأحمق، فليس لدينا هذا العدد الكبير من العملاء حتى نتمكن من مساعدتهم طالما يمكنهم شرح ذلك لنا.

هل كانت مفيدة؟

المحلول

الفرار مقيم التعبير

هل يمكن أن تعطي المستخدمين قائمة المتغيرات التي هي صالحة للاستخدام والسماح لهم الخروج مع التعبيرات الخاصة بهم. هل ثم تمرير كل التعبيرات، أسماء المتغيرات والقيم إلى الفرار وسيكون حل جميع أشكال التعبير إلى قيمة أو صح / خطأ.

نصائح أخرى

والوضع الخاص بك هو حالة مثالية للغة مجال معين. ومن شأن DSL يسمح لك بتحديد قواعد المسموح به لبك "لغة صيغة" ومن ثم تقديم التغذية الراجعة للمستخدم وكذلك حساب النتيجة.

ANTLR هو وسيلة جيدة جدا لهذا. ومن مولد محلل / إكسر. الأساس الذي تحدده قواعد اللغة في وصف DSL ANTLR نفسه، وأنه يولد lexers قوية وموزعي لك باللغة التي تختارها.

وعلى سبيل المثال، إذا لغتك تسمح العمليات الحسابية البسيطة وهذا هو كيف سيتم تحديد ذلك في لغة ANTLR ل(من ويكي ANTLR ل):

grammar SimpleCalc;

options {
    language=CSharp2;
}

tokens {
    PLUS    = '+' ;
    MINUS   = '-' ;
    MULT    = '*' ;
    DIV = '/' ;
}

@members {
    public static void Main(string[] args) {
        SimpleCalcLexer lex = new SimpleCalcLexer(new ANTLRFileStream(args[0]));
        CommonTokenStream tokens = new CommonTokenStream(lex);

        SimpleCalcParser parser = new SimpleCalcParser(tokens);

        try {
            parser.expr();
        } catch (RecognitionException e)  {
            Console.Error.WriteLine(e.StackTrace);
        }
    }
}

/*------------------------------------------------------------------
 * PARSER RULES
 *------------------------------------------------------------------*/

expr    : term ( ( PLUS | MINUS )  term )* ;

term    : factor ( ( MULT | DIV ) factor )* ;

factor  : NUMBER ;


/*------------------------------------------------------------------
 * LEXER RULES
 *------------------------------------------------------------------*/

NUMBER  : (DIGIT)+ ;

WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+    { $channel = HIDDEN; } ;

fragment DIGIT  : '0'..'9' ;

ويمكنك معرفة المزيد عن تراخيص اشتراك الجهاز في هنا .

SpreadsheetGear ل. NET قد يكون خيارا جيدا. SpreadsheetGear يقبل ويحسب الصيغ باللغة معظم المستخدمين يعرفون بالفعل - إكسل. SpreadsheetGear يتضمن تحكم Windows Forms جداول البيانات، أو يمكنك استخدامه كمكتبة إذا كنت تفعل ASP.NET أو خدمة ويب.

ويمكنك أن ترى بسيطة عينات حساب ASP.NET هنا ، أو تحميل النسخة المجانية هنا إذا كنت ترغب في محاولة للسيطرة WinForms عناصر.

تنويه: أنا أملك SpreadsheetGear LLC

وكنت قد كتبت مشروع مفتوح المصدر، rel="nofollow"> ، التي يمكن تحويل التعبير النص المكتوب باستخدام C # جملة إلى المندوبين (أو شجرة التعبير). يتم تحليل التعبير وتحويلها إلى الأشجار التعبير دون استخدام تجميع أو التأمل.

ويمكنك كتابة شيء من هذا القبيل:

var interpreter = new Interpreter();
var result = interpreter.Eval("8 / 2 + 2");

أو

var interpreter = new Interpreter()
                .SetVariable("service", new ServiceExample());

string expression = "x > 4 ? service.SomeMethod() : service.AnotherMethod()";

Lambda parsedExpression = interpreter.Parse(expression, 
                        new Parameter("x", typeof(int)));

parsedExpression.Invoke(5);

ويستند عملي على المادة سكوت قو <لأ href = "http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq- دينامية استعلام library.aspx "يختلط =" نوفولو "> http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic- استعلام library.aspx .

يجب عليك استخدام تعبيرات .NET 3.5 في System.Linq.Expressions.لقد قدم Scott Gu واجهة برمجة تطبيقات Dynamic Expression التي تسمح لك بتقييم السلاسل لتحويلها إلى أشجار تعبير، والتي يمكن بعد ذلك تقييمها بواسطة التعليمات البرمجية إما لفحص محتويات التعبير، أو تجميعها للتنفيذ.

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

ولقد ذكرتم الكائنات يمكن أن يكون "كل شيء تقريبا". يمكن أيضا أن تكون نقطة قياس أي شيء تقريبا؟ يفترض القياسات ستقتصر على خصائص محددة من الكائن في السؤال، وفي هذه الحالة هل يمكن أن يفترض فضح محرر المعالج تشبه التي من شأنها أن تسمح للمستخدم إجراء عمليات حسابية على أساس خصائص الكائن اكتشفت عن طريق التفكير. شيء واحد كنت قد يحدث لك عن طريق إحاطة المشكلة ويبدو لك أن فرض 3 نقاط النهاية لقياس بدلا من 1 إلى الدول N.

وهناك اقتراح آخر، وأعتقد أن المرونة الكافية سوف تحتاج إلى طراز كائن قياس المستقلة التي تربط لالكائنات التي ترغب في قياس.

ما مدى أهمية ذلك بالنسبة لك لفرض التفرد في القياسات؟ سوف حماية المستخدم من تحديد الدول المتداخلة ربما تكون اصعب قطعة من هذا، لأن من وصفك يبدو أن قياسات مختلفة تماما صالحة لنعلق على ولايات مختلفة.

وأيضا، هل تعرف كيف سيكون الاقتراع الكائنات لحساب القياسات لتحديد حالة الكائنات؟

وعذرا على التحدث ذلك عموما ولكن في الحقيقة في هذه المرحلة سؤالك عام جدا. حظا سعيدا.

ويمكن للمستخدم استخدام معرفته الكائن وعادل تقرر الفئة التي لوضعها في حين يدخلها في النظام؟ أعتقد أننا بحاجة الى مزيد من المعلومات ولكن إذا يمكن للمستخدم تحديد التي measurepoints تحديد الفئة، يمكن أن لم تكن مجرد اختيار الفئة؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top