diff --git a/docs/ArquiteturaReutilizacao/4.1.1.DASmtp.md b/docs/ArquiteturaReutilizacao/4.1.1.DASmtp.md new file mode 100644 index 0000000..06ab6a7 --- /dev/null +++ b/docs/ArquiteturaReutilizacao/4.1.1.DASmtp.md @@ -0,0 +1,203 @@ +# DAS + +## O documento em questão foi criado e desenvolvido pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). Para a sua criação, cada aluno fez um ou mais visões para que a produção fosse otimizada, segue a tabela: + +| Aluno | Visão | +|-------------------------------------------------|-------------------------------------------------------------------------| +| [Mateus Orlando](https://github.com/MateusPy) | Vissão Lógica, Visão de Implantação e Visão de Implementação. | +| [Pedro Lucas](https://github.com/AlefMemTav) | Visão de Casos de Uso. | +| [Thiago Vivan](https://github.com/thiago-vivan) | Visão de Estados. | + +## 1. Introdução + +O **Documento de Arquitetura de Software (DAS)** é um artefato fundamental no desenvolvimento de sistemas de software complexos, oferecendo uma visão abrangente da estrutura e organização do sistema. Ele descreve os componentes principais, suas interações e os princípios de design que guiam sua construção e evolução, facilitando a comunicação entre todas as partes interessadas e garantindo uma compreensão compartilhada do sistema. + +O DAS inclui várias visões arquiteturais, como a Visão Lógica, que detalha a organização conceitual do software em termos de camadas, subsistemas, pacotes, classes e interfaces, e a Visão de Implementação, que mostra a organização dos módulos, pacotes e camadas do modelo de implementação. Essas visões ajudam a reduzir a complexidade do sistema, suportam a tomada de decisões informadas e asseguram a manutenção da qualidade e a evolução contínua do software. + +## 2. Objetivo + +O artefato em questão tem como objetivo representar a arquitetura de software do projeto MyMarket através do modelo arquitetural **4+1** que é uma abordagem estruturada para descrever a arquitetura de software utilizando cinco vistas diferentes para capturar e abordar as diversas preocupações dos stakeholders. Este modelo foi proposto por Philippe Kruchten em 1995 e é amplamente utilizado na engenharia de software. + +![alt text](image.png) + +
Figura 01: Exemplo de modelo arquitetural 4+1. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan.
+ +## 3. Visão de Casos de Uso + +Casos de uso são uma técnica de modelagem usada para descrever a funcionalidade de um sistema de forma a demonstrar como ele interage com entidades externas, conhecidas como atores. Em essência, um caso de uso descreve quem pode fazer o quê com o sistema em questão. Esta abordagem é utilizada para capturar requisitos funcionais, fornecendo uma visão clara de como o sistema deve se comportar. + +Casos de uso elicitados: +
+ +| Código | Descrição do Caso de Uso | +|---------|--------------------------------| +| UC01 | Visualizar Cliente | +| UC02 | Editar Cliente | +| UC03 | Excluir Cliente | +| UC04 | Consultar Cliente | +| UC05 | Consultar Produto | +| UC06 | Excluir Produto | +| UC07 | Editar Produto | +| UC08 | Visualizar Produto | +| UC09 | Consultar Cliente | +| UC10 | Consultar Cliente | +| UC11 | Consultar Cliente | +| UC12 | Cadastrar Material | +| UC13 | Cadastrar Produto | +| UC14 | Cadastrar Cliente | +| UC15 | Cadastrar Pedido | +| UC16 | Alterar Senha | +| UC17 | Editar Dados do Usuário | +| UC18 | Excluir Conta | +| UC19 | Consultar Material | +| UC20 | Editar Material | +| UC21 | Visualizar Material | +| UC22 | Excluir Material | +| UC23 | Consultar Pedido | +| UC24 | Excluir Pedido | +| UC25 | Visualizar Pedido | +| UC25 | Visualizar Lucro | +| UC25 | Editar Pedido | + + +Tabela 1: Casos de uso elicitados. +Autor: Mateus Orlando. + +
+ +
Diagrama de Casos de Uso +

Figura 02 - Diagrama de Casos de Uso.
Autor: Pedro Lucas.

+ +### diagrama de casos de uso (DCU) + + +## 4. Visão Lógica + +A Visão Lógica é uma parte crucial do modelo arquitetural 4+1, focada na estrutura estática do sistema de software. Esta visão descreve como os principais elementos do sistema, como classes, pacotes e módulos, são organizados e como eles interagem entre si. A Visão Lógica facilita a compreensão das funcionalidades do sistema, destacando as principais entidades e suas relações. Ela é essencial para os desenvolvedores e designers de software, fornecendo uma base sólida para a implementação e evolução do sistema. Através de diagramas de classes e pacotes, a Visão Lógica oferece uma representação clara da arquitetura interna, garantindo que a estrutura do software seja bem compreendida e que os componentes estejam adequadamente organizados para suportar as funcionalidades desejadas. + + +### 4.1 Diagrama de classes + +O diagrama de classes é uma representação fundamental na modelagem de sistemas orientados a objetos, oferecendo uma visão detalhada da estrutura estática do sistema. Este diagrama ilustra as classes que compõem o sistema, seus atributos, métodos, e os relacionamentos entre elas, como associações, heranças e dependências. Ao fornecer uma descrição clara das entidades do sistema e suas interações, o diagrama de classes facilita a compreensão da arquitetura interna e serve como uma base sólida para o desenvolvimento e a documentação do software. Ele é amplamente utilizado para projetar e comunicar a estrutura do software entre os membros da equipe de desenvolvimento, garantindo que todos tenham uma visão compartilhada e consistente do sistema. + +O diagrama de classes abaixo foi elaborado em conjunto, por todos os alunos do grupo. + +Para visualizar o diagrama de classes, clique [aqui](https://lucid.app/documents/embedded/6faa106a-bd21-44dc-8ed7-5a0dd9ee38c8). + +
+ +Este diagrama foi elaborado buscando observar e entender as classes existentes na aplicação e como elas se relacionam no escopo analisado, de avaliação de um produto. Com isso esta versão final deste diagrama possui a modelagem dos pontos identificados pelo grupo durante o projeto. + +### 4.2 Diagrama de Estados + +O diagrama de estados é uma ferramenta essencial na modelagem de sistemas dinâmicos, utilizada para representar os estados possíveis de um objeto ao longo do seu ciclo de vida e as transições entre esses estados. Cada estado reflete uma condição ou situação em que o objeto pode se encontrar, enquanto as transições indicam as mudanças de estado causadas por eventos ou condições específicas. Este diagrama é particularmente útil para entender e projetar o comportamento de objetos complexos que respondem a diversos estímulos. Ao proporcionar uma visualização clara das diferentes fases que um objeto pode atravessar, o diagrama de estados facilita a análise e a documentação dos aspectos dinâmicos do sistema, ajudando a garantir que o comportamento do software seja bem compreendido e corretamente implementado. + +O diagrama abaixo, representado na figura 2, foi modelado pelo aluno Guilherme Nishimura. + +*Fluxo de Reembolso :* +
Diagrama de Estados +

Figura 02 - Diagrama de Estados
Autores: Guilherme Nishimura

+ +Este diagrama detalhado foi essencial para garantir que todas as etapas e possíveis estados fossem considerados e bem definidos, proporcionando uma visão abrangente e clara do fluxo de reembolsos. + +### 4.3 Diagrama de Pacotes + +O diagrama de pacotes é uma ferramenta crucial na modelagem de sistemas de software, utilizada para organizar e visualizar a estrutura modular do sistema. Este diagrama mostra como o sistema é dividido em pacotes, que agrupam classes e outros elementos, e as dependências entre esses pacotes. Ao representar a hierarquia e a organização dos pacotes, o diagrama de pacotes ajuda a gerenciar a complexidade do sistema, facilitando a compreensão de suas partes constituintes e suas interações. Ele é particularmente útil para planejar a arquitetura do sistema, promovendo a modularidade e a reutilização de componentes. Além disso, o diagrama de pacotes auxilia na comunicação entre os membros da equipe de desenvolvimento, garantindo que todos tenham uma visão clara e coerente da estrutura do software. + +O diagrama abaixo foi elaborado pelo aluno Mateus Orlando. + +
Diagrama de Pacote (v1.1) + +

Figura 03 - Diagrama de Pacotes.

+

Fonte: Mateus Orlando.

+
+ +## 5. Visão de Processo + +A visão de processo em um documento de arquitetura de software descreve os processos, atividades e fluxos de trabalho envolvidos no desenvolvimento, manutenção e evolução do software ao longo de seu ciclo de vida. Para representar a sequência lógica das atividades e o fluxo do sistema podemos utilizar do Diagrama de atividades, de sequência ou qualquer outra representação gráfica que indique como as atividades são executadas e como as informações fluem em diferentes partes do sistema. + + +![alt text](sequencia.png) + +
Figura 04: Diagrama de Sequência. Fonte: Thiago Vivan.
+ + +## 6. Visão de Implementação + +A Visão de Implementação é um componente crítico do modelo arquitetural 4+1, focado em como o sistema de software é organizado em termos de seus componentes de código-fonte. Esta visão descreve a estrutura dos módulos, pacotes e camadas, além de ilustrar como eles são integrados para formar o sistema completo. A Visão de Implementação é essencial para desenvolvedores e gerentes de configuração, pois facilita a compreensão da arquitetura física do software e como as diferentes partes se inter-relacionam. Ao proporcionar uma visão clara da organização do código e das dependências entre os componentes, esta visão ajuda a garantir que o sistema seja modular, escalável e fácil de manter, suportando assim uma implementação eficaz e eficiente do software. + +Para esse visão, usamos o diagrama de componentes, apresentado a seguir, feito pelo aluno Guilherme Oliveira. + +
Diagrama de Componentes +

Figura 05 - Diagrama de Componentes
Autor: Guilherme de Oliveira

+ + +## 7. Visão de Implantação + +Os diagramas de implantação são uma ferramenta essencial para arquitetos de software e engenheiros de sistemas, permitindo a visualização e o planejamento da distribuição física dos componentes de software. Eles garantem que todos os aspectos físicos da implantação do sistema sejam compreendidos e documentados, facilitando a comunicação entre as partes interessadas e assegurando uma implementação bem-sucedida do sistema. + +Este documento apresenta a arquitetura de implantação de um sistema distribuído, com foco em eficiência, segurança e escalabilidade. O sistema é estruturado em vários nós principais: Cliente, Proxy, Web Server e Database, cada um contendo componentes e entidades específicas. É importante destacar que o diagrama foi elaborado sem a definição completa das tecnologias a serem utilizadas, podendo sofrer alterações conforme as decisões do grupo evoluem. + +
Diagrama de implantação +

Figura 06 - Diagrama de Implantação
Autor: Mateus Orlando

+ + + + +### 7.1 Nó PC/Mobile +- Componentes: + - Browser: Interface de usuário para acesso ao sistema. +- Comunicação: + - Estabelece uma conexão TCP/IP com o nó Proxy. + +### 7.2 Nó Proxy +- Componentes: + - Gerenciamento de Cache: + - Entidade Cache: Responsável por armazenar dados frequentemente acessados, melhorando a resposta do sistema. + - Segurança: + - Entidade Filtro de Navegação: Filtra requisições para segurança do sistema. +- Comunicação: + - Conecta-se ao Web Server via HTTPS. + +### 7.3 Nó Web Server +- Componentes: + - Permissão de Usuário: Gerencia as permissões e acessos dos usuários. + - Federação de Usuário: Facilita a autenticação de usuários de diferentes domínios. +- Comunicação: + - Estabelece uma conexão TCP/IP com o nó DBServer. + +### 7.4 Nó Database +- Componentes: + - MySQL: Responsável pelo armazenamento e gerenciamento de dados. + +### 7.5 Fluxo de Dados e Controle +1. Do Cliente ao Proxy: O tráfego inicia no PC ou dispositivo mobile, passa pelo Browser e é direcionado ao Proxy via TCP/IP. +2. Do Proxy ao Web Server: O Proxy processa as requisições, aplicando cache, segurança, antes de enviar ao Web Server via HTTPS. +3. Do Web Server ao Database: Após processamento no Web Server, as requisições são encaminhadas para o Database para operações de dados. + +### Conclusão + +Este sistema apresenta uma arquitetura robusta e segura, com ênfase na eficiência de processamento, segurança da informação e privacidade do usuário. Cada nó e componente foi estrategicamente posicionado para otimizar a performance, garantir a segurança e permitir a escalabilidade do sistema. Através do detalhamento fornecido pelo diagrama de implantação, conseguimos visualizar claramente a distribuição física dos componentes e as suas interações, assegurando que a infraestrutura do "My Market" seja bem planejada e configurada para atender aos requisitos do projeto de forma eficaz. Esta abordagem não só facilita a comunicação entre as partes interessadas, mas também contribui para uma implementação bem-sucedida e sustentável do sistema. + + +## Referências + +> **Arquitetura e Desenho de Software - Aula DAS**. Material de apoio em slides. Milene Serrano. + +> FAKHROUTDINOV, Kirill. UML. UML 2.5 Diagrams Overview. [S. l.], 2023. Disponível em: https://www.uml-diagrams.org/uml-25-diagrams.html. Acesso em: 02 ago. 2024. + + +## Versionamento + +| Versão | Alteração | Responsável | Revisor | Data de realização | +| :------: | :---: | :-----: | :----: | :----: | +| 1.0 | Inicio da estrutura do documento. | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | [Thiago Vivan](https://github.com/thiago-vivan) | 02/08/2024 | +| 2.0 | Alteração da descrção do diagrama de implantação | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | [Thiago Vivan](https://github.com/thiago-vivan) | 03/08/2024 | +| 3.0 | Modelagem do diagrama de implantação | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | [Thiago Vivan](https://github.com/thiago-vivan) | 03/08/2024 | +| 3.1 | Adição do diagrama de implantação na documentação | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | [Thiago Vivan](https://github.com/thiago-vivan) | 05/08/2024 | +| 4.0 | Adição dos seguintes diagramas a Visão Lógica: Classes, Estados e Pacotes | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | [Thiago Vivan](https://github.com/thiago-vivan) | 05/08/2024 | +| 5.0 | Adição da Visão de Implementação | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | [Thiago Vivan](https://github.com/thiago-vivan) | 05/08/2024 | +| 5.0 | Adição da Visão de Casos de Uso | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | [Thiago Vivan](https://github.com/thiago-vivan) | 05/08/2024 | + + + diff --git a/docs/ArquiteturaReutilizacao/4.2.1.mateus.md b/docs/ArquiteturaReutilizacao/4.2.1.CPFValidator.md similarity index 89% rename from docs/ArquiteturaReutilizacao/4.2.1.mateus.md rename to docs/ArquiteturaReutilizacao/4.2.1.CPFValidator.md index 604becc..1e3810c 100644 --- a/docs/ArquiteturaReutilizacao/4.2.1.mateus.md +++ b/docs/ArquiteturaReutilizacao/4.2.1.CPFValidator.md @@ -2,7 +2,7 @@ ## CPF Validator -Na segunda etapa do projeto, foram modelados diagramas que se enquadravam em duas denominações os Estáticos(Classes, Pacotes, Componentes e Implantação) e os Dinâmicos(de Atividades e o de Estados), por meio dos quais podemos observar e compreender diversas pates do sistema. Ao olhar para o diagrama de **classes**, especificamente para a classe **Cliente** constatamos que o usuário cliente tem que possuir um cpf, e para isso, no momento do login, o cpf inserido deve ser validado. +Na segunda etapa do projeto, foram modelados diagramas que se enquadravam em duas denominações os Estáticos(Classes, Pacotes, Componentes e Implantação) e os Dinâmicos(de Atividades e o de Estados), por meio dos quais podemos observar e compreender diversas partes do sistema. Ao olhar para o diagrama de **classes**, especificamente para a classe **Cliente** constatamos que o usuário cliente tem que possuir um cpf, e para isso, no momento do login, o cpf inserido deve ser validado. Para essa validação, foi utilizado um código já existente utilizado por um dos membros em outros projetos e foi adaptado para o nosso contexto. O código em questão foi criado utilizando o padrão GoF Strategy que será apresentado a seguir: @@ -45,7 +45,7 @@ A classe ValidadorCPFContext, apresentada na figura 04 abaixo, é usada para apl ### 5. Exemplo de Uso -Para testar o validador, fizemos o teste apresentado abaixo na figura 05 e06. +Para testar o validador, fizemos o teste apresentado abaixo na figura 05 e 06. ![image](https://github.com/user-attachments/assets/9746cb35-3937-482b-8398-69ef4a564d9d) @@ -56,6 +56,8 @@ Para testar o validador, fizemos o teste apresentado abaixo na figura 05 e06.
Figura 05: Resultado do teste. Fonte: Mateus Orlando.
+**Manual do teste: [clique aqui](https://github.com/UnBArqDsw2024-1/2024.1_G7_My_Market/blob/reutilizacaoMateus/docs/ArquiteturaReutilizacao/cpfValidador/comoRodar.md)** + ## Versionamento | Versão | Alteração | Responsável | Revisor | Data de realização | diff --git a/docs/ArquiteturaReutilizacao/4.2.2.ChainsOfResponsibility.md b/docs/ArquiteturaReutilizacao/4.2.2.ChainsOfResponsibility.md new file mode 100644 index 0000000..a7858d5 --- /dev/null +++ b/docs/ArquiteturaReutilizacao/4.2.2.ChainsOfResponsibility.md @@ -0,0 +1,92 @@ +# Reutilização + +# Chains Of Responsibility + +## Objetivo + +Na terceira entrega do projeto fomos introduzidos aos Gofs, que são padrões de design amplamente utilizados por desenvolvedores para criar software mais flexível, reutilizável e de fácil manutenção. Dentre eles estão os GoFs comportamentais que se concentram na interação entre objetos. Nesse sentido um dos Gofs comportamentais utilizados foi o **Chains Of Responsibility** que é um padrão que permite que um pedido seja processado por uma cadeia de handlers (manipuladores), onde cada handler tem a oportunidade de processar o pedido ou passá-lo para o próximo na cadeia. + +Tendo isso em vista, para o projeto My Market um pedido precisa passar por um processamento até ser confirmado a venda. Logo, o padrão **Chains Of Responsibility** foi utilizado para a implementação dessa funcionalidade assim como é apresentado no diagrama abaixo, modelado utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/) pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan): + +![image](https://github.com/user-attachments/assets/767e17d8-0009-4954-a945-230d875ed61e) + +
Figura 01: Diagrama de Classes utilizando o padrão comportamental Chains of Responsibility. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan.
+ +O padrão Strategy define uma família de algoritmos, encapsula cada um deles e os torna intercambiáveis. No caso do validador de CPF, você pode implementar o padrão Strategy se desejar ter diferentes métodos de validação que podem ser aplicados de acordo com a necessidade. + + +Neste sentido, criaremos diferentes estratégias para validar o CPF de um usuário: + +## Código + +O código em java a seguir foi desenvolvido pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). + +### 1. Interface + +A interface Handler, apresentada na figura 02 abaixo, abstrai a lógica de encadeamento e processamento dos handlers, permitindo que cada implementação concreta de um handler se concentre em sua lógica específica. + +![image](https://github.com/user-attachments/assets/191fb79c-9aee-4591-828a-27673fc534f4) + +
Figura 02: Interface Handler. Fonte: Mateus Orlando.
+ +### 2. Classe BaseHandler + +A classe BaseHandler, apresentada na figura 03 abaixo, serve como uma base para outros handlers. Ao implementar a lógica de encadeamento aqui, as subclasses podem se concentrar apenas em suas responsabilidades específicas, reutilizando o código de encadeamento. + +![image](https://github.com/user-attachments/assets/ca68867f-ce0d-4338-ba8e-574d430e4647) + +
Figura 03: Classe BaseHandler. Fonte: Mateus Orlando.
+ +### 3. Classe EstoqueHandler + +A classe EstoqueHandler, apresentada na figura 04 abaixo, lida com a primeira etapa do processo de validação do pedido (verificação de estoque). Se o estoque for suficiente, o pedido segue para o próximo handler na cadeia. + +![image](https://github.com/user-attachments/assets/5db8b08b-0680-4151-b455-75ae7106e098) + +
Figura 04: Classe EstoqueHandler. Fonte: Mateus Orlando.
> + +### 4. Classe PagamentoHandler + +A classe PagamentoHandler, apresentada na figura 05 abaixo, lida com a segunda etapa do processo de validação do pedido (validação de pagamento). Se o pagamento for validado, o pedido segue para o próximo handler na cadeia. + +![image](https://github.com/user-attachments/assets/97adf628-0b7a-48ec-9feb-1b1eb7db0d90) + +
Figura 05: Classe PagamentoHandler. Fonte: Mateus Orlando.
+ +### 5. Classe GerenteHandler + +A classe GerenteHandler, apresentada na figura 06 abaixo, lida com a etapa final do processo de validação do pedido (aprovação gerencial). Se o pedido for aprovado pelo gerente, ele pode ser finalizado ou continuar na cadeia, se necessário. + +![image](https://github.com/user-attachments/assets/62c5d26f-0193-4e8b-9bfe-59421ee286e4) + +
Figura 06: Classe GerenteHandler. Fonte: Mateus Orlando.
+ +### 6. Classe Request + +A classe Request, apresentada na figura 07 abaixo, encapsula os dados que precisam ser verificados em cada etapa do processo. Cada handler acessa esses dados para determinar se o pedido deve ser processado ou rejeitado. + +![image](https://github.com/user-attachments/assets/469b9764-2f76-4207-b084-1d779d8d205a) + +
Figura 07: Classe Request. Fonte: Mateus Orlando.
+ +### 7. Exemplo de Uso + +Para testar a funcionalidade, fizemos o teste apresentado abaixo na figura 08 e 09. + +![image](https://github.com/user-attachments/assets/dee94c50-fb71-482e-b370-887b5fb3c4b6) + +
Figura 08: Classe ChainOfResponsibility que testa a funcionalidade. Fonte: Mateus Orlando.
+ +![image](https://github.com/user-attachments/assets/528a42b2-d0aa-4a2f-9f9a-f4f0dfb21cd2) + +
Figura 09: Resultado do teste. Fonte: Mateus Orlando.
+ +**Manual do teste: [clique aqui](https://github.com/UnBArqDsw2024-1/2024.1_G7_My_Market/blob/reutilizacaoMateus/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/comoRodar.md)** + +## Versionamento + +| Versão | Alteração | Responsável | Revisor | Data de realização | +| :------: | :---: | :-----: | :----: | :----: | +| 1.0 | Criação do código | [Mateus Orlando](https://github.com/MateusPy) | 22/07/2024 | +| 2.0 | Documentação do código de Processo de pagamento | [Mateus Orlando](https://github.com/MateusPy) | 14/08/2024 | +| 2.1 | Adição das imagens ao documento | [Mateus Orlando](https://github.com/MateusPy) | 14/08/2024 | diff --git a/docs/ArquiteturaReutilizacao/Observer.md b/docs/ArquiteturaReutilizacao/4.2.3.Observer.md similarity index 100% rename from docs/ArquiteturaReutilizacao/Observer.md rename to docs/ArquiteturaReutilizacao/4.2.3.Observer.md diff --git a/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/BaseHandler.java b/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/BaseHandler.java new file mode 100644 index 0000000..5f3677d --- /dev/null +++ b/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/BaseHandler.java @@ -0,0 +1,19 @@ +package ChainsOfResponsibility; + +public abstract class BaseHandler implements Handler { + private Handler nextHandler; + + @Override + public Handler setNext(Handler handler) { + this.nextHandler = handler; + return handler; + } + + @Override + public String handle(Request request) { + if (this.nextHandler != null) { + return this.nextHandler.handle(request); + } + return null; + } +} diff --git a/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/ChainOfResponsibilityTest.java b/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/ChainOfResponsibilityTest.java new file mode 100644 index 0000000..01bcf97 --- /dev/null +++ b/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/ChainOfResponsibilityTest.java @@ -0,0 +1,47 @@ +package ChainsOfResponsibility; + +public class ChainOfResponsibilityTest { + public static void main(String[] args) { + // Criar os handlers + Handler estoqueHandler = new EstoqueHandler(); + Handler pagamentoHandler = new PagamentoHandler(); + Handler gerenteHandler = new GerenteHandler(); + + // Configurar a cadeia de responsabilidade + estoqueHandler.setNext(pagamentoHandler).setNext(gerenteHandler); + + // Criar um objeto de request que passará pela cadeia + Request request1 = new Request(); + request1.setEstoqueDisponivel(true); + request1.setPagamentoValidado(true); + request1.setAprovadoPeloGerente(true); + + // Teste 1: Todos os passos são bem-sucedidos + System.out.println("Teste 1: " + estoqueHandler.handle(request1)); // Esperado: cadeia completa sem rejeições + + // Teste 2: Estoque insuficiente + Request request2 = new Request(); + request2.setEstoqueDisponivel(false); + request2.setPagamentoValidado(true); + request2.setAprovadoPeloGerente(true); + + System.out.println("Teste 2: " + estoqueHandler.handle(request2)); // Esperado: Pedido rejeitado: estoque insuficiente. + + // Teste 3: Pagamento não validado + Request request3 = new Request(); + request3.setEstoqueDisponivel(true); + request3.setPagamentoValidado(false); + request3.setAprovadoPeloGerente(true); + + System.out.println("Teste 3: " + estoqueHandler.handle(request3)); // Esperado: Pedido rejeitado: pagamento não validado. + + // Teste 4: Não aprovado pelo gerente + Request request4 = new Request(); + request4.setEstoqueDisponivel(true); + request4.setPagamentoValidado(true); + request4.setAprovadoPeloGerente(false); + + System.out.println("Teste 4: " + estoqueHandler.handle(request4)); // Esperado: Pedido rejeitado: não aprovado pelo gerente. + } +} + diff --git a/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/EstoqueHandler.java b/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/EstoqueHandler.java new file mode 100644 index 0000000..39ba668 --- /dev/null +++ b/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/EstoqueHandler.java @@ -0,0 +1,13 @@ +package ChainsOfResponsibility; + +public class EstoqueHandler extends BaseHandler { + @Override + public String handle(Request request) { + if (request.isEstoqueDisponivel()) { + System.out.println("Estoque verificado."); + return super.handle(request); + } else { + return "Pedido rejeitado: estoque insuficiente."; + } + } +} diff --git a/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/GerenteHandler.java b/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/GerenteHandler.java new file mode 100644 index 0000000..e28799e --- /dev/null +++ b/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/GerenteHandler.java @@ -0,0 +1,13 @@ +package ChainsOfResponsibility; + +public class GerenteHandler extends BaseHandler { + @Override + public String handle(Request request) { + if (request.isAprovadoPeloGerente()) { + System.out.println("Aprovado pelo gerente."); + return super.handle(request); + } else { + return "Pedido rejeitado: não aprovado pelo gerente."; + } + } +} diff --git a/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/Handler.java b/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/Handler.java new file mode 100644 index 0000000..a63573e --- /dev/null +++ b/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/Handler.java @@ -0,0 +1,6 @@ +package ChainsOfResponsibility; + +public interface Handler { + Handler setNext(Handler handler); + String handle(Request request); +} diff --git a/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/PagamentoHandler.java b/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/PagamentoHandler.java new file mode 100644 index 0000000..fb442c9 --- /dev/null +++ b/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/PagamentoHandler.java @@ -0,0 +1,13 @@ +package ChainsOfResponsibility; + +public class PagamentoHandler extends BaseHandler { + @Override + public String handle(Request request) { + if (request.isPagamentoValidado()) { + System.out.println("Pagamento validado."); + return super.handle(request); + } else { + return "Pedido rejeitado: pagamento não validado."; + } + } +} diff --git a/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/Request.java b/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/Request.java new file mode 100644 index 0000000..4c8dd40 --- /dev/null +++ b/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/Request.java @@ -0,0 +1,31 @@ +package ChainsOfResponsibility; + +public class Request { + private boolean estoqueDisponivel; + private boolean pagamentoValidado; + private boolean aprovadoPeloGerente; + + public boolean isEstoqueDisponivel() { + return estoqueDisponivel; + } + + public void setEstoqueDisponivel(boolean estoqueDisponivel) { + this.estoqueDisponivel = estoqueDisponivel; + } + + public boolean isPagamentoValidado() { + return pagamentoValidado; + } + + public void setPagamentoValidado(boolean pagamentoValidado) { + this.pagamentoValidado = pagamentoValidado; + } + + public boolean isAprovadoPeloGerente() { + return aprovadoPeloGerente; + } + + public void setAprovadoPeloGerente(boolean aprovadoPeloGerente) { + this.aprovadoPeloGerente = aprovadoPeloGerente; + } +} diff --git a/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/comoRodar.md b/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/comoRodar.md new file mode 100644 index 0000000..50b2197 --- /dev/null +++ b/docs/ArquiteturaReutilizacao/ChainsOfResponsibility/comoRodar.md @@ -0,0 +1,21 @@ +# Passo a Passo para testar o validador + +1 - vá ao diretório ArquiteturaReutilizacao + +2 - compile os arquivos através do código: + +``` +javac ChainsOfResponsibility/*.java +``` + +3 - Execute a classe teste ChainOfResponsibilityTest: + +``` +java ChainsOfResponsibility.ChainOfResponsibilityTest +``` + +## **Obs**: Após a compilação, certifique-se de que os arquivos .class estão no diretório ChainsOfResponsibility. O Java precisa encontrar a classe compilada no mesmo diretório indicado pelo pacote, semelhante a imagem abaixo: + +![image](https://github.com/user-attachments/assets/e6089d29-6616-4230-a6ef-cb30540167a7) + +
Figura 01: Arquivos ".class". Fonte: Mateus Orlando
diff --git a/docs/ArquiteturaReutilizacao/image.png b/docs/ArquiteturaReutilizacao/image.png new file mode 100644 index 0000000..03c77c2 Binary files /dev/null and b/docs/ArquiteturaReutilizacao/image.png differ diff --git a/docs/ArquiteturaReutilizacao/sequencia.png b/docs/ArquiteturaReutilizacao/sequencia.png new file mode 100644 index 0000000..b92a0eb Binary files /dev/null and b/docs/ArquiteturaReutilizacao/sequencia.png differ diff --git a/docs/PadroesDeProjeto/src/ChainsOfResponsibility/BaseHandler.java b/docs/PadroesDeProjeto/src/ChainsOfResponsibility/BaseHandler.java new file mode 100644 index 0000000..5f3677d --- /dev/null +++ b/docs/PadroesDeProjeto/src/ChainsOfResponsibility/BaseHandler.java @@ -0,0 +1,19 @@ +package ChainsOfResponsibility; + +public abstract class BaseHandler implements Handler { + private Handler nextHandler; + + @Override + public Handler setNext(Handler handler) { + this.nextHandler = handler; + return handler; + } + + @Override + public String handle(Request request) { + if (this.nextHandler != null) { + return this.nextHandler.handle(request); + } + return null; + } +} diff --git a/docs/PadroesDeProjeto/src/ChainsOfResponsibility/ChainOfResponsibilityTest.java b/docs/PadroesDeProjeto/src/ChainsOfResponsibility/ChainOfResponsibilityTest.java new file mode 100644 index 0000000..01bcf97 --- /dev/null +++ b/docs/PadroesDeProjeto/src/ChainsOfResponsibility/ChainOfResponsibilityTest.java @@ -0,0 +1,47 @@ +package ChainsOfResponsibility; + +public class ChainOfResponsibilityTest { + public static void main(String[] args) { + // Criar os handlers + Handler estoqueHandler = new EstoqueHandler(); + Handler pagamentoHandler = new PagamentoHandler(); + Handler gerenteHandler = new GerenteHandler(); + + // Configurar a cadeia de responsabilidade + estoqueHandler.setNext(pagamentoHandler).setNext(gerenteHandler); + + // Criar um objeto de request que passará pela cadeia + Request request1 = new Request(); + request1.setEstoqueDisponivel(true); + request1.setPagamentoValidado(true); + request1.setAprovadoPeloGerente(true); + + // Teste 1: Todos os passos são bem-sucedidos + System.out.println("Teste 1: " + estoqueHandler.handle(request1)); // Esperado: cadeia completa sem rejeições + + // Teste 2: Estoque insuficiente + Request request2 = new Request(); + request2.setEstoqueDisponivel(false); + request2.setPagamentoValidado(true); + request2.setAprovadoPeloGerente(true); + + System.out.println("Teste 2: " + estoqueHandler.handle(request2)); // Esperado: Pedido rejeitado: estoque insuficiente. + + // Teste 3: Pagamento não validado + Request request3 = new Request(); + request3.setEstoqueDisponivel(true); + request3.setPagamentoValidado(false); + request3.setAprovadoPeloGerente(true); + + System.out.println("Teste 3: " + estoqueHandler.handle(request3)); // Esperado: Pedido rejeitado: pagamento não validado. + + // Teste 4: Não aprovado pelo gerente + Request request4 = new Request(); + request4.setEstoqueDisponivel(true); + request4.setPagamentoValidado(true); + request4.setAprovadoPeloGerente(false); + + System.out.println("Teste 4: " + estoqueHandler.handle(request4)); // Esperado: Pedido rejeitado: não aprovado pelo gerente. + } +} + diff --git a/docs/PadroesDeProjeto/src/ChainsOfResponsibility/EstoqueHandler.java b/docs/PadroesDeProjeto/src/ChainsOfResponsibility/EstoqueHandler.java new file mode 100644 index 0000000..39ba668 --- /dev/null +++ b/docs/PadroesDeProjeto/src/ChainsOfResponsibility/EstoqueHandler.java @@ -0,0 +1,13 @@ +package ChainsOfResponsibility; + +public class EstoqueHandler extends BaseHandler { + @Override + public String handle(Request request) { + if (request.isEstoqueDisponivel()) { + System.out.println("Estoque verificado."); + return super.handle(request); + } else { + return "Pedido rejeitado: estoque insuficiente."; + } + } +} diff --git a/docs/PadroesDeProjeto/src/ChainsOfResponsibility/GerenteHandler.java b/docs/PadroesDeProjeto/src/ChainsOfResponsibility/GerenteHandler.java new file mode 100644 index 0000000..e28799e --- /dev/null +++ b/docs/PadroesDeProjeto/src/ChainsOfResponsibility/GerenteHandler.java @@ -0,0 +1,13 @@ +package ChainsOfResponsibility; + +public class GerenteHandler extends BaseHandler { + @Override + public String handle(Request request) { + if (request.isAprovadoPeloGerente()) { + System.out.println("Aprovado pelo gerente."); + return super.handle(request); + } else { + return "Pedido rejeitado: não aprovado pelo gerente."; + } + } +} diff --git a/docs/PadroesDeProjeto/src/ChainsOfResponsibility/Handler.java b/docs/PadroesDeProjeto/src/ChainsOfResponsibility/Handler.java new file mode 100644 index 0000000..a63573e --- /dev/null +++ b/docs/PadroesDeProjeto/src/ChainsOfResponsibility/Handler.java @@ -0,0 +1,6 @@ +package ChainsOfResponsibility; + +public interface Handler { + Handler setNext(Handler handler); + String handle(Request request); +} diff --git a/docs/PadroesDeProjeto/src/ChainsOfResponsibility/PagamentoHandler.java b/docs/PadroesDeProjeto/src/ChainsOfResponsibility/PagamentoHandler.java new file mode 100644 index 0000000..fb442c9 --- /dev/null +++ b/docs/PadroesDeProjeto/src/ChainsOfResponsibility/PagamentoHandler.java @@ -0,0 +1,13 @@ +package ChainsOfResponsibility; + +public class PagamentoHandler extends BaseHandler { + @Override + public String handle(Request request) { + if (request.isPagamentoValidado()) { + System.out.println("Pagamento validado."); + return super.handle(request); + } else { + return "Pedido rejeitado: pagamento não validado."; + } + } +} diff --git a/docs/PadroesDeProjeto/src/ChainsOfResponsibility/Request.java b/docs/PadroesDeProjeto/src/ChainsOfResponsibility/Request.java new file mode 100644 index 0000000..4c8dd40 --- /dev/null +++ b/docs/PadroesDeProjeto/src/ChainsOfResponsibility/Request.java @@ -0,0 +1,31 @@ +package ChainsOfResponsibility; + +public class Request { + private boolean estoqueDisponivel; + private boolean pagamentoValidado; + private boolean aprovadoPeloGerente; + + public boolean isEstoqueDisponivel() { + return estoqueDisponivel; + } + + public void setEstoqueDisponivel(boolean estoqueDisponivel) { + this.estoqueDisponivel = estoqueDisponivel; + } + + public boolean isPagamentoValidado() { + return pagamentoValidado; + } + + public void setPagamentoValidado(boolean pagamentoValidado) { + this.pagamentoValidado = pagamentoValidado; + } + + public boolean isAprovadoPeloGerente() { + return aprovadoPeloGerente; + } + + public void setAprovadoPeloGerente(boolean aprovadoPeloGerente) { + this.aprovadoPeloGerente = aprovadoPeloGerente; + } +}