Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Uma DSL (linguagem específica do domínio) é definida por seu arquivo de definição de DSL, juntamente com qualquer código de programa personalizado que você possa escrever. A maior parte do código do programa na solução DSL é gerada a partir desse arquivo.
Este tópico explica as principais características da definição de DSL.
A definição de DSL
Quando você abre Dsl\DslDefinition.dsl, a janela do Visual Studio é semelhante à imagem a seguir.
As informações mais importantes na Definição de DSL são exibidas no diagrama de Definição de DSL. Informações adicionais, que também fazem parte de DslDefinition.dsl, são exibidas no Gerenciador de DSL, que geralmente aparece ao lado do diagrama. Você trabalha com o diagrama para as tarefas mais frequentes e com o Gerenciador de DSL para personalizações mais avançadas.
O diagrama de definição de DSL mostra as classes de domínio que definem elementos de modelo e as relações que estabelecem vínculos entre elementos de modelo. Ele também mostra as formas e conectores que são usados para exibir os elementos de modelo para o usuário.
Quando você seleciona um item na definição de DSL, no diagrama ou no Gerenciador de DSL, as informações sobre ele são exibidas na janela Propriedades. Informações adicionais podem ser exibidas na janela Detalhes da DSL.
Modelos são instâncias de DSLs
Um modelo é uma instância da sua DSL criada por um usuário. Um modelo contém elementos de modelo, que são instâncias das classes de domínio que você define e links entre os elementos, que são instâncias das relações de domínio que você define. Um modelo também pode ter formas e conectores, que exibem os elementos e links do modelo em um diagrama. A definição de DSL inclui as classes de forma, classes de conector e uma classe para o diagrama.
Uma definição de DSL também é conhecida como um modelo de domínio. Uma definição de DSL ou um modelo de domínio é a representação em tempo de design da linguagem específica do domínio, enquanto o modelo é a instanciação em tempo de execução da linguagem específica do domínio.
Classes de domínio definem elementos de modelo
As classes de domínio são usadas para criar os vários elementos no domínio e as relações de domínio são os links entre os elementos. Eles são a representação no momento do design dos elementos e links que serão instanciados pelos usuários da linguagem específica de design quando criarem seus modelos.
Esta ilustração mostra um modelo que foi criado pelo usuário de uma biblioteca de música DSL. Os álbuns de música são representados por caixas que contêm listas de músicas. Os artistas são representados por caixas arredondadas, e estão conectados aos álbuns aos quais contribuíram.
A Definição de DSL separa dois aspectos. A aparência dos elementos de modelo no diagrama de modelo é definida usando classes de forma e classes de conector. As informações transmitidas no modelo são definidas usando classes de domínio e relações de domínio.
A ilustração a seguir mostra as classes de domínio e as relações na Definição de DSL da Biblioteca de Música.
A ilustração mostra quatro classes de domínio: Música, Álbum, Artista e Canção. As classes de domínio definem propriedades de domínio como Nome, Título e assim por diante. No modelo de instância, os valores de algumas dessas propriedades são exibidos no diagrama.
Entre as classes estão relações de domínio: MusicHasAlbums, MusicHasArtists, AlbumbHasSongs e ArtistAppearedOnAlbums. As relações têm multiplicidades, como 1..1, 0..*. Por exemplo, cada Canção deve estar relacionada a exatamente um Álbum por meio da relação AlbumHasSongs. Cada Álbum pode ter qualquer número de Canções.
Reorganizar o diagrama de definição de DSL
Observe que uma classe de domínio pode aparecer várias vezes no diagrama de Definição de DSL, como o Álbum faz nesta imagem. Há sempre uma vista principal e podem existir algumas vistas de referência.
Para reorganizar o diagrama de Definição de DSL, você pode:
Troque as exibições principal e de referência usando os comandos Bring Tree Here e Split Tree . Clique com o botão direito do mouse em uma única classe de domínio para ver esses comandos.
Ordene novamente as classes de domínio e as classes de forma pressionando Ctrl+Para Cima e Ctrl+Para Baixo.
Recolha ou expanda classes utilizando o ícone localizado no canto superior direito de cada forma.
Recolher partes da árvore clicando no sinal de menos (-) na parte inferior de uma classe de domínio.
Herança
As classes de domínio podem ser definidas usando herança. Para criar uma derivação de herança, clique na ferramenta Herança, clique na classe derivada e clique na classe base. Um elemento de modelo tem todas as propriedades definidas em sua própria classe de domínio, juntamente com todas as propriedades herdadas da classe base. Também herda seus papéis nos relacionamentos.
A herança também pode ser usada entre Relações, Formas e Conectores. A herança deve ser mantida dentro do mesmo grupo. Uma forma não pode herdar de uma classe de domínio.
Relações de domínio
Os elementos de modelo podem ser vinculados por relações. Os links são sempre binários; eles vinculam exatamente dois elementos. No entanto, qualquer elemento pode ter muitos links para outros objetos, e pode até haver mais de um vínculo entre o mesmo par de elementos.
Assim como você pode definir diferentes classes de elementos, você pode definir diferentes classes de links. A classe de um link é chamada de relação de domínio. Uma relação de domínio especifica quais classes de elemento suas instâncias podem se conectar. Cada extremidade de uma relação é chamada de função e a relação de domínio define nomes para as duas funções, bem como para a própria relação.
Há dois tipos de relações de domínio: relações de incorporação e relações de referência. No Diagrama de Definição de DSL, as relações de incorporação são representadas por linhas sólidas em cada função, e as relações de referência são representadas por linhas tracejadas.
Inserindo relações
Cada elemento em um modelo, exceto por sua raiz, é o destino de um link de inserção. Portanto, todo o modelo forma uma única árvore de links de inserção. Uma relação de inserção representa a contenção ou a propriedade. Dois elementos de modelo relacionados dessa forma também são conhecidos como pai e filho. Diz-se que a criança está inserida no pai.
Os links de inserção geralmente não são mostrados explicitamente como conectores em um diagrama. Em vez disso, eles geralmente são representados pela contenção. A raiz do modelo é representada pelo diagrama e os elementos inseridos nele são exibidos como formas no diagrama.
No exemplo, a classe raiz Música tem uma relação de incorporação MusicHasAlbums ao Álbum, que tem uma relação de incorporação AlbumHasSongs à Song. As músicas são exibidas como itens em uma lista dentro de cada Álbum. A música também tem uma inserção de MusicHasArtists na classe Artist, cujas instâncias também aparecem como formas no diagrama.
Por padrão, os elementos inseridos são excluídos automaticamente quando seus pais são excluídos.
Quando um modelo é salvo em formato de arquivo XML, os elementos embutidos são aninhados dentro de seus pais, a menos que você tenha personalizado a serialização.
Observação
A inserção não é igual à herança. As crianças em uma relação de incorporação não herdam as propriedades do progenitor. Uma inserção é um tipo de vínculo entre elementos de modelo. A herança é uma relação entre classes e não cria vínculos entre elementos de modelo.
Regras de incorporação
Cada elemento em um modelo de instância deve ser o destino de exatamente um link de inserção, exceto para a raiz do modelo.
Portanto, cada classe de domínio não abstrata, exceto a classe raiz, deve ser o destino de pelo menos uma relação de inserção ou deve herdar uma inserção de uma classe base. Uma classe pode ser o alvo de duas ou mais incorporações, mas seus elementos do modelo de instância só podem ter um pai por vez. A multiplicidade de destino para origem deve ser 0..1 ou 1..1.
O Explorer exibe a árvore de inserção
Sua definição de DSL também cria um explorer, que os usuários veem junto com seu diagrama de modelo.
O explorer mostra todos os elementos no modelo, mesmo aqueles para os quais você não definiu nenhuma forma. Ele mostra elementos e relações de inserção, mas não relações de referência.
Para ver os valores das propriedades de domínio de um elemento, o usuário seleciona um elemento, no diagrama do modelo ou no gerenciador de modelos, e abre a janela Propriedades. Ele exibe todas as propriedades de domínio, incluindo aquelas que não são exibidas no diagrama. No exemplo, cada Canção tem um Título e um Gênero, mas apenas o valor do Título é mostrado no diagrama.
Relações de referência
Uma relação de referência representa qualquer tipo de relação que não seja de incorporação.
As relações de referência normalmente são exibidas em um diagrama como conectores entre formas.
Na representação XML do modelo, um link de referência entre dois elementos é representado usando monikers. Ou seja, monikers são nomes que identificam exclusivamente cada elemento no modelo. O nó XML para cada elemento de modelo contém um nó que especifica o nome do relacionamento e o apelido do outro elemento.
Funções
Cada relação de domínio tem duas funções, uma função de origem e uma função de destino.
Na imagem a seguir, a linha entre a classe de domínio Publisher e a relação de domínio PublisherCatalog é a função de origem. A linha entre a relação de domínio e a classe de domínio Album é a função de destino.
Os nomes associados a uma relação são especialmente importantes quando você escreve o código do programa que atravessa o modelo. Por exemplo, quando você cria a solução DSL, a classe gerada Publisher tem um catálogo de propriedades que é uma coleção de Álbuns. A classe Album tem uma propriedade Publisher que é uma única instância da classe Publisher.
Quando você cria uma relação em uma definição de DSL, os nomes de propriedade e relação recebem valores padrão. No entanto, você pode alterá-los.
Multiplicidades
Multiplicidades especificam quantos elementos podem ter a mesma função em uma relação de domínio. No exemplo, a configuração de multiplicidade de zero para muitos (0..*) no papel Catálogo especifica que qualquer instância da classe de domínio Publisher pode ter quantos vínculos de relação PublisherCatalog você desejar estabelecer para ela.
Configure a multiplicidade de uma função digitando no diagrama ou modificando a Multiplicity propriedade na janela Propriedades . A tabela a seguir descreve as configurações dessa propriedade.
| Tipo de multiplicidade | Description |
|---|---|
| 0..* (Zero a muitos) | Cada instância da classe de domínio pode ter várias instâncias da relação ou nenhuma instância da relação. |
| 0..1 (Zero a um) | Cada instância da classe de domínio pode ter não mais do que uma instância da relação ou nenhuma instância da relação. |
| 1..1 (Um) | Cada instância da classe de domínio pode ter uma instância da relação. Você não pode criar mais de uma instância dessa relação de qualquer instância da classe de função. Se a validação estiver habilitada, um erro de validação será exibido quando qualquer instância da classe de função não tiver nenhuma instância da relação. |
| 1..* (Um para muitos) | Cada instância da classe na função que tem essa multiplicidade pode ter várias instâncias da relação e cada instância deve ter pelo menos uma instância da relação. Se a validação estiver habilitada, um erro de validação será exibido quando qualquer instância da classe de função não tiver nenhuma instância da relação. |
Relações de domínio como classes
Um link é representado na Loja como uma instância do LinkElement, que é uma classe derivada de ModelElement. Você pode definir essas propriedades no diagrama do modelo de domínio nas relações de domínio.
Você também pode tornar uma relação a origem ou o destino de outras relações. No diagrama do modelo de domínio, clique com o botão direito do mouse na relação de domínio e clique em Mostrar como Classe. Uma caixa de classe adicional será exibida. Em seguida, você pode conectar relacionamentos a ele.
Você pode definir uma relação em parte por herança, da mesma forma que pode com classes de domínio. Selecione a relação derivada e defina Relação Base na janela Propriedades.
Uma relação derivada especializa a relação base. As classes de domínio das quais ele vincula devem ser derivadas ou as mesmas que as classes vinculadas pela relação base. Quando um link da relação derivada é criado em um modelo, ele é uma instância das relações derivadas e base. No código do programa, você pode navegar até a extremidade oposta do link usando as propriedades geradas pela base ou pela classe derivada.