Je cherche à implémenter une DSL, pour gérer les stocks/commandes. Dans ce cas, il s'agit d'un jeu (Minecraft, avec computercraft + Applied Energistics), mais il pourrait raisonnablement s'agir d'un système du monde réel, par exemple la fabrication de voitures. Une grande partie de ma motivation pour faire ceci est d'expérimenter avec l'artisanat/la conception DSL.
Il sera probablement implémenté dans Lua, mais l'utilisateur ne devrait pas se rendre compte qu'il écrit du code Lua pour ajouter des règles.
J'essaie donc de décider quelles structures/fonctions la DSL devrait fournir.
Les idées actuelles incluent, comme primitives de base:
Ensuite, j'aurais besoin de quelques fonctions d'assistance, KeepStock (qty, item)
que l'utilisateur aurait pu construire à partir de primitives:
if CurrentStock(item)<qty and not OnOrder(item) then Order(qty-CurrentStock(item), item) end
Exemples de la façon dont j'envisage l'utilisation de la DSL:
if CurrentStock("wheat")>100 then Order(10, "Bread") end
KeepStock(100, "Iron Ingots")
Sucre syntaxique:
Quelles fonctions dois-je avoir, dans une telle DSL? Peut-être devrais-je avoir une fonction StockDeficit (item, qty) helper? équivalent à: math.max(qty - CurrentStock(item), 0)
if StockDeficit("Iron Ingot", 100) then Order("Iron Ingot", StockDeficit("Iron Ingot, 100) end
Peut-être est-il important de disposer de méthodes permettant d'interroger la capacité pour exécuter les commandes? Une sorte de FreeCapactityFor (item) , qui pourrait être utilisé: comme If FreeCapacityFor("Bread") then Order(1, Bread) end
Vaut-il la peine de nettoyer la syntaxe, ce qui en fait un langage plus naturel comme: pour que:
if CurrentStock("wheat")>100 then Order(10, "Bread") end
if CurrentStock(wheat)>100 then Order(10, Bread) end
if wheat>100: Order 10 bread
retour sur l'exemple précédent, est-il utile de faire, le contexte contextuel de la langue:
if StockDeficit("Iron Ingot", 100) then Order("Iron Ingot", StockDeficit("Iron Ingot, 100) end
if StockDeficit("Iron Ingot", 100) then Order(StockDeficit) end
Le cas général est le cas général: Comment déterminez-vous les fonctionnalités dont un utilisateur a besoin à partir d'une DSL? Je ne m'attends pas à une réponse à cette dernière question car elle est trop large. Cependant, les réponses pourraient y faire référence pour expliquer comment elles sont parvenues à leurs conclusions. La détermination des exigences syntaxiques ne semble pas trop difficile, principalement une question de juger de leur compétence technique (par exemple, dans certains domaines, ils iraient bien, sachant qu'en fait, ils ne font qu'écrire du code Lua avec un ensemble particulier de fonctions disponibles). les utilisateurs sont notoirement mal à savoir ce qu'ils veulent. Les bonnes techniques, comme les User Stories, ou la survie de leurs pratiques actuelles pendant quelques heures/jours, sont-elles meilleures que d'autres pour capturer les exigences, en particulier pour les DSL?
J'avais lu un livre sur les DSL. Martin Fowler en parle également sur son site Web, ce qui peut être utile.
De plus, si vous avez le temps avant votre affectation, essayez d'utiliser quelques DSL.
Vaut-il la peine de nettoyer la syntaxe, pour en faire un langage plus naturel
Oui. Pour la meilleure capacité de votre équipe.
Les DSL sont assez bons pour aider les équipes à être plus productives car elles offrent quelques avantages par rapport aux langages plus génériques:
Quelles fonctions dois-je avoir dans une telle DSL?
Tout ce qui rendrait l'équipe/l'utilisateur plus productif.
Cependant, plus la DSL devient complexe, plus elle sera difficile à comprendre et à utiliser. Cela dépend donc de votre public.
Comment déterminez-vous les fonctionnalités dont un utilisateur a besoin à partir d'une DSL?
Encore une fois, la DSL devrait être axée sur la productivité. Tout ce qui rend l'utilisateur plus productif.
J'espère que cela t'aides.
Avez-vous vu l'utilisation de Boo dans .NET par Ayende Rahien pour encapsuler son code C # qui effectue une programmation générique sur des objets C # arbitraires? Il a créé une DSL dans Boo, qui fait à peu près ce que vous voulez et s'intègre à la vérification de type statique pour garantir une exactitude de base. Il en a parlé dans son livre sur les DSL.