Noções básicas sobre modelos, classes e relaçõesUnderstanding Models, Classes and Relationships

Uma DSL (linguagem específica de domínio) é definida por seu arquivo de definição de DSL, junto com qualquer código de programa personalizado que você possa escrever.A domain-specific language (DSL) is defined by its DSL Definition file, together with any custom program code that you might write. A maior parte do código do programa na solução de DSL é gerada a partir desse arquivo.Most of the program code in the DSL solution is generated from this file.

Este tópico explica os recursos centrais da definição de DSL.This topic explains the central features of the DSL definition.

A definição de DSLThe DSL Definition

Quando você abre Dsl\DslDefinition.dsl, sua janela do Visual Studio é semelhante à imagem a seguir.When you open Dsl\DslDefinition.dsl, your Visual Studio window resembles the following picture.

Designer de DSL

As informações mais importantes na definição de DSL são exibidas no diagrama de definição de DSL.The most important information in the DSL Definition is displayed in the DSL Definition diagram. Informações adicionais, que também fazem parte de DslDefinition. DSL, são exibidas no Gerenciador de DSL, que geralmente aparece no lado do diagrama.Additional information, which is also part of DslDefinition.dsl, is displayed in DSL Explorer, which usually appears at the side of the diagram. Você trabalha com o diagrama para as tarefas mais frequentes e com o Gerenciador de DSL para personalizações mais avançadas.You work with the diagram for the most frequent tasks, and with DSL Explorer for more advanced customizations.

O diagrama de definição de DSL mostra as classes de domínio que definem elementos de modelo e as relações que definem links entre elementos de modelo.The DSL Definition diagram shows the domain classes that define model elements, and the relationships that define links between model elements. Ele também mostra as formas e os conectores que são usados para exibir os elementos do modelo para o usuário.It also shows the shapes and connectors that are used to display the model elements to the user.

Designer de DSL com raia

Quando você seleciona um item na definição de DSL, seja no diagrama ou no Gerenciador de DSL, as informações sobre ele são exibidas no janela Propriedades.When you select an item in the DSL definition, either on the diagram or in DSL Explorer, information about it is displayed in the Properties window. Informações adicionais podem ser exibidas na janela detalhes de DSL.Additional information may be displayed in the DSL Details window.

Modelos são instâncias de DSLsModels are instances of DSLs

Um modelo é uma instância de sua DSL criada por um usuário.A model is an instance of your DSL created by a user. 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.A model contains model elements, which are instances of the domain classes that you define, and links between the elements, which are instances of the domain relationships that you define. Um modelo também pode ter formas e conectores, que exibem os elementos de modelo e links em um diagrama.A model can also have shapes and connectors, which display the model elements and links on a diagram. A definição de DSL inclui as classes de forma, as classes de conector e uma classe para o diagrama.The DSL definition includes the shape classes, connector classes, and a class for the diagram.

Uma definição de DSL também é conhecida como um modelo de domínio.A DSL Definition is also known as a domain model. Uma definição de DSL ou modelo de domínio é a representação de tempo de design da linguagem específica do domínio, enquanto o modelo é a instanciação de tempo de execução da linguagem específica do domínio.A DSL Definition or domain model is the design-time representation of the domain-specific language, whereas the model is the run-time instantiation of the domain-specific language.

Classes de domínio definem elementos de modeloDomain Classes define Model Elements

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.Domain classes are used to create the various elements in the domain, and domain relationships are the links between the elements. Eles são a representação de tempo de design dos elementos e links que serão instanciados pelos usuários da linguagem específica do design quando criarem seus modelos.They are the design-time representation of the elements and links that will be instantiated by the users of the design-specific language when they create their models.

Esta ilustração mostra um modelo que foi criado pelo usuário de um DSL da biblioteca de música.This illustration shows a model that has been created by the user of a music library DSL. Os álbuns de música são representados por caixas que contêm listas de músicas.Music albums are represented by boxes that contain lists of songs. Os artistas são representados por caixas com cantos arredondados e estão conectados aos álbuns aos quais eles contribuíram.Artists are represented by round-cornered boxes, and are connected to the albums to which they have contributed.

Modelo de instância da DSL gerada

A definição de DSL separa dois aspectos.The DSL Definition separates two aspects. A aparência dos elementos de modelo no diagrama de modelo é definida usando classes de forma e de conector.The appearance of the model elements on the model diagram is defined by using shape classes and connector classes. As informações transportadas no modelo são definidas usando classes de domínio e relações de domínio.The information carried in the model is defined using domain classes and domain relationships.

A ilustração a seguir mostra as classes de domínio e relações na definição de DSL da biblioteca de músicas.The following illustration shows the domain classes and relationships in the DSL Definition of the Music Library.

Incorporação e relações de referência

A ilustração mostra quatro classes de domínio: música, álbum, artista e música.The illustration shows four domain classes: Music, Album, Artist and Song. As classes de domínio definem propriedades de domínio, como nome, título e assim por diante.The domain classes define domain properties such as Name, Title, and so on. No modelo de instância, os valores de algumas dessas propriedades são exibidos no diagrama.In the instance model, the values of some of these properties are displayed on the diagram.

Entre as classes estão relações de domínio: MusicHasAlbums, MusicHasArtists, AlbumbHasSongs e ArtistAppearedOnAlbums.Between the classes are domain relationships: MusicHasAlbums, MusicHasArtists, AlbumbHasSongs, and ArtistAppearedOnAlbums. As relações têm multiplicidades como 1.. 1, 0.. *.The relationships have multiplicities such as 1..1, 0..*. Por exemplo, cada música deve estar relacionada a exatamente um álbum por meio da relação AlbumHasSongs.For example, every Song must be related to exactly one Album through the AlbumHasSongs relationship. Cada álbum pode ter qualquer número de músicas.Every Album can have any number of Songs.

Reorganizando o diagrama de definição de DSLRearranging the DSL Definition Diagram

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.Notice that a domain class can appear several times on the DSL Definition diagram, as Album does in this picture. Há sempre uma exibição principal e pode haver algumas exibições de referência .There is always one main view, and there can be some reference views.

Para reorganizar o diagrama de definição de DSL, você pode:To rearrange the DSL Definition diagram, you can:

  • Permutar exibições principais e de referência usando os comandos colocar árvore aqui e dividir árvore .Swap main and reference views by using the Bring Tree Here and Split Tree commands. Clique com o botão direito do mouse em uma única classe de domínio para ver esses comandos.Right-click a single domain class to see these commands.

  • Reordene as classes de domínio e as classes de forma pressionando Ctrl + Up e Ctrl + Down.Re-order the domain classes and shape classes by pressing Ctrl+Up and Ctrl+Down.

  • Recolha ou expanda classes usando o ícone na parte superior direita de cada forma.Collapse or expand classes using the icon at the upper-right of each shape.

  • Recolha partes da árvore clicando no sinal de subtração (-) na parte inferior de uma classe de domínio.Collapse parts of the tree by clicking the minus sign (-) at the bottom of a domain class.

{1>Herança<1}Inheritance

As classes de domínio podem ser definidas usando a herança.Domain classes can be defined using inheritance. Para criar uma derivação de herança, clique na ferramenta de herança, clique na classe derivada e, em seguida, clique na classe base.To create an inheritance derivation, click the Inheritance tool, click the derived class, and then click the base class. Um elemento de modelo tem todas as propriedades que são definidas em sua própria classe de domínio, junto com todas as propriedades herdadas da classe base.A model element has all the properties that are defined on its own domain class, together with all the properties inherited from the base class. Ele também herda suas funções em relações.It also inherits its roles in relationships.

A herança também pode ser usada entre relações, formas e conectores.Inheritance can also be used between Relationships, Shapes, and Connectors. A herança deve ser mantida dentro do mesmo grupo.Inheritance must keep within the same group. Uma forma não pode herdar de uma classe de domínio.A shape cannot inherit from a domain class.

Relações de domínioDomain Relationships

Elementos de modelo podem ser vinculados por relações.Model elements can be linked by relationships. Os links são sempre binários; Eles vinculam exatamente dois elementos.Links are always binary; they link exactly two elements. No entanto, qualquer elemento pode ter muitos links para outros objetos e pode até mesmo ser mais de um link entre o mesmo par de elementos.However, any element can have many links to other objects, and there can even be more than one link between the same pair of elements.

Assim como você pode definir diferentes classes de elementos, você pode definir diferentes classes de links.Just as you can define different classes of elements, you can define different classes of links. A classe de um link é chamada de relação de domínio.The class of a link is called a domain relationship. Um relacionamento de domínio especifica quais classes de elemento suas instâncias podem se conectar.A domain relationship specifies what classes of element its instances can connect. Cada extremidade de uma relação é chamada de funçãoe o relacionamento de domínio define nomes para as duas funções, bem como para a própria relação.Each end of a relationship is called a role, and the domain relationship defines names for the two roles, as well as for the relationship itself.

Há dois tipos de relações de domínio: inserindo relações e relações de referência.There are two kinds of domain relationships: embedding relationships and reference relationships. No diagrama de definição de DSL, as relações de inserção têm linhas sólidas em cada função e as relações de referência têm linhas tracejadas.On the DSL Definition diagram, embedding relationships have solid lines at each role, and reference relationships have dashed lines.

Inserindo relaçõesEmbedding Relationships

Cada elemento em um modelo, exceto para sua raiz, é o destino de um link de incorporação.Every element in a model, except for its root, is the target of one embedding link. Portanto, todo o modelo forma uma única árvore de links de inserção.Therefore, the whole model forms a single tree of embedding links. Uma relação incorporada representa a contenção ou a propriedade.An embedding relationship represents containment or ownership. Dois elementos de modelo que são relacionados dessa maneira também são conhecidos como pai e filho.Two model elements that are related in this way are also known as parent and child. O filho é considerado inserido no pai.The child is said to be embedded in the parent.

Os links de inserção geralmente não são mostrados explicitamente como conectores em um diagrama.Embedding links are not usually shown explicitly as connectors on a diagram. Em vez disso, eles geralmente são representados por confinamento.Instead, they are usually represented by containment. A raiz do modelo é representada pelo diagrama e os elementos inseridos nela são exibidos como formas no diagrama.The root of the model is represented by the diagram, and elements embedded in it are displayed as shapes on the diagram.

No exemplo, a classe raiz Music tem uma relação incorporada MusicHasAlbums ao álbum, que tem um AlbumHasSongs de inserção para a música.In the example, the root class Music has an embedding relationship MusicHasAlbums to Album, which has an embedding AlbumHasSongs to Song. As músicas são exibidas como itens em uma lista dentro de cada álbum.Songs are displayed as items in a list inside each Album. Music também tem um MusicHasArtists de incorporação para a classe artista, cujas instâncias também aparecem como formas no diagrama.Music also has an embedding MusicHasArtists to the Artist class, whose instances also appear as shapes on the diagram.

Por padrão, os elementos inseridos são excluídos automaticamente quando seus pais são excluídos.By default, embedded elements are automatically deleted when their parents are deleted.

Quando um modelo é salvo no formato de arquivo em XML, os elementos inseridos são aninhados dentro de seus pais, a menos que você tenha personalizado a serialização.When a model is saved to file in XML form, embedded elements are nested inside their parents, unless you have customized the serialization.

Observação

Incorporação não é o mesmo que herança.Embedding is not the same as inheritance. Os filhos em uma relação incorporada não herdam as propriedades do pai.Children in an embedding relationship do not inherit the parent's properties. Uma incorporação é um tipo de link entre elementos de modelo.An embedding is a type of link between model elements. A herança é uma relação entre classes e não cria links entre elementos de modelo.Inheritance is a relationship between classes, and does not create links between model elements.

Regras de incorporaçãoEmbedding rules

Cada elemento em um modelo de instância deve ser o destino de exatamente um link de incorporação, exceto para a raiz do modelo.Every element in an instance model must be the target of exactly one embedding link, except for the root of the model.

Portanto, toda classe de domínio não abstrata, exceto a classe raiz, deve ser o destino de pelo menos uma relação de incorporação ou deve herdar uma incorporação de uma classe base.Therefore, every non-abstract domain class, except the root class, must be the target of at least one embedding relationship, or it must inherit an embedding from a base class. Uma classe pode ser o destino de duas ou mais incorporações, mas seus elementos de modelo de instância só podem ter um pai por vez.A class can be the target of two or more embeddings, but its instance model elements can only have one parent at a time. A multiplicidade do destino para a origem deve ser 0.. 1 ou 1.. 1.The multiplicity from target to source must be 0..1 or 1..1.

O Gerenciador exibe a árvore de incorporaçãoThe Explorer Displays the Embedding Tree

Sua definição de DSL também cria um Gerenciador, que os usuários veem junto com seu diagrama de modelo.Your DSL Definition also creates an explorer, which users see alongside their model diagram.

Gerenciador de DSL gerado

O Explorer mostra todos os elementos no modelo, mesmo aqueles para os quais você não definiu nenhuma forma.The explorer shows all the elements in the model, even those for which you have not defined any shapes. Ele mostra os elementos e as relações de incorporação, mas não as relações de referência.It shows elements and embedding relationships, but not reference relationships.

Para ver os valores das propriedades de domínio de um elemento, o usuário seleciona um elemento, seja no diagrama de modelo ou no Gerenciador de modelos, e abre o janela Propriedades.To see the values of the domain properties of an element, the user selects an element, either in the model diagram or in the model explorer, and opens the Properties window. Ele exibe todas as propriedades de domínio, incluindo aquelas que não são exibidas no diagrama.It displays all the domain properties, including those that are not displayed on the diagram. No exemplo, cada música tem um título e um gênero, mas apenas o valor do título é mostrado no diagrama.In the example, each Song has both a Title and a Genre, but only the value of the Title is shown on the diagram.

Relações de referênciaReference Relationships

Uma relação de referência representa qualquer tipo de relação que não esteja incorporando.A reference relationship represents any kind of relationship that is not embedding.

As relações de referência são geralmente exibidas em um diagrama como conectores entre as formas.Reference relationships are typically displayed on a diagram as connectors between shapes.

Na representação XML do modelo, um link de referência entre dois elementos é representado usando moniker.In the XML representation of the model, a reference link between two elements is represented using monikers. Ou seja, os monikers são nomes que identificam exclusivamente cada elemento no modelo.That is, monikers are names that uniquely identify each element in the model. O nó XML para cada elemento de modelo contém um nó que especifica o nome da relação e o moniker do outro elemento.The XML node for each model element contains a node that specifies the name of the relationship and the moniker of the other element.

Funções doRoles

Cada relação de domínio tem duas funções, uma função de origem e uma função de destino.Every domain relationship has two roles, a source role and a target role.

Na figura a seguir, a linha entre a classe de domínio do Publicador e a relação de domínio PublisherCatalog é a função de origem.In the following picture, the line between the Publisher domain class and the PublisherCatalog domain relationship is the source role. A linha entre a relação de domínio e a classe de domínio de álbum é a função de destino.The line between the domain relationship and the Album domain class is the target role.

Funções e propriedades.

Os nomes associados a uma relação são especialmente importantes quando você escreve o código do programa que percorre o modelo.The names associated with a relationship are especially important when you write program code that traverses the model. Por exemplo, quando você cria a solução de DSL, o editor de classe gerado tem um catálogo de propriedades que é uma coleção de álbuns.For example, when you build the DSL solution, the generated class Publisher has a property Catalog that is a collection of Albums. O álbum de classe tem um editor de propriedade que é uma única instância do editor de classe.The class Album has a property Publisher that is a single instance of the class Publisher.

Quando você cria uma relação em uma definição de DSL, os nomes de propriedade e relação recebem valores padrão.When you create a relationship in a DSL Definition, the property and relationship names are given default values. No entanto, você pode alterá-las.However, you can change them.

MultiplicidadesMultiplicities

As multiplicidades especificam quantos elementos podem ter a mesma função em um relacionamento de domínio.Multiplicities specify how many elements can have the same role in a domain relationship. No exemplo, a configuração de multiplicidade de zero para muitos (0..*) na função de Catálogo especifica que qualquer instância da classe de domínio do Publicador pode ter tantos links de relações PublisherCatalog quanto você deseja dar a ela.In the example, the zero-to-many (0..*) multiplicity setting on the Catalog role specifies that any instance of the Publisher domain class can have as many PublisherCatalog relationship links as you want to give it.

Configure a multiplicidade de uma função digitando no diagrama ou modificando a propriedade Multiplicity na janela Propriedades .Configure the multiplicity of a role either by typing on the diagram or by modifying the Multiplicity property in the Properties window. A tabela a seguir descreve as configurações dessa propriedade.The following table describes the settings for this property.

Tipo de multiplicidadeMultiplicity type DescriçãoDescription
0.. * (zero a muitos)0..* (Zero to many) Cada instância da classe de domínio pode ter várias instâncias da relação ou nenhuma instância da relação.Each instance of the domain class can have multiple instances of the relationship or no instances of the relationship.
0.. 1 (zero a um)0..1 (Zero to one) Cada instância da classe de domínio não pode ter mais de uma instância da relação ou nenhuma das instâncias da relação.Each instance of the domain class can have no more than one instance of the relationship or no instances of the relationship.
1.. 1 (um)1..1 (One) Cada instância da classe de domínio pode ter uma instância da relação.Each instance of the domain class can have one instance of the relationship. Você não pode criar mais de uma instância dessa relação de qualquer instância da classe de função.You cannot create more than one instance of this relationship from any instance of the role class. 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.If validation is enabled, a validation error will appear when any instance of the role class has no instance of the relationship.
1.. * (um para muitos)1..* (One to many) 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.Each instance of the class on the role that has this multiplicity can have multiple instances of the relationship, and each instance must have at least one instance of the relationship. 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.If validation is enabled, a validation error will appear when any instance of the role class has no instance of the relationship.

Relações de domínio como classesDomain Relationships as Classes

Um link é representado no repositório como uma instância de Linkelement, que é uma classe derivada de ModelElement.A link is represented in the Store as an instance of LinkElement, which is a derived class of ModelElement. Você pode definir essas propriedades no diagrama de modelo de domínio em relações de domínio.You can define these properties in the domain model diagram on domain relationships.

Você também pode fazer uma relação entre a origem ou o destino de outras relações.You can also make a relationship the source or target of other relationships. No diagrama de modelo de domínio, clique com o botão direito do mouse na relação de domínio e clique em mostrar como classe.In the domain model diagram, right-click the domain relationship and then click Show As Class. Uma caixa de classe adicional será exibida.An additional class box will appear. Em seguida, você pode conectar relações a ele.You can then connect relationships to it.

Você pode definir uma relação parcialmente por herança, assim como é possível com as classes de domínio.You can define a relationship partly by inheritance, just as you can with domain classes. Selecione a relação derivada e defina a relação base no janela Propriedades.Select the derived relationship and set Base Relationship in the Properties window.

Uma relação derivada especializa sua relação de base.A derived relationship specializes its base relationship. As classes de domínio para as quais ele se vincula devem ser derivadas ou iguais às classes vinculadas pela relação base.The domain classes that it links should be derived from or the same as the classes linked by the base relationship. Quando um link da relação derivada é criado em um modelo, ele é uma instância de relações derivadas e base.When a link of the derived relationship is created in a model, it is an instance of both the derived and the base relationships. No código do programa, você pode navegar até a extremidade oposta do link usando as propriedades geradas pelo base ou pela classe derivada.In program code, you can navigate to the opposite end of the link using the properties generated either by the base or by the derived class.

Veja tambémSee also