Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
| Próxima revisão | Revisão anterior | ||
| pres:gerti:documento_de_arquitetura_de_software [14/07/2022 14:24] – criada bholiveira | pres:gerti:documento_de_arquitetura_de_software [14/07/2022 19:48] (atual) – bholiveira | ||
|---|---|---|---|
| Linha 1: | Linha 1: | ||
| - | ====== | + | ====== |
| ====== .1. Propósito ====== | ====== .1. Propósito ====== | ||
| Linha 32: | Linha 32: | ||
| As soluções de software serão criadas com base no seguinte modelo arquitetural de projetos que segue: | As soluções de software serão criadas com base no seguinte modelo arquitetural de projetos que segue: | ||
| + | {{: | ||
| Figura 1 - Arquitetura de Pacotes | Figura 1 - Arquitetura de Pacotes | ||
| + | |||
| Essa infraestrutura de informação está consolidada na solução TCE.Compartilhado, | Essa infraestrutura de informação está consolidada na solução TCE.Compartilhado, | ||
| A implementação padrão do repositório realiza as principais operações de CRUD com o banco de dados, como apresentado no diagrama abaixo: | A implementação padrão do repositório realiza as principais operações de CRUD com o banco de dados, como apresentado no diagrama abaixo: | ||
| + | {{: | ||
| + | |||
| Figura 2 - Diagrama de Classes - Repositório | Figura 2 - Diagrama de Classes - Repositório | ||
| + | |||
| Já a implementação padrão do serviço além de realizar as principais operações de CRUD, executa nas operações padrão de manipulação dos objetos (DTOs), as validações padrão, definidas na classe padrão de validação, | Já a implementação padrão do serviço além de realizar as principais operações de CRUD, executa nas operações padrão de manipulação dos objetos (DTOs), as validações padrão, definidas na classe padrão de validação, | ||
| A implementação padrão de validação de objetos, utiliza o framework FluentValidation, | A implementação padrão de validação de objetos, utiliza o framework FluentValidation, | ||
| + | {{: | ||
| + | |||
| Figura 3 - Diagrama de Classes - Serviço | Figura 3 - Diagrama de Classes - Serviço | ||
| + | |||
| A UI realiza as operações com o sistemas utilizando DTOs.Cada DTO | A UI realiza as operações com o sistemas utilizando DTOs.Cada DTO | ||
| contem atributos e operações de acordo com as permissões de uso do usuário, seja | contem atributos e operações de acordo com as permissões de uso do usuário, seja | ||
| Linha 57: | Linha 65: | ||
| MVC, porem o Model será implementada pela camada de Interfaces Fábricas | MVC, porem o Model será implementada pela camada de Interfaces Fábricas | ||
| (InterfacesFabricas), | (InterfacesFabricas), | ||
| + | {{: | ||
| + | |||
| Figura 4 - Fluxo MVC | Figura 4 - Fluxo MVC | ||
| + | |||
| Os controladores executam as operações através dos serviços implementados, | Os controladores executam as operações através dos serviços implementados, | ||
| As Views da UI, não terão qualquer implementação de regra de negócio, devendo se limitar apenas no tratamento de apresentação dos dados ao usuário e converter as informações de entrada do usuário em objetos de transito , DTO, para que esse seja enviado na chamada da funcionalidade pelo serviço. Os serviços são responsáveis de validar as informações transitadas (DTOs), verificar as regras e controles de acesso, e executar as operações solicitadas pelo usuário através das UIs. | As Views da UI, não terão qualquer implementação de regra de negócio, devendo se limitar apenas no tratamento de apresentação dos dados ao usuário e converter as informações de entrada do usuário em objetos de transito , DTO, para que esse seja enviado na chamada da funcionalidade pelo serviço. Os serviços são responsáveis de validar as informações transitadas (DTOs), verificar as regras e controles de acesso, e executar as operações solicitadas pelo usuário através das UIs. | ||
| Linha 64: | Linha 75: | ||
| Essa camada é responsável por definir os contratos de operações dos serviços - interfaces de serviço, os objetos de transito (DTOs) e as fábricas de objetos e de operações. | Essa camada é responsável por definir os contratos de operações dos serviços - interfaces de serviço, os objetos de transito (DTOs) e as fábricas de objetos e de operações. | ||
| O projeto TCE.Compartilhado, | O projeto TCE.Compartilhado, | ||
| + | {{: | ||
| + | |||
| Figura 5 - Diagrama de Sequência - Fábrica Genérica | Figura 5 - Diagrama de Sequência - Fábrica Genérica | ||
| + | |||
| ==== 3.2.3. Serviço (“Servico”) ==== | ==== 3.2.3. Serviço (“Servico”) ==== | ||
| Linha 112: | Linha 126: | ||
| Partindo de uma visão top-down, cada produto de software concebido nesse modelo arquitetural, | Partindo de uma visão top-down, cada produto de software concebido nesse modelo arquitetural, | ||
| Com base nessa análise top-dow, podemos visualizar a suíte de produtos do TCE-GO da forma representada no diagrama que segue: | Com base nessa análise top-dow, podemos visualizar a suíte de produtos do TCE-GO da forma representada no diagrama que segue: | ||
| + | {{: | ||
| + | |||
| Figura 6 - Diagrama de Componentes - Integração dos Produtos | Figura 6 - Diagrama de Componentes - Integração dos Produtos | ||
| + | |||
| ===== 3.4. Padrões ===== | ===== 3.4. Padrões ===== | ||
| Os projetos implementados baseados nessa arquitetura deverão seguir o padrão de nomenclatura dos projetos, o padrão estrutural de projetos (pacotes) da solução, bem como a organização estrutural dos pacotes interno dentro de cada projeto, como apresentado nas figuras abaixo: | Os projetos implementados baseados nessa arquitetura deverão seguir o padrão de nomenclatura dos projetos, o padrão estrutural de projetos (pacotes) da solução, bem como a organização estrutural dos pacotes interno dentro de cada projeto, como apresentado nas figuras abaixo: | ||
| + | |||
| + | {{: | ||
| Figura 7 - Padrão Estrutural de Projetos | Figura 7 - Padrão Estrutural de Projetos | ||
| + | |||
| Deve ser observado o padrão de nomenclatura dos projetos de cada solução (produto de software) implementada baseada nesse modelo arquitetural. Todos os projetos deve ter como prefixo, o nome “TCE.”. Esse prefixo é utilizado como identificador dos produtos que utilizam a arquitetura definida nesse documento. A partir desse identificador, | Deve ser observado o padrão de nomenclatura dos projetos de cada solução (produto de software) implementada baseada nesse modelo arquitetural. Todos os projetos deve ter como prefixo, o nome “TCE.”. Esse prefixo é utilizado como identificador dos produtos que utilizam a arquitetura definida nesse documento. A partir desse identificador, | ||
| O padrão estrutural dos pacotes por projeto, seguirá o exemplo apresentado nos itens abaixo: | O padrão estrutural dos pacotes por projeto, seguirá o exemplo apresentado nos itens abaixo: | ||
| ● Camada Interfaces Fábricas (InterfacesFabricas): | ● Camada Interfaces Fábricas (InterfacesFabricas): | ||
| propósito de cada pacote, deverá obedecer a organização dos pacotes da camada de Negócio, localizada por padrão no projeto de Serviço, no pacote “Negocio”. | propósito de cada pacote, deverá obedecer a organização dos pacotes da camada de Negócio, localizada por padrão no projeto de Serviço, no pacote “Negocio”. | ||
| + | |||
| + | {{: | ||
| Figura 8 - Padrão do Projeto InterfacesFabricas | Figura 8 - Padrão do Projeto InterfacesFabricas | ||
| + | |||
| ● Camada Serviços (Servico): a estrutura de pacotes utilizado no sub pacote de Negócio, também serão organizadas as classes contidas nos pacotes de “Conversores”, | ● Camada Serviços (Servico): a estrutura de pacotes utilizado no sub pacote de Negócio, também serão organizadas as classes contidas nos pacotes de “Conversores”, | ||
| + | |||
| + | {{: | ||
| Figura 9 - Padrão do Projeto Servico | Figura 9 - Padrão do Projeto Servico | ||
| + | |||
| ● Camada de Testes: o nome dos projetos de teste deve conter antes do nome da camada a qual será testada o prefixo “Testes”. Por padrão, os projetos de teste inicialmente serão dois, os de teste da camada de repositório e o da camada de serviço. Não obstante a isso, caso o produto de software realize integração com produtos de terceiros, nesse projeto terá outro projeto de testes cujo sufixo será “Integracao” (Integração), | ● Camada de Testes: o nome dos projetos de teste deve conter antes do nome da camada a qual será testada o prefixo “Testes”. Por padrão, os projetos de teste inicialmente serão dois, os de teste da camada de repositório e o da camada de serviço. Não obstante a isso, caso o produto de software realize integração com produtos de terceiros, nesse projeto terá outro projeto de testes cujo sufixo será “Integracao” (Integração), | ||
| + | |||
| + | {{: | ||
| Figura 10 - Padrão do Projetos de Testes | Figura 10 - Padrão do Projetos de Testes | ||
| + | |||
| ● Camada UI: todos os projeto UI, independente do tipo Web, Desktop ou Console terão o identificado no nome do projeto que identifica que o projeto é UI e qual o padrão utilizado, por exemplo: se for um projeto UI Web MVC, utilizando o produto Informa, o nome do projeto será “TCE.Informa.UI.MVC”. Se o produto Informa tiver uma interface UI Desktop, o nome do projeto seria “TCE.Informa.UI.Desk”. E se tivesse uma interface Console Application, | ● Camada UI: todos os projeto UI, independente do tipo Web, Desktop ou Console terão o identificado no nome do projeto que identifica que o projeto é UI e qual o padrão utilizado, por exemplo: se for um projeto UI Web MVC, utilizando o produto Informa, o nome do projeto será “TCE.Informa.UI.MVC”. Se o produto Informa tiver uma interface UI Desktop, o nome do projeto seria “TCE.Informa.UI.Desk”. E se tivesse uma interface Console Application, | ||
| + | {{: | ||
| Figura 11 - Padrão do Projetos UI MVC | Figura 11 - Padrão do Projetos UI MVC | ||
| + | |||
| ====== 4. Sistemática de Qualidade ====== | ====== 4. Sistemática de Qualidade ====== | ||
| A qualidade dos produtos desenvolvidos utilizando essa modelo arquitetural não se limita apenas na verificação e validação das regas e estruturas de dados especificados nos documentos de requisitos. Para garantir a qualidade interna e externa dos produtos de software, foram estabelecidos alguns padrões de codificação, | A qualidade dos produtos desenvolvidos utilizando essa modelo arquitetural não se limita apenas na verificação e validação das regas e estruturas de dados especificados nos documentos de requisitos. Para garantir a qualidade interna e externa dos produtos de software, foram estabelecidos alguns padrões de codificação, | ||
| + | |||
| ===== 4.1. Qualidade Interna ===== | ===== 4.1. Qualidade Interna ===== | ||
| A qualidade interna do produto de software será determinada quando a estrutura lógica do código, quanto a organização dos métodos e variáveis, quando a capacidade de apreensibilidade do código lido, nomenclatura de métodos e variáveis e quanto ao tamanho das estruturas (quantidade de linhas de código por método e classe). | A qualidade interna do produto de software será determinada quando a estrutura lógica do código, quanto a organização dos métodos e variáveis, quando a capacidade de apreensibilidade do código lido, nomenclatura de métodos e variáveis e quanto ao tamanho das estruturas (quantidade de linhas de código por método e classe). | ||
| - | Para estabelecer um padrão de qualidade interna dos produtos de software aderentes à arquitetura de software que trata esse documento, foi definido os seguintes padrões de código: | + | Para estabelecer um padrão de qualidade interna dos produtos de software aderentes à arquitetura de software que trata esse documento, foi definido os seguintes padrões de código: |
| + | |||
| ● Estilo de código - o padrão de estilo de código utilizado nos projetos será o padrão determinado pela Microsoft, com alterações definidas pelas estruturas de Style Cop adotadas pela equipe de desenvolvimento da GER-TI. Todo arquivo de classe de projeto deve ter o cabeçalho contendo a propriedade intelectual do TCE-GO, como apresentado na imagem abaixo. | ● Estilo de código - o padrão de estilo de código utilizado nos projetos será o padrão determinado pela Microsoft, com alterações definidas pelas estruturas de Style Cop adotadas pela equipe de desenvolvimento da GER-TI. Todo arquivo de classe de projeto deve ter o cabeçalho contendo a propriedade intelectual do TCE-GO, como apresentado na imagem abaixo. | ||
| + | |||
| + | {{: | ||
| + | |||
| Figura 12 - Cabeçalho de Classe | Figura 12 - Cabeçalho de Classe | ||
| + | |||
| ● Estrutura do código - a estrutura interna das classes serão organizadas inicialmente pelas variáveis, propriedades, | ● Estrutura do código - a estrutura interna das classes serão organizadas inicialmente pelas variáveis, propriedades, | ||
| ○ Variáveis - as variáveis de escopo da classe serão organizadas na seguinte ordem: variáveis constantes serão as primeiras iniciadas a partir das públicas, seguida das internas, posteriormente as protegidas e por fim as privadas. Já as variáveis diferente de constantes serão ordenadas após as constantes em ordem de acesso iniciadas a partir das públicas, seguida das internas, posteriormente as protegidas e por fim as privadas. | ○ Variáveis - as variáveis de escopo da classe serão organizadas na seguinte ordem: variáveis constantes serão as primeiras iniciadas a partir das públicas, seguida das internas, posteriormente as protegidas e por fim as privadas. Já as variáveis diferente de constantes serão ordenadas após as constantes em ordem de acesso iniciadas a partir das públicas, seguida das internas, posteriormente as protegidas e por fim as privadas. | ||
| Linha 147: | Linha 184: | ||
| internas, protegidas e por último as provadas, sendo os construtores de classe organizados em primeira posição. | internas, protegidas e por último as provadas, sendo os construtores de classe organizados em primeira posição. | ||
| ○ Métodos - os métodos serão organizados inicialmente por métodos públicos iniciados pelos tipo estáticos, seguidos de métodos internos, protegidos e posteriormente por métodos privados. Seguindo o manual de boas práticas de construção de código, Clean Code, os métodos das classes devem ser estruturados de acordo com a dependência entre si, isto é, os métodos utilizado por um método deve ser alocado logo abaixo desse método, de modo que o código seja auto explicativo, | ○ Métodos - os métodos serão organizados inicialmente por métodos públicos iniciados pelos tipo estáticos, seguidos de métodos internos, protegidos e posteriormente por métodos privados. Seguindo o manual de boas práticas de construção de código, Clean Code, os métodos das classes devem ser estruturados de acordo com a dependência entre si, isto é, os métodos utilizado por um método deve ser alocado logo abaixo desse método, de modo que o código seja auto explicativo, | ||
| + | |||
| ● Comentário de Bloco - o comentário de bloco será permitido para os métodos de interfaces e classes de forma obrigatória para os métodos públicos e facultativo para os métodos privados. Para os métodos de classes que utilizam a especificação por interfaces, o comentário do método pode ser único pela interface, ficando facultativo replicar o comentário no método da(s) classe(s) concreta(s), | ● Comentário de Bloco - o comentário de bloco será permitido para os métodos de interfaces e classes de forma obrigatória para os métodos públicos e facultativo para os métodos privados. Para os métodos de classes que utilizam a especificação por interfaces, o comentário do método pode ser único pela interface, ficando facultativo replicar o comentário no método da(s) classe(s) concreta(s), | ||
| + | |||
| ● Comentário de Linha - o comentário de linha de código não poderá ser extenso, devendo se limitar, de forma intuitiva, a explicação do uso da estrutura comentada e seu propósito. | ● Comentário de Linha - o comentário de linha de código não poderá ser extenso, devendo se limitar, de forma intuitiva, a explicação do uso da estrutura comentada e seu propósito. | ||
| + | |||
| ● Nomenclatura de Variáveis e Métodos - não existe limitação quanto ao tamanho do nome para variáveis e métodos. O nome desses estruturas deve sempre ser intuitivo de modo a facilitar o entendimento do propósito e para que serve a estrutura, dessa forma o nome das mesmas serem auto explicativas. O nome dessas estruturas que utilize mais de uma palavra, para as variáveis deve iniciar com letra minuscula e para métodos com letra maiúscula, e para ambas as palavra subsequentes a primeira deve sempre iniciar com letra maiúscula. As palavras que compõem o nome dessas estruturas deve conter ao menos duas letras, para não ferir o padrão de iniciar maiúsculo da segunda palavras em diante. O nome de métodos deve iniciar sempre com verbo, de forma a indicar a ação executada pela estrutura, como “Obtenha”, | ● Nomenclatura de Variáveis e Métodos - não existe limitação quanto ao tamanho do nome para variáveis e métodos. O nome desses estruturas deve sempre ser intuitivo de modo a facilitar o entendimento do propósito e para que serve a estrutura, dessa forma o nome das mesmas serem auto explicativas. O nome dessas estruturas que utilize mais de uma palavra, para as variáveis deve iniciar com letra minuscula e para métodos com letra maiúscula, e para ambas as palavra subsequentes a primeira deve sempre iniciar com letra maiúscula. As palavras que compõem o nome dessas estruturas deve conter ao menos duas letras, para não ferir o padrão de iniciar maiúsculo da segunda palavras em diante. O nome de métodos deve iniciar sempre com verbo, de forma a indicar a ação executada pela estrutura, como “Obtenha”, | ||
| + | |||
| ● Nomenclatura de Classes - toda classe preferencialmente deve ser um TAD, de modo a representa objetos do mundo real. Porem, há possibilidade ser necessário criar classes úteis funcionais para determinada operações típicas, como classes de extensão, classes de verificação de tipos conhecidos, como validação de CPF e CNPJ, entre outras. Para isso essas classes utilitárias, | ● Nomenclatura de Classes - toda classe preferencialmente deve ser um TAD, de modo a representa objetos do mundo real. Porem, há possibilidade ser necessário criar classes úteis funcionais para determinada operações típicas, como classes de extensão, classes de verificação de tipos conhecidos, como validação de CPF e CNPJ, entre outras. Para isso essas classes utilitárias, | ||
| + | |||
| ● Tamanho da estrutura - as classes não tem tamanho máximo fixado, porem, classes acima de 2 mil linhas de código devem ser refatoradas para | ● Tamanho da estrutura - as classes não tem tamanho máximo fixado, porem, classes acima de 2 mil linhas de código devem ser refatoradas para | ||
| classes de controle específico, | classes de controle específico, | ||
| Linha 177: | Linha 219: | ||
| O TCE-GO possui projetos anteriores a arquitetura descrita nesse documento, chamados pela equipe da GER-TI de produtos legados. Como a demanda de migração desses projetos para essa arquitetura se dá de forma gradual, algumas estruturas de negócio do TCE-GO, foram migradas de forma pontual para a arquitetura descrita nesse documento, e foram incluídas nesse projeto, de forma temporária. Essas estruturas serão incluídas nos projetos que as mantem, quando esses projetos forem migrados para a arquitetura descrita nesse documento. | O TCE-GO possui projetos anteriores a arquitetura descrita nesse documento, chamados pela equipe da GER-TI de produtos legados. Como a demanda de migração desses projetos para essa arquitetura se dá de forma gradual, algumas estruturas de negócio do TCE-GO, foram migradas de forma pontual para a arquitetura descrita nesse documento, e foram incluídas nesse projeto, de forma temporária. Essas estruturas serão incluídas nos projetos que as mantem, quando esses projetos forem migrados para a arquitetura descrita nesse documento. | ||
| Essa abordagem de desenvolvimento será utilizada sempre que situações de necessidade exigirem essa migração parcial, para beneficiar um ou vários projetos da suíte de produtos do TCE-GO. | Essa abordagem de desenvolvimento será utilizada sempre que situações de necessidade exigirem essa migração parcial, para beneficiar um ou vários projetos da suíte de produtos do TCE-GO. | ||
| + | |||
| + | {{: | ||
| Figura 13 - Estrutura do projeto TCE.Compartilhado | Figura 13 - Estrutura do projeto TCE.Compartilhado | ||
| + | |||
| O projeto TCE.Compartilhado foi desenvolvido na primeira versão da proposta de arquitetura dos softwares do TCE-GO. Essa versão diferente da proposta desse documento, os pacotes Negócio, Repositório e Serviço eram projetos separados. Na proposta desse documento, esses três projetos são organizados em um único projeto, e suas estruturas são organizadas em pacotes separados com os nomes do que antes eram projetos, pacotes de Negócio, Repositório e Serviços, como podemos visualizar na Figura 7 e na Figura 9. | O projeto TCE.Compartilhado foi desenvolvido na primeira versão da proposta de arquitetura dos softwares do TCE-GO. Essa versão diferente da proposta desse documento, os pacotes Negócio, Repositório e Serviço eram projetos separados. Na proposta desse documento, esses três projetos são organizados em um único projeto, e suas estruturas são organizadas em pacotes separados com os nomes do que antes eram projetos, pacotes de Negócio, Repositório e Serviços, como podemos visualizar na Figura 7 e na Figura 9. | ||
| ===== 5.2. TCE.Componentes ===== | ===== 5.2. TCE.Componentes ===== | ||
| Linha 185: | Linha 230: | ||
| Atualmente, esse projeto define o padrão do pacote visual UI MVC, para projetos Web que utilizam a tecnologia Asp.Net MVC na versão 4.5 e 5. Esse componente visual está presente em vários projetos, em que um dos componentes mais utilizado é o componente de Login e o componente de Categoria Download. | Atualmente, esse projeto define o padrão do pacote visual UI MVC, para projetos Web que utilizam a tecnologia Asp.Net MVC na versão 4.5 e 5. Esse componente visual está presente em vários projetos, em que um dos componentes mais utilizado é o componente de Login e o componente de Categoria Download. | ||
| Estruturação da arquitetura proposta nesse documento, incluído os projetos de infraestrutura e componentização, | Estruturação da arquitetura proposta nesse documento, incluído os projetos de infraestrutura e componentização, | ||
| + | |||
| + | {{: | ||
| + | |||
| Figura 14 - Arquitetura da Informação - Suíte de Produtos | Figura 14 - Arquitetura da Informação - Suíte de Produtos | ||
| + | |||
| + | {{: | ||
| + | |||
| Figura 15 - Arquitetura de Pacotes | Figura 15 - Arquitetura de Pacotes | ||
| + | |||
| ====== 6. Camadas ====== | ====== 6. Camadas ====== | ||
| Linha 205: | Linha 257: | ||
| Nessa camada no pacote Dto, serão especificadas as classes de Objetos de Transferência de Dados, os quais devem ser utilizados pela camada de apresentação UI, para apresentar e obter as informações dos usuários para as chamadas e operações dos serviços. Todos os DTOs devem herdar da classe abstrata definida pelo projeto TCE.Compartilhado, | Nessa camada no pacote Dto, serão especificadas as classes de Objetos de Transferência de Dados, os quais devem ser utilizados pela camada de apresentação UI, para apresentar e obter as informações dos usuários para as chamadas e operações dos serviços. Todos os DTOs devem herdar da classe abstrata definida pelo projeto TCE.Compartilhado, | ||
| Em projetos UI Web, implementados em Asp.Net MVC 4, estabelecemos um padrão organizacional dos componentes de cada estrutura como é sugerido por esse padrão. Nesses projetos o pacote Controllers contem todas as classes de controladores das Views, sendo que o nome de cada controlador, | Em projetos UI Web, implementados em Asp.Net MVC 4, estabelecemos um padrão organizacional dos componentes de cada estrutura como é sugerido por esse padrão. Nesses projetos o pacote Controllers contem todas as classes de controladores das Views, sendo que o nome de cada controlador, | ||
| + | |||
| + | {{: | ||
| Figura 16 - Estrutura Projeto MVC | Figura 16 - Estrutura Projeto MVC | ||
| + | |||
| ===== 6.3. Serviço ===== | ===== 6.3. Serviço ===== | ||
| Linha 225: | Linha 280: | ||
| Esses objetos são completos, com todos os atributos de negócio, logo não tem a restrição quanto ao controle de acesso, visto que o controle de acesso é realizado pela camada de serviço, na consulta e operações da UI ou de outros serviços. | Esses objetos são completos, com todos os atributos de negócio, logo não tem a restrição quanto ao controle de acesso, visto que o controle de acesso é realizado pela camada de serviço, na consulta e operações da UI ou de outros serviços. | ||
| As propriedades que representam entidades de classes persistidas não devem ser criadas como sendo do tipo “virtual”, | As propriedades que representam entidades de classes persistidas não devem ser criadas como sendo do tipo “virtual”, | ||
| + | |||
| + | {{: | ||
| + | |||
| Figura 17 - Exemplo Load Entidade Relacionada | Figura 17 - Exemplo Load Entidade Relacionada | ||
| + | |||
| + | {{: | ||
| + | |||
| Figura 18 - Exemplo Include Entidade Relacionada | Figura 18 - Exemplo Include Entidade Relacionada | ||
| + | |||
| ====== 7. Ferramentas e Tecnologias ====== | ====== 7. Ferramentas e Tecnologias ====== | ||