Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
AlefMemTav committed Aug 15, 2024
2 parents 39488fc + d64b083 commit 868815c
Show file tree
Hide file tree
Showing 21 changed files with 604 additions and 2 deletions.
203 changes: 203 additions & 0 deletions docs/ArquiteturaReutilizacao/4.1.1.DASmtp.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -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:

Expand Down Expand Up @@ -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)

Expand All @@ -56,6 +56,8 @@ Para testar o validador, fizemos o teste apresentado abaixo na figura 05 e06.

<h6 align = "center">Figura 05: Resultado do teste. Fonte: Mateus Orlando.</h6>

**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 |
Expand Down
92 changes: 92 additions & 0 deletions docs/ArquiteturaReutilizacao/4.2.2.ChainsOfResponsibility.md
Original file line number Diff line number Diff line change
@@ -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)

<h6 align = "center">Figura 01: Diagrama de Classes utilizando o padrão comportamental Chains of Responsibility. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan.</h6>

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)

<h6 align = "center">Figura 02: Interface Handler. Fonte: Mateus Orlando.</h6>

### 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)

<h6 align = "center">Figura 03: Classe BaseHandler. Fonte: Mateus Orlando.</h6>

### 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)

<h6 align = "center">Figura 04: Classe EstoqueHandler. Fonte: Mateus Orlando.</h6>>

### 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)

<h6 align = "center">Figura 05: Classe PagamentoHandler. Fonte: Mateus Orlando.</h6>

### 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)

<h6 align = "center">Figura 06: Classe GerenteHandler. Fonte: Mateus Orlando.</h6>

### 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)

<h6 align = "center">Figura 07: Classe Request. Fonte: Mateus Orlando.</h6>

### 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)

<h6 align = "center">Figura 08: Classe ChainOfResponsibility que testa a funcionalidade. Fonte: Mateus Orlando.</h6>

![image](https://github.com/user-attachments/assets/528a42b2-d0aa-4a2f-9f9a-f4f0dfb21cd2)

<h6 align = "center">Figura 09: Resultado do teste. Fonte: Mateus Orlando.</h6>

**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 |
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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.
}
}

Original file line number Diff line number Diff line change
@@ -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.";
}
}
}
Original file line number Diff line number Diff line change
@@ -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.";
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package ChainsOfResponsibility;

public interface Handler {
Handler setNext(Handler handler);
String handle(Request request);
}
Original file line number Diff line number Diff line change
@@ -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.";
}
}
}
31 changes: 31 additions & 0 deletions docs/ArquiteturaReutilizacao/ChainsOfResponsibility/Request.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
21 changes: 21 additions & 0 deletions docs/ArquiteturaReutilizacao/ChainsOfResponsibility/comoRodar.md
Original file line number Diff line number Diff line change
@@ -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)

<h6 align = "center">Figura 01: Arquivos ".class". Fonte: Mateus Orlando</h6>
Binary file added docs/ArquiteturaReutilizacao/image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/ArquiteturaReutilizacao/sequencia.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
19 changes: 19 additions & 0 deletions docs/PadroesDeProjeto/src/ChainsOfResponsibility/BaseHandler.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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.
}
}

Original file line number Diff line number Diff line change
@@ -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.";
}
}
}
Original file line number Diff line number Diff line change
@@ -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.";
}
}
}
6 changes: 6 additions & 0 deletions docs/PadroesDeProjeto/src/ChainsOfResponsibility/Handler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package ChainsOfResponsibility;

public interface Handler {
Handler setNext(Handler handler);
String handle(Request request);
}
Loading

0 comments on commit 868815c

Please sign in to comment.