Pular para conteúdo

Entregável 2

Qual linguagem estamos utilizando?

Escolhemos o Rust como linguagem de programação para o desenvolvimento do sistema. Essa escolha foi motivada inicialmente pelo interesse do grupo em aprender uma linguagem moderna e que tem ganhado destaque no cenário de desenvolvimento.

Rust é uma linguagem que evita erros comuns em sistemas de baixo nível e oferece ferramentas modernas para lidar com concorrência. Além disso, Rust proporciona um ambiente de desenvolvimento produtivo com um gerenciador de pacotes e um sistema de build integrados, além de uma comunidade ativa e em expansão.

Em resumo, a escolha do Rust para o desenvolvimento do sistema de autoatendimento da lanchonete se alinha com os objetivos de criar uma aplicação segura, eficiente e fácil de manter, ao mesmo tempo que proporciona uma oportunidade valiosa de aprendizado para a equipe de desenvolvimento.

Qual banco de dados estamos utilizando?

Para o armazenamento de dados do nosso sistema, optamos pelo PostgreSQL, um sistema de gerenciamento de banco de dados relacional de código aberto. A decisão de usar o PostgreSQL foi baseada em sua robustez, confiabilidade e rica funcionalidade, que o tornam adequado para uma ampla gama de aplicações, desde pequenos projetos até soluções empresariais complexas.

Esse banco oferece a capacidade de lidar com um volume significativo de transações e a flexibilidade para se adaptar às mudanças nos requisitos de negócios, que são requisitos fundamentais para o sucesso do projeto.

Em resumo, o PostgreSQL se encaixa perfeitamente em nossa solução, fornecendo uma base de dados confiável e eficiente que nos permite construir um sistema de autoatendimento robusto e capaz de crescer junto com o negócio.


Arquitetura Hegaxonal

A Arquitetura Hexagonal, também conhecida como Ports & Adapters, é um padrão de design que visa separar a lógica de negócios de uma aplicação das tecnologias utilizadas para entrar ou sair do sistema. Na Arquitetura Hexagonal, a aplicação é centralizada em torno do domínio do negócio, que é cercado por portas (ports) que definem os pontos de interação com serviços externos ou com o usuário. Adaptadores (adapters) são implementados para se conectarem a essas portas, permitindo que a aplicação se comunique com diferentes tipos de tecnologias e interfaces sem que haja impacto na lógica central do negócio.

A utilização da arquitetura hexagonal no sistema de autoatendimento oferece diversos benefícios, especialmente considerando que estamos desenvolvendo, a princípio, um backend monolítico:

  • Flexibilidade: Permite que mudanças em tecnologias externas, como bancos de dados ou serviços de terceiros, sejam feitas com mínimo impacto na lógica central do negócio;
  • Testabilidade: Facilita a criação de testes automatizados, pois os adapters podem ser substituídos por versões de teste que simulam comportamentos específicos;
  • Manutenibilidade: A clareza na separação de responsabilidades torna o código mais organizado e fácil de entender, o que simplifica a manutenção e a evolução do sistema;
  • Escalabilidade: Embora o projeto comece como um monolito, a arquitetura hexagonal permite uma transição mais suave para uma arquitetura limpa ou de microserviços no futuro.

Estrutura de Diretórios

A estrutura de diretórios do projeto reflete a aplicação da Arquitetura Hexagonal combinada com os princípios do Domain-Driven Design. Ela foi projetada de modo a suportar a organização do código e a separação de responsabilidades.

├── src
│   ├── adapter
│   │   ├── api
│   │   │   └── controllers
│   │   ├── driven
│   │   └── driver
│   ├── core
│   │   ├── application
│   │   │   ├── ports
│   │   │   └── use_cases
│   │   └── domain
│   │       ├── entities
│   │       └── value_objects
  • src/: Raiz do código fonte do projeto, onde toda a lógica da aplicação reside.
    • adapter/: Contém os adaptadores da Arquitetura Hexagonal, divididos em categorias:
      • driven/: Adapters que o domínio "dirige", como a infraestrutura de persistência e integrações com sistemas de pagamento.
      • driver/: Contém os adapters que iniciam ações (ou "dirigem") no domínio, como interfaces de linhas de comando.
      • api/: Adapters relacionados à interface de usuário, como controladores que lidam com requisições HTTP e autenticação.
    • core/: Núcleo do domínio da aplicação, onde a lógica de negócios é implementada seguindo os princípios do DDD:
      • domain/: Contém as entidades, objetos de valor e repositórios que formam o modelo de domínio.
      • application/: Inclui os casos de uso que orquestram o fluxo de negócios e as interfaces que definem como o domínio interage com os adaptadores.

Frameworks e Bibliotecas

Dentre os pacotes que estamos utilizando para a construção da aplicação, destacamos o Rocket para web e o Tokio Postgres para integração com o banco de dados. A combinação dessas ferramentas nos fornece uma base sólida e performática para estruturar a arquitetura do nosso sistema. Abaixo, elencamos mais alguns detalhes da nossa escolha.

Rocket

Rocket é um framework web para Rust que facilita a escrita de aplicações web rápidas e seguras sem sacrificar a flexibilidade. Ele é conhecido por sua simplicidade e ergonomia, oferecendo uma experiência de desenvolvimento agradável e produtiva. Rocket fornece uma série de funcionalidades prontas para uso, como roteamento, gerenciamento de estado, tratamento de requisições e respostas, e suporte a middlewares.

Escolhemos o Rocket para o nosso sistema de autoatendimento por várias razões:

  • Simplicidade e Expressividade: Rocket permite definir rotas e handlers de forma declarativa, tornando o código fácil de escrever e entender;
  • Segurança: Rocket encoraja práticas seguras de programação e gerencia muitos aspectos de segurança web automaticamente;
  • Extensibilidade: Rocket é altamente personalizável e extensível, permitindo que a equipe adapte o framework às necessidades específicas do projeto;
  • Comunidade e Suporte: Rocket tem uma comunidade ativa e um ecossistema crescente, com suporte a muitas crates que podem ser integradas para expandir a funcionalidade da aplicação.

Tokio Postgres

Tokio Postgres é uma biblioteca assíncrona para interação com bancos de dados PostgreSQL em Rust. Ela é construída sobre o Tokio, um runtime assíncrono para a linguagem Rust, que permite a execução de operações de entrada/saída (I/O) de forma não bloqueante e eficiente.

Optamos pelo Tokio Postgres devido às seguintes características:

  • Assincronia: Aproveitamos o modelo assíncrono do Tokio para realizar operações de banco de dados sem bloquear a execução, melhorando a capacidade de resposta e a escalabilidade do sistema;
  • Integração com Tokio: Como o Tokio é uma escolha comum para aplicações assíncronas em Rust, a integração com Tokio Postgres é natural e bem suportada;
  • Tipagem Forte: A biblioteca se beneficia do sistema de tipos do Rust para garantir que as interações com o banco de dados sejam seguras e corretas em tempo de compilação.