بحاجة إلى مساعدة في تحسين Ruby DSL للتحكم في موزع المشروبات الذي يتم التحكم فيه بواسطة Arduino (قرد البار)

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

سؤال

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

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

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

لدي حاليًا مسودة تقريبية لخط المشترك الرقمي (DSL)، لذا تبدو وصفة الشراب كما يلي (رابط جيثب):

desc "Simple glass of water"
recipe "water" do
  ingredients(
  "Water" => 2.ounces
  )
end

وهذا بدوره يتم تفسيره وينتج حاليًا ما يلي (رابط جيثب):

[mwilliams@Danzig barduino-tender]$ ruby barduino-tender.rb examples/water.rb
Preparing: Simple glass of water

Ingredients:
 Water: 2 ounces

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

  1. تحديد "المكونات" المتوفرة باستخدام اسم المكون وعدد المضخة المتصلة به.ربما باستخدام التجزئة؟المكونات = {"ماء" => 1، "فودكا" => 2}.بهذه الطريقة، عندما يتم تفسير أحد المكونات، يمكن إما أ) إرسال رقم المضخة عبر المنفذ التسلسلي متبوعًا بعدد الأوقية التي سيقوم Arduino بتوزيعها ب) إخبار المستخدم بأن المكون غير موجود وإحباطه حتى لا يتم توزيع أي شيء ج) لديك بسهولة القدرة على تغيير أو إضافة مكونات جديدة إذا تم تغييرها.
  2. جعل الوصفة تبدو أقل رمزًا، وهو الغرض الرئيسي من DSL، ربما إنشاء أداة إنشاء الوصفات؟استخدام المكونات المتاحة لمطالبة المستخدم باسم المشروب والمكونات المستخدمة وكم الكمية؟

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

تحديث

لقد قمت بتعديل الأشياء وتنظيفها قليلاً لتعكس اقتراح أوريون إدواردز للوصفة.يبدو الآن كما يلي.

description 'Screwdriver' do 
  serve_in 'Highball Glass'
  ingredients do
    2.ounces :vodka
    5.ounces :orange_juice
  end
end

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

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

المحلول

بدون النظر في تفاصيل التنفيذ (أو روابط جيثب الخاصة بك)، سأحاول كتابة DSL مثل هذا:

(السرقة من هنا: http://supercocktails.com/1310/Long-Island-Iced-Tea-)

describe "Long Island Iced Tea" do
  serve_in 'Highball Glass'

  ingredients do
    half.ounce.of :vodka
    half.ounce.of :tequila
    half.ounce.of :light_rum
    half.ounce.of :gin
    1.dash.of :coca_cola
    #ignoring lemon peel as how can a robot peel a lemon?
  end

  steps do
    add :vodka, :tequila, :light_rum, :gin
    stir :gently
    add :coca_cola
  end
end

امل ان يساعد!

نصائح أخرى

إذا كنت تريد أن تبدو الوصفة طبيعية أكثر، فلماذا لا (من نفس الوصفة التي استخدمتها Orion Ewards، شكرًا!):

Recipe for Long Island Iced Tea #1
Ingredients:
  1/2 oz Vodka
  1/2 oz Tequila
  1/2 oz Light Rum
  1/2 oz Gin
  1 Dash Coca-Cola
  # ignored Twist of Lemon Peel (or Lime)

ثم أضف قمة الشجرة إلى المزيج.يمكن أن يكون لديك قواعد مثل:

grammar Cocktail
  rule cocktail
    title ingredients
  end

  rule title
    'Recipe for' S text:(.*) EOF
  end

  rule ingredients
    ingredient+
  end

  rule ingredient
    qty S liquid
  end
# ...
end

والتي سيحولها المترجم على قمة الشجرة إلى وحدة روبي جميلة.ثم:

parser = CocktailParser.new
r = parser.parse(recipe)

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

  1. يستبدل description مع recipe.وهو مصطلح أكثر وصفية
  2. بما أن مجموعة المكونات والأفعال ثابتة، قم بربط المكونات بالمتغيرات بدلاً من الرموز، أي لديك vodka = :vodka محددة في مكان ما.من الأسهل القول

    امزج الفودكا والجين و Triple_sec # بدلاً من استخدام :vodka و :gin و :triple_sec.

على أي حال هذا هو الصئبان طفيفة.

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