Pergunta

Estou ouvindo cada vez mais sobre linguagens específicas de domínio sendo lançadas e como elas mudam a maneira como você trata a lógica de negócios, e tenho visto Postagens do blog de Ayende e coisas assim, mas nunca entendi exatamente por que tiraria minha lógica de negócios dos métodos e situações que estou usando em meu provedor.

Se você tem alguma experiência com essas coisas, é possível colocá-lo em termos reais:

  • O que significa exatamente construir DSLs?
  • Quais idiomas você está usando?
  • Onde usar uma DSL faz sentido?
  • Qual é a vantagem de usar DSLs?
Foi útil?

Solução

As DSLs são boas em situações em que você precisa transferir algum aspecto do controle do sistema para outra pessoa.Eu os usei em mecanismos de regras, onde você cria uma linguagem simples que é mais fácil para pessoas menos técnicas usarem para se expressarem - principalmente em fluxos de trabalho.

Em outras palavras, em vez de fazê-los aprender java:

DocumentDAO myDocumentDAO = ServiceLocator.getDocumentDAO();
for (int id : documentIDS) {
Document myDoc = MyDocumentDAO.loadDoc(id);
if (myDoc.getDocumentStatus().equals(DocumentStatus.UNREAD)) {
    ReminderService.sendUnreadReminder(myDoc)
}

Posso escrever uma DSL que me permita dizer:

for (document : documents) {
if (document is unread) {
 document.sendReminder
}

Existem outras situações, mas basicamente, em qualquer lugar onde você queira usar uma linguagem macro, criar um script de fluxo de trabalho ou permitir personalização pós-venda - todos esses são candidatos a DSLs.

Outras dicas

DSL apoia Idioma Específico do Domínio ou sejalinguagem projetada especificamente para resolver problemas em determinada área.
Por exemplo, Markdown (linguagem de marcação usada para editar postagens no SO) pode ser considerada uma DSL.

Pessoalmente, encontro um lugar para DSL em quase todos os grandes projetos em que estou trabalhando.Na maioria das vezes preciso de algum tipo de linguagem de consulta semelhante a SQL.Outro uso comum são os sistemas baseados em regras, você precisa de algum tipo de linguagem para especificar regras\condições.

DSL faz sentido em contextos onde é difícil descrever/resolver problemas por meios tradicionais.

Se você usa o Microsoft Visual Studio, já está usando várias DSLs – a superfície de design para formulários da web, winforms, etc.é uma DSL.O Class Designer é outro exemplo.

Uma DSL é apenas um conjunto de ferramentas que (pelo menos em teoria) fazem o desenvolvimento em um “domínio” específico (ou seja,layout visual) mais fácil, mais intuitivo e mais produtivo.

No que diz respeito à construção de uma DSL, algumas das coisas sobre as quais pessoas como Ayende escreveram estão relacionadas à "análise de texto" dsls, permitindo que desenvolvedores (ou usuários finais) insiram "texto natural" em um aplicativo, que analisa o texto e gera algum tipo de código ou saída baseada nele.

Você poderia usar qualquer linguagem para construir sua própria DSL.O Microsoft Visual Studio tem muitos pontos de extensibilidade e os padrões e práticas "Kit de ferramentas de automação de orientação" e SDK do Visual Studio pode ajudá-lo a adicionar funcionalidade DSL ao Visual Studio.

DSL são compiladores básicos para linguagens personalizadas.Uma boa ferramenta 'livre e aberta' para desenvolvê-los está disponível em ANTLR.Recentemente, estive olhando para esta DSL por um linguagem de máquina de estado usar em um novo projeto.Concordo com Tim Howland acima, que eles podem ser uma boa maneira de permitir que outra pessoa personalize seu aplicativo.

Para sua informação, um livro sobre DSLs está sendo preparado como parte da série de assinaturas de Martin Fowler.

Se for do mesmo padrão dos outros livros da série, deve ser uma boa leitura.

Mais Informações aqui

DSL é apenas um nome sofisticado e pode significar coisas diferentes:

  • Rails (a coisa Ruby) às vezes é chamado de DSL porque adiciona métodos especiais (e substitui alguns métodos integrados também) para falar sobre aplicações web

  • ANT, sintaxe Makefile etc.também são DSLs, mas possuem sua própria sintaxe.Isso é o que eu chamaria de DSL.

Um aspecto importante desse hype:Faz sentido pensar na sua aplicação em termos de linguagem.Sobre o que você quer falar no seu aplicativo?Estas devem então ser suas classes e métodos:

  1. Defina uma "linguagem" (seja uma sintaxe real proposta por outros nesta página ou uma hierarquia de classes para sua linguagem favorita) que seja capaz de expressar seu problema.
  2. Resolva seu problema em termos desse idioma.

DSL basicamente cria sua própria pequena sublinguagem para resolver um problema de domínio específico.Isso é resolvido usando encadeamento de métodos.Idiomas onde pontos e parênteses são opcionais ajudam a tornar essas expressões mais naturais.Também pode ser semelhante a um padrão de construtor.DSL não são linguagens em si, mas sim um padrão que você aplica à sua API para tornar as chamadas mais autoexplicativas.

Um exemplo é Guice, Guia do usuário do Guice http://docs.google.com/View?docid=dd2fhx4z_5df5hw8 tem alguma descrição mais detalhada de como as interfaces estão vinculadas às implementações e em quais contextos.

Outro exemplo comum é para linguagens de consulta.Por exemplo:

NewsDAO.writtenBy("someUser").before("someDate").updateStatus("Deleted")

Na implementação, imagine cada método retornando um novo objeto Query, ou apenas este se atualizando internamente.A qualquer momento você pode encerrar a cadeia usando, por exemplo, rows() para obter todas as linhas ou updateSomeField como fiz acima aqui.Ambos retornarão um objeto de resultado.

Eu recomendaria dar uma olhada no exemplo do Guice acima também, pois cada chamada retorna um novo tipo com novas opções.Um bom IDE permitirá que você complete, deixando claro quais opções você tem em cada ponto.

Editar:parece que muitos consideram as DSLs como linguagens novas, simples e de propósito único, com seus próprios analisadores.Sempre associo DSL ao uso do encadeamento de métodos como uma convenção para expressar operações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top