سؤال

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

إذا كانت لديك بعض الخلفية في استخدام هذه الأشياء، فمن المحتمل أن تتمكن من وضعها في مصطلحات عامة الناس:

  • ماذا يعني بناء DSL بالضبط؟
  • ما هي اللغات التي تستخدمها؟
  • أين يكون استخدام DSL منطقيًا؟
  • ما فائدة استخدام DSL؟
هل كانت مفيدة؟

المحلول

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

بمعنى آخر، بدلاً من جعلهم يتعلمون جافا:

DocumentDAO myDocumentDAO = ServiceLocator.getDocumentDAO();
for (int id : documentIDS) {
Document myDoc = MyDocumentDAO.loadDoc(id);
if (myDoc.getDocumentStatus().equals(DocumentStatus.UNREAD)) {
    ReminderService.sendUnreadReminder(myDoc)
}

يمكنني أن أكتب DSL الذي يتيح لي أن أقول:

for (document : documents) {
if (document is unread) {
 document.sendReminder
}

هناك مواقف أخرى، ولكن بشكل أساسي، في أي مكان قد ترغب فيه في استخدام لغة ماكرو، أو كتابة سير عمل، أو السماح بتخصيص ما بعد السوق - فهذه كلها مرشحة لـ DSL.

نصائح أخرى

دي اس ال تمثل لغة المجال المحددة أي.لغة مصممة خصيصًا لحل المشكلات في منطقة معينة.
على سبيل المثال، يمكن اعتبار Markdown (لغة الترميز المستخدمة لتحرير المنشورات على SO) بمثابة DSL.

أنا شخصياً أجد مكاناً لـ DSL تقريباً في كل مشروع كبير أعمل عليه.غالبًا ما أحتاج إلى نوع من لغة الاستعلام المشابهة لـ SQL.الاستخدام الشائع الآخر هو الأنظمة القائمة على القواعد، فأنت بحاجة إلى نوع من اللغة لتحديد القواعد/الشروط.

يعد DSL منطقيًا في السياق الذي يصعب فيه وصف/حل المشكلة بالوسائل التقليدية.

إذا كنت تستخدم Microsoft Visual Studio، فأنت تستخدم بالفعل DSLs متعددة - سطح التصميم لنماذج الويب، وwinforms، وما إلى ذلك.هو DSL.مصمم الفئة مثال آخر.

إن DSL هو مجرد مجموعة من الأدوات التي (على الأقل من الناحية النظرية) تجعل التطوير في "مجال" محدد (أي.التخطيط المرئي) أسهل وأكثر بديهية وأكثر إنتاجية.

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

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

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

لمعلوماتك، هناك كتاب عن DSL قيد الإعداد كجزء من سلسلة توقيع مارتن فاولر.

إذا كان بنفس مستوى الكتب الأخرى في السلسلة، فيجب أن يكون قراءة جيدة.

معلومات اكثر هنا

DSL هو مجرد اسم فاخر ويمكن أن يعني أشياء مختلفة:

  • يُطلق على Rails (شيء Ruby) أحيانًا اسم DSL لأنه يضيف طرقًا خاصة (ويستبدل بعض الطرق المضمنة أيضًا) للحديث عن تطبيقات الويب

  • ANT، بناء جملة Makefile وما إلى ذلك.هي أيضًا DSL، لكن لها تركيبها الخاص.وهذا ما يمكن أن أسميه DSL.

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

  1. حدد "لغة" (إما بناء جملة حقيقي كما اقترحه الآخرون في هذه الصفحة أو تسلسل هرمي للغتك المفضلة) قادرة على التعبير عن مشكلتك.
  2. حل مشكلتك فيما يتعلق بتلك اللغة.

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

أحد الأمثلة هو Guice، دليل مستخدم Guice http://docs.google.com/View?docid=dd2fhx4z_5df5hw8 يحتوي على بعض الوصف أدناه لكيفية ربط الواجهات بالتطبيقات وفي أي سياقات.

مثال شائع آخر هو لغات الاستعلام.على سبيل المثال:

NewsDAO.writtenBy("someUser").before("someDate").updateStatus("Deleted")

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

أوصي بإلقاء نظرة على مثال Guice أعلاه أيضًا، حيث أن كل استدعاء هناك يُرجع نوعًا جديدًا بخيارات جديدة عليه.سيسمح لك IDE الجيد بالإكمال، مما يوضح الخيارات المتاحة لك في كل نقطة.

يحرر:يبدو أن الكثيرين يعتبرون خطوط المشتركين الرقمية (DSL) بمثابة لغات جديدة وبسيطة وذات غرض واحد مع محللين خاصين بها.أقوم دائمًا بربط DSL باستخدام تسلسل الطريقة كاتفاقية للتعبير عن العمليات.

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