Pergunta

Atualmente, o projeto que estou trabalhando com não tem modelos completamente imobilizado (devido a uma influência externa) e, portanto, eu gostaria alguma flexibilidade em escrevê-los. Atualmente eles são replicadas em três camadas diferentes do aplicativo (db, api web e cliente) e cada um tem uma lógica similar nele (isto é. Validação).

Eu queria saber se existe uma abordagem que permita-me para escrever um arquivo de modelo (dizer em Ruby), e depois tê-lo converter esse modelo para os arquivos necessários c #. Atualmente, parece que eu só estou escrevendo um monte de código clichê que podem mudar a qualquer momento, que esta abordagem gerado me permitiria concentrar em coisas muito mais importantes.

Alguém tem uma recomendação para algo como isso, uma DSL / idioma eu posso fazer isso, e alguém tem alguma experiência sobre algo assim?

Foi útil?

Solução

Isso pode ser feito facilmente com ANTLR . Se a saída é suficiente semelhante, você pode simplesmente usar o texto templates mecanismo, caso contrário ele pode gerar uma árvore de sintaxe abstrata para você atravessar.

Outras dicas

Eu vi um sistema que usou classes parciais e métodos parciais para permitir a regeneração de código sem afetar o código personalizado. O "mecanismo de regras" se você foi completamente gerado a partir de um diagrama de estado Visio. Este é basicamente mans pobres do fluxo de trabalho, mas muito fácil de modificar. O diagrama Viso foi exportado para XML que foi lida em usar PowerShell e T4 para gerar as classes.

O exemplo acima é de um DSL externo. OU SEJA externo para a linguagem de programação que o aplicativo é executado em. Você poderia, por outro lado criar uma DSL interna que é implementado e usado em uma linguagem de programação.

Este eo em DSLSs do código-Magazine são muito bons .

No link acima Neal Ford mostra como criar uma DSL interna em C # usando uma interface fluente.

Uma coisa que ele ainda não tenha mencionado é que você pode colocar esse atributo [EditorBrowsable (EditorBrowsableState.Never)] em seus métodos para que eles não parecem intellisense. Isso significa que você pode esconder o não-DSL (se você) métodos na classe do usuário do DSL tornando a API fluente muito mais visível.

Você pode ver uma interface fluente sendo escrito ao vivo nesta série de vídeo por Daniel Cazzulino em escrevendo um contêiner IoC com TDD

Em matéria de DSLs externas você também tem a opção de Oslo (CTP no momento) que é bastante poderoso em sua capacidade de deixá-lo criar DSLs externas que podem ser executados diretamente em vez de para o uso de geração de código que vêm para pensar sobre isso isn 't realmente muito de uma DSL em tudo.

Eu acho que você está no caminho certo.

O que eu costumo fazer em uma situação como esta é projetar uma linguagem simples que captura as minhas necessidades e escrever uma LL1 (recursiva Descida) analisador para ele.

Se o idioma tem que ter não trivial C # sintaxe nele, eu pode citar que, ou apenas envolvê-la em suportes que podem reconhecer, e apenas passá-lo através do código de saída.

I pode tê-lo gerar uma estrutura de árvore de análise e gerar dizer 3 tipos diferentes de código de que, ou eu posso apenas tem que gerar o código em tempo real, utilizando uma variável de modo com 3 valores, ou apenas simultaneamente write código para 3 arquivos de saída diferentes.

Há mais de uma maneira de fazê-lo. Se você tem medo de escrever analisadores (como alguns programadores são), não há muita ajuda em outros lugares no SO.

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