Tôi đang viết một DSL trong Ruby để điều khiển dự án Arduino mà tôi đang thực hiện; Bardino. Đó là một con khỉ thanh sẽ được kiểm soát phần mềm để phục vụ đồ uống. Arduino lấy lệnh thông qua cổng nối tiếp để báo cho Arduino biết cần bật máy bơm nào và trong bao lâu.Cần trợ giúp cải thiện Ruby DSL để điều khiển bộ phân phối đồ uống có kiểm soát Arduino (bar monkey)
Hiện tại nó đang đọc công thức (xem bên dưới) và in lại. Mã cho truyền thông nối tiếp vẫn cần phải được làm việc cũng như một số ý tưởng khác mà tôi đã đề cập dưới đây.
Đây là DSL đầu tiên của tôi và tôi đang làm việc với một ví dụ trước để nó rất thô ráp xung quanh các cạnh. Bất kỳ phê bình, cải tiến mã (có bất kỳ tài liệu tham khảo tốt cho thực hành tốt nhất Ruby DSL hoặc thành ngữ?) Hoặc bất kỳ ý kiến chung.
Tôi hiện đang có một dự thảo thô của DSL do đó, một công thức uống trông giống như sau (Github link):
desc "Simple glass of water"
recipe "water" do
ingredients(
"Water" => 2.ounces
)
end
này lần lượt được giải thích và hiện kết quả như sau (Github link):
[[email protected] barduino-tender]$ ruby barduino-tender.rb examples/water.rb
Preparing: Simple glass of water
Ingredients:
Water: 2 ounces
Đây là một khởi đầu tốt cho DSL, tuy nhiên, tôi nghĩ rằng nó có thể được triển khai tốt hơn một chút. Một số ý tưởng tôi đã có bên dưới:
- Xác định "thành phần" có sẵn bằng cách sử dụng tên thành phần và máy bơm số được kết nối với. Có thể sử dụng băm? ingredients = {"water" => 1, "vodka" => 2}. Bằng cách này, khi một thành phần được hiểu, nó có thể là a) gửi số máy bơm qua cổng nối tiếp, sau đó là số lượng ounce cho Arduino phân phối b) cho người dùng biết rằng thành phần không tồn tại và hủy bỏ vì vậy không có gì được phân phối c) dễ dàng có khả năng thay đổi hoặc thêm thành phần mới nếu chúng thay đổi.
- Làm cho công thức trông ít mã hơn, đó là mục đích chính của DSL, có thể xây dựng công cụ xây dựng công thức? Sử dụng các thành phần có sẵn để nhắc người dùng cho một tên đồ uống, các thành phần có liên quan và bao nhiêu?
Dự án Github là here, vui lòng ngã ba và thực hiện yêu cầu kéo hoặc đăng đề xuất và ví dụ về mã của bạn để những người dùng khác xem. Và nếu bạn tò mò, mã Arduino, sử dụng khung phát triển Ruby Arduino là here.
Cập nhật
tôi sửa đổi và làm sạch mọi thứ lên một chút để phản ánh Orion Edwards gợi ý cho một công thức. Nó bây giờ trông giống như sau.
description 'Screwdriver' do
serve_in 'Highball Glass'
ingredients do
2.ounces :vodka
5.ounces :orange_juice
end
end
Tôi cũng đã thêm một hàm băm (khóa là thành phần và giá trị số máy bơm được kết nối). Tôi nghĩ rằng điều này cung cấp nhiều tiến bộ. Tôi sẽ để lại câu hỏi mở cho bất kỳ đề xuất thêm cho bây giờ, nhưng cuối cùng sẽ chọn câu trả lời của Orion. Mã DSL cập nhật là here.
Để thêm một số mã giả vào danh sách kết hợp. cho thành phần trong thành phần {if ingredients.exists? serial.send (pump_number) chờ 1 giây serial.send (số tiền) chờ OK từ Arduino để tiếp tục thành phần tiếp theo} – mwilliams