بحاجة إلى مساعدة في تحسين Ruby DSL للتحكم في موزع المشروبات الذي يتم التحكم فيه بواسطة Arduino (قرد البار)
-
03-07-2019 - |
سؤال
أنا أكتب 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، "فودكا" => 2}.بهذه الطريقة، عندما يتم تفسير أحد المكونات، يمكن إما أ) إرسال رقم المضخة عبر المنفذ التسلسلي متبوعًا بعدد الأوقية التي سيقوم Arduino بتوزيعها ب) إخبار المستخدم بأن المكون غير موجود وإحباطه حتى لا يتم توزيع أي شيء ج) لديك بسهولة القدرة على تغيير أو إضافة مكونات جديدة إذا تم تغييرها.
- جعل الوصفة تبدو أقل رمزًا، وهو الغرض الرئيسي من 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 جميلًا جدًا.التغيير الوحيد الذي ربما أقترحه عليك هو الكود "المحدث".
- يستبدل
description
معrecipe
.وهو مصطلح أكثر وصفية بما أن مجموعة المكونات والأفعال ثابتة، قم بربط المكونات بالمتغيرات بدلاً من الرموز، أي لديك
vodka = :vodka
محددة في مكان ما.من الأسهل القولامزج الفودكا والجين و Triple_sec # بدلاً من استخدام :vodka و :gin و :triple_sec.
على أي حال هذا هو الصئبان طفيفة.