كيف يعمل نظام القاعدة مثل تلك المستخدمة في نظرية Outlook Express؟ كيف يمكن أن يتم ذلك؟

StackOverflow https://stackoverflow.com/questions/2043546

  •  19-09-2019
  •  | 
  •  

سؤال

أنا فضولي حول هذا:

في MicrosoftS Outlook Express (أو Outlook، لا تتذكر جيدا، أنا مستخدم Mac)، لديهم شيء رائع حقا. القواعد العامة:

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

تبدو هذه القواعد مثل هذا:

"إذا كان البريد الإلكتروني في علبة الوارد لديه موضوع يحتوي على" foo "، أو" شريط "، أو" Foobar "حذفه"

أحتاج إلى رمز شيء مشابه لنظام التحقق من صحة النموذج القوي. يجب أن يكون المطور قادر ببساطة على إنشاء قواعد مثل هذا:

rule: [password_1] is_not_equal_with [password_2]
consequence: show_error '2921'

rule: [firstName] has_less_characters_than '2'
consequence: show_error '1211'

rule: [age] is_numeric, is_smaller_than '13', is_greater_than '130'
consequence: show_error '1522'

rule: [gender] is_equal_with 'female'
consequence: show_group [female_questions]

rule: [termsAndConditionsAccepted] is_not_checked
consequence: show_error '482'

rule: [age] is_less_than 21
consequence: hide_group [income_questions]

حسنا، لدي بعض الأفكار كيف يمكن القيام بذلك، وسوف نشرها هنا كإجابة. ولكن قبل إعادة اختراع العجلة: هل هناك أي مفاهيم مكتوبة يمكنني استخدامها كأساس لتطوير نظام التحقق من صحة القاعدة مماثلة لهذه؟ أو إذا لم يكن كذلك، هل لديك أي اقتراحات كيف يمكن القيام بذلك؟

في المثال أعلاه، كل شيء في الأقواس المربعة هو اسم عنصر نموذج HTML. كل شيء في apostrophs "هو قيمة" مشفرة بجد "للمقارنة ضد.

يتم ترجمة القواعد المحددة إلى رمز PHP ورمز JavaScript للقيام بالتحقق من صحة الجانب العميل والخادم.

الميزات يجب أن تكون هذه قادرة على:

  • القواعد الشرطية: شيء يعتمد على شيء ب
  • مقارنات القيمة: للأعداد الصحيحة، يطفو، سلاسل
  • تمكين بعض منطق التحكم في النموذج أيضا، كما هو الحال في [النوع] is_equal_with" أنثى "مثال أعلاه.

كيف يمكن انجاز هذا؟ ما هي الكيانات التي يجب أن أعتبرها، من وجهة نظر علمية؟

أعتقد أن المفهوم النظري لهذا هو منصة مستقلة. على الرغم من أنني سوف تنفذ هذا في PHP و JavaScript، فلا يوجد سبب لماذا يجب ألا يستجيب ديف C ++ ؛-) (أنا رجل موضوعي، راجع للشغل)

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

المحلول

قد ترغب في التحقق من محركات قواعد OpenSource؛ أو حتى المدفوعة مقابل واحد.

الامثله تشمل
دفع ثمنها:
inrule., قواعد الأعمال المحرك, محرك قواعد الأعمال ASA

OpenSource:
redrules., سالول

هناك الكثير. بما في ذلك بعض المدمج في Java (API Engine Up Engine Java (JSR94))، و .NET (محرك قاعدة عمل مؤسسة WINDOWSSWORK).

لست متأكدا من PHP المستقيم رغم ذلك.

كملاحظة جانبية، استخدمت محركات زوجين، مثل قواعد هالي (قبل أن يتم شراؤها من قبل Oracle) للقيادة على ويب واجهة المستخدم. أن تدرك أن سرعة التنفيذ هي حاسمة للغاية. كان لدينا معالجة هالي حوالي 2000 قواعد لكل عبء الصفحة (تطبيق الرهن العقاري)، وكان ينفذ في أقل من 40 مللي ثانية (وليس خطأ مطبعي). استخدمناها لتحديد المجالات التي كانت موجودة في الصفحة وكذلك تحديد ما إذا كانت البيانات المدخلة كانت متسقة، والتقت بالمعايير القانونية، وحتى ما إذا كان قد تم إدخاله بشكل صحيح.

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

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

كان هذا أيضا أداء على نطاق أصغر، لكنني أقتصر على إعطاء استجابات الذهاب / عدم الذهاب بسيطة فقط.

نصائح أخرى

بالنسبة لعدد قليل من القواعد والرسائل، يمكنك تطبيق خوارزمية القوة الغاشمة: خذ كل قاعدة وكل رسالة ومقارنتها إذا كانت تناسبها. سوف تحصل على o (صم) تعقيد حيث ص هو عدد القواعد و M هو عدد الرسائل، وليس مع الاعتبار أن القاعدة يمكن أن يكون لها شروط متعددة.

بالنسبة لعدد كبير من القواعد أو الرسائل، يمكنك تنفيذ شبكة ختم (http://en.wikipedia.org/wiki/rete_algorithm.). هذا يأخذ بعض الذاكرة ولكنه أسرع بكثير في الممارسة العملية. اعتمادا على الطريقة التي تقوم بها من تصميم القواعد الخاصة بك سوف تحصل على تعقيدات مختلفة.

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

اقرأ القليل عن خوارزمية المنقاد قبل الذهاب أبعد من ذلك.

في جزء Alpha من شبكة الشبكة، ستقوم بتخزين الظروف المميزة التي تظهر في قواعدك. قد تشارك بعض القواعد بعض الظروف. مثل:

قاعدة 1: إذا (message.date يساوي 24.10.2009) و (رسالة يحتوي على "Hello") ثم قم بشيء ما 1

المادة 2: إذا كان (الرسالة.hasattachement صحيح) و (رسالة. atate يساوي 24.10.2009) ثم قم بشيء ما

لذلك سيكون الجزء ألفا من الشبكة 3 عناصر

  • C1: (الرسالة.Date يساوي 24.10.2009)
  • C2: (message.title يحتوي على "Hello")
  • C3: (الرسالة. hasattachement صحيح)

في شبكة بيتا، سيكون لديك اثنين من العقدة أن يربط C1-C2 و C3-C1.

ستتضمن العقد الإنتاج التي تنتهي شبكة بيتا على سلسلة الإجراءات التي يجب تنفيذها عندما تفي رسالة بجميع شروط القاعدة (في الجزء ألفا) وجميع عمليات التحقق من الاتساق (في الجزء التجريبي).

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

لمزيد من المعلومات حول Rete:

  • مطابقة الإنتاج لأنظمة التعلم الكبيرة / - روبرت ب. أوجينبوس. (1995)
  • على التنفيذ الفعال لأنظمة الإنتاج / - تشارلز L. Forgy (1979)

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

يمكنك بناء قائمة انتظار مثيلات القواعد، وتنفيذ استدعاء (السياق) على كل منها لكل كائن يعمل على. سيحتوي السياق على مثيل للكائن (الرسالة أو النموذج أو أيا كان) أنت تتصرف عليها.

سلسلة القواعد في سلسلة من المسؤولية.

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