web-dev-qa-db-fra.com

Langage spécifique au domaine pour la gestion des stocks / stocks

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:

  • Commande (qté, article)
  • Stock actuel (article) = qté
  • OnOrder (item) = true/false

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")

Des questions

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)

  • au lieu de (ou aussi) `KeepStock (100," Iron Lingots ")
  • avoir 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:

  • au lieu de: if CurrentStock("wheat")>100 then Order(10, "Bread") end
  • nous avons: if CurrentStock(wheat)>100 then Order(10, Bread) end
  • ou même: if wheat>100: Order 10 bread

retour sur l'exemple précédent, est-il utile de faire, le contexte contextuel de la langue:

  • au lieu de: if StockDeficit("Iron Ingot", 100) then Order("Iron Ingot", StockDeficit("Iron Ingot, 100) end
  • avoir: 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?

1
Lyndon White

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:

  • clarté améliorée - le rapport signal/bruit est amélioré car la DSL omet la syntaxe non pertinente
  • compréhension améliorée - la sémantique de la DSL concerne un espace de problème spécifique, donc toute personne familiarisée avec cet espace de problème comprendra la DSL

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.

1
tobinharris

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.

0
John Zabroski