Skip to content

9. Arquitetura To Be

Lucas Rangel edited this page Jun 20, 2023 · 11 revisions

Nesta página, será apresentada uma documentação acerca da arquitetura do projeto como será. O principal propósito é oferecer uma explicação sobre as oportunidades arquiteturais identificadas assim como propor alterações visando melhorar a manutenção, escalabilidade e organização do código corrente.

Serão abordados aspectos como a estrutura do projeto e suas interdependências, arquitetura e padrões relevantes.

Client-Side

Atualmente, apenas o lado cliente compõe o projeto e por isso este documento detalha apenas as propostas que atuam diretamente no frontend. Existem outros padrões de projeto e estilos arquiteturais que auxiliam a manter a coesão no lado do servidor, porém, a escolha dessas tecnologias dependem das necessidades da implementação do projeto. Sugerimos a seguir algumas medidas baseadas nas documentações do projeto.

  • Estilo de Arquitetura
    • Monolítica: Manter uma estrutura monolítica pode ser vantajoso a curto prazo, visto que o projeto tem um escopo pequeno e a arquitetura facilita debugar o código.
    • Microsserviços: Por outro lado, a arquitetura de microsserviços também seria vantajosa caso o foco seja agilidade, por sua natureza distribuída.
    • Client-Server: Para todos os fins, recomendamos a arquitetura Client-Server em conjunto com alguma outra. Essa arquitetura consiste na separação do código do frontend e backend, o que será essencial para escalabilidade e manutenção desse projeto.
  • Segurança
    • Autenticação: Compreendendo o contexto do projeto e a noção de que não haverão conteúdos particularmente sensíveis no sistema, nossa recomendação é que seja mantida a simplicidade na segurança e que haja autenticação nos privilégios de forma segura.

Estilo de Arquitetura

Durante a análise do projeto, foi identificado a ausência de uma arquitetura relevante, o que nos convida a propor uma pela primeira vez. Dado a natureza web e sua stack previamente conhecida (contém React), é favorável seguir uma arquitetura que esteja conforme a base em que estamos trabalhando.

1. Análise

Popularizado pelo Facebook, a arquitetura Flux foi criada pensando no React, com as ideias de stores e a propagação da renderização, o que faria dela uma arquitetura essencial. Contudo, essa arquitetura faz parte da filosofia do React por padrão, ou seja, ela é a maneira com que interagimos com o React e não será tão útil explicitamente.

Observando a base mais de perto, notamos também redundâncias, oportunidades para componentização, que é uma característica do React. Reutilização de código é também importante para escalabilidade, assegurando que o mesmo código não precise ser alterado em diversos pontos na base.

2. Indicações

Pela ideia proposta acima o estilo de arquitetura indicada será o Baseado em Componentes, amplamente utilizado no desenvolvimento de software para criar sistemas complexos e escaláveis, que está conforme a ideia de componentização. Esse estilo é baseado na ideia de decompor um sistema em componentes independentes, cada um responsável por uma funcionalidade específica.

3. Características desta arquitetura:

  • Decomposição: O sistema é dividido em componentes discretos, onde cada componente representa uma unidade funcional bem definida. Cada componente encapsula seu próprio estado interno e comportamento, promovendo a modularidade do sistema, o que facilita o desenvolvimento, a manutenção e a evolução do software.
  • Reutilização: Os componentes são projetados para serem independentes e reutilizáveis, ajudando assim na economia de tempo e esforço de desenvolvimento.
  • Interface: Cada componente expõe uma interface clara e bem definida, que especifica como os outros componentes podem interagir com ele. Isso promove o baixo acoplamento entre os componentes.
  • Comunicação: Os componentes se comunicam uns com os outros por meio de mensagens ou chamadas de método. A comunicação pode ser síncrona ou assíncrona, dependendo dos requisitos do sistema.
  • Gerenciamento de estado: Cada componente é responsável por gerenciar seu próprio estado interno. Isso garante que os componentes sejam independentes e possam ser facilmente substituídos ou atualizados sem afetar o restante do sistema.

Sugestão de Componentes

Componentes Elementos
Footer 4
Lista 4
Forms 3
Forms* 1

4. Padrões de Projeto

Com os novos componentes criados durante a componentização, podemos escolher também padrões de projeto para auxiliar nas possíveis interdependências que serão geradas. Sugerimos dois padrões em especial para melhor adaptação após as alterações.

  • Decorator: Poderá ser útil no acoplamento de novos comportamentos aos componentes.
  • Observer: Poderá ser útil na propagação de estados entre componentes.

Diretórios

Organização de diretórios não são preocupações da arquitetura de um projeto, porém, compreendendo que projeto atual, além de conter códigos descontinuados, é também ausente de uma convenção de nomenclatura, percebemos que há potencial de interferir de alguma forma com a conformidade do projeto com a nova arquitetura a longo prazo.

Utilizando o estilo de arquitetura Baseado em Componentes, temos como objetivo uma melhor reformulação e compreensão da estrutura de cada página-componente. Códigos duplicados entre páginas se tornarão componentes compartilhados, por exemplo. Dessa forma conseguiremos manter a estrutura do repositório mais limpa e escalável.

Visão da pasta /src antes das mudanças:
my-app/
|
|- public/ …
|
|- src/
|    |- App.css
|    |- App.js
|    |- Contato.js
|    |- Home.js
|    |- Login.js
|    |- Sala.js
|    |- Teste.js
|    |- index.cxx
|    |- index.js
|    |- logo.svg
|    |- reportWebVitals.js
|    |- setupTest.js
|    |- style.css
|
| …
Visão da pasta /src depois das mudanças:
frontend/
|
|- public/ …
|
|- src/
|      |- _test_/
|          |- components/
|               |- formTeste/
|    
|          |- pages/
|               |- teste/
|                     |- Teste.js
|    
|     |- components/
|         |- header/
|         	|- Header.js
|    
|         |- footer/
|         	|- Footer.js
|    
|         |- list/
|       	|- List.js
|    
|         |- form/
|               |- formLogin/
|                     |- FormLogin.js
|               |- formContato/
|                     |- FormContato.js
|    
|    |- pages/
|        |- Home.js
|        |- Contato.js
|        |- Login.js
|        |- Teste.js
|        |- Sala.js
|    
|    |- App.js
|    |- App.css
|    |- index.js
|    |- index.css
|    |- style.css
|
| …

Participantes da Nova Arquitetura

Veja abaixo o diagrama de pacotes da arquitetura proposta: Diagrama APS (4)