Skip to content

Repository files navigation

Projeto Clean Code: Impacto do Clean Code no Desenvolvimento de Software

Descrição Geral do Projeto

O projeto Clean Code foi desenvolvido como parte de um estudo que visa analisar o impacto da aplicação de boas práticas de Clean Code nas fases iniciais de desenvolvimento de software. A aplicação busca demonstrar como a adoção dessas práticas pode melhorar a qualidade, manutenibilidade e escalabilidade do código, com foco na organização modular, legibilidade, facilidade de testes e extensibilidade do sistema.

O projeto implementa uma aplicação que coleta dados de clientes a partir de um banco de dados, processa esses dados, gera relatórios personalizados em formato PDF e envia esses relatórios por e-mail para os respectivos clientes. Todo o desenvolvimento do projeto foi orientado pelas boas práticas de programação e padrões de projeto, com ênfase na clareza, modularidade e documentação adequada do código.

Funcionalidades do Sistema

  1. Coleta e Tratamento de Dados de Clientes:

    • Recupera e valida informações de clientes armazenadas no banco de dados, aplicando regras de negócio e garantindo a consistência dos dados.
  2. Processamento de Dados:

    • Calcula informações como preços, descontos e status dos clientes, realizando atualizações no banco de dados de acordo com os resultados do processamento.
  3. Geração de Relatórios em PDF:

    • Gera relatórios detalhados em formato PDF com base nos dados processados de cada cliente, utilizando templates HTML personalizados.
  4. Envio Automático de E-mails:

    • Envia os relatórios gerados por e-mail para os clientes, anexando os PDFs e fornecendo informações adicionais no corpo do e-mail.

Arquitetura e Padrões de Projeto

Padrões de Projeto Adotados

  1. Repository Pattern:

    • Implementado no módulo user_repository.py, o padrão Repository abstrai a lógica de acesso ao banco de dados, separando as operações de persistência das regras de negócio. Essa abordagem facilita a substituição do mecanismo de persistência, testes e manutenção do código.
  2. Service Layer:

    • Utilizado nos serviços UserService e UserProcessingService, este padrão organiza a lógica de negócio em serviços, separando-a das operações de acesso a dados e da interface de usuário. Com isso, a lógica de negócio é centralizada e facilmente reutilizável.
  3. Dependency Injection:

    • O padrão de injeção de dependências, implementado com a biblioteca injector, melhora a modularidade e testabilidade do código. Ao invés de criar instâncias diretamente, as dependências são injetadas, permitindo fácil substituição e configuração para diferentes ambientes, como desenvolvimento e testes.
  4. Facade Pattern:

    • Aplicado no serviço UserNotificationService, o padrão Facade fornece uma interface simplificada para a geração de PDFs e envio de e-mails. Ele esconde a complexidade dos processos internos, fornecendo uma interface fácil de usar para os consumidores desse serviço.
  5. Singleton Pattern:

    • Utilizado na configuração de serviços como SessionLocal e UserService, o padrão Singleton garante que apenas uma instância desses serviços seja criada e reutilizada ao longo da aplicação, economizando recursos e garantindo consistência no gerenciamento de estados.

Boas Práticas Implementadas

  1. Separação de Responsabilidades (Single Responsibility Principle - SRP):

    • Cada classe e método tem uma responsabilidade única e bem definida. Por exemplo, a classe UserRepository é responsável apenas pela interação com o banco de dados, enquanto UserService gerencia o fluxo de negócios relacionado ao processamento de usuários.
  2. Injeção de Dependências (Dependency Injection):

    • Todas as dependências são gerenciadas pelo módulo InjectorModule, facilitando a substituição de implementações e o teste de componentes isolados. Isso permite a criação de versões mock de serviços para testes unitários, sem a necessidade de modificar o código existente.
  3. Tratamento de Exceções e Logging:

    • O projeto possui tratamento de exceções abrangente, garantindo que falhas sejam tratadas e logadas corretamente. O uso extensivo de logs em diferentes níveis (info, warning, error) facilita a depuração e monitoramento do sistema em produção.
  4. Modularidade:

    • O projeto é organizado em módulos bem definidos, cada um contendo componentes com responsabilidades específicas, como repositórios, serviços, e interfaces de apresentação. Isso facilita a manutenção e a evolução do sistema, permitindo que novos módulos sejam adicionados sem impacto significativo no restante do código.
  5. Documentação de Código:

    • Todos os módulos e métodos importantes estão documentados com docstrings detalhadas, explicando seu propósito e uso. Além disso, a aplicação utiliza o Flasgger para documentar e expor a API de forma interativa, facilitando o consumo pelos desenvolvedores e integração com outros sistemas.
  6. Uso de Variáveis de Ambiente:

    • Informações sensíveis, como credenciais de banco de dados e configurações de e-mail, são armazenadas em variáveis de ambiente, seguindo a prática de não hardcodificar valores sensíveis no código fonte.
  7. Código Limpo e Legível:

    • Seguindo os princípios de Clean Code, o código é organizado de forma clara e intuitiva, com nomes de variáveis e métodos descritivos, comentários quando necessário, e ausência de duplicação de código.
  8. Concorrência e Paralelismo:

    • A classe UserService utiliza ThreadPoolExecutor para processar múltiplos usuários em paralelo, aumentando a eficiência do sistema e reduzindo o tempo de processamento.

Exemplos de detalhamento de Componentes e Boas Práticas implementadas

1. Módulo app/repository/user_repository.py

  • Padrão Repository: Permite que a lógica de negócios se comunique com a camada de persistência de maneira abstrata, facilitando a mudança da camada de dados sem alterar a lógica de negócios.
  • Boas Práticas:
    • Métodos encapsulados e organizados.
    • Uso de métodos privados para funcionalidades auxiliares.
    • Uso de Session do SQLAlchemy com contexto gerenciado para garantir a correta abertura e fechamento de conexões.

2. Módulo app/services/user_service.py

  • Padrão Service Layer: Centraliza a lógica de negócios relacionada ao processamento de usuários e envio de e-mails.
  • Boas Práticas:
    • Separação clara entre recuperação de dados e lógica de negócios.
    • Uso de concorrência para melhorar a eficiência do processamento.

3. Módulo app/services/user_processing_service.py

  • Padrão de Serviço: Executa o processamento individual de cada usuário.
  • Boas Práticas:
    • Métodos privados para processamento detalhado.
    • Geração de PDFs de forma modular e reutilizável.
    • Encapsulamento de lógica complexa em métodos auxiliares.

4. Módulo app/services/pdf_service.py

  • Padrão Utility: Fornece funções utilitárias para geração de PDFs.
  • Boas Práticas:
    • Gerenciamento de arquivos temporários para evitar vazamentos de memória.
    • Uso de templates HTML para geração de conteúdo, facilitando a personalização e manutenção.

5. Módulo app/services/email_service.py

  • Padrão Utility: Fornece funções utilitárias para envio de e-mails.
  • Boas Práticas:
    • Envio de e-mails com suporte a anexos de forma encapsulada.
    • Separação clara entre a construção da mensagem de e-mail e o envio.

Documentação

  1. Documentação da API com Swagger:

    • A aplicação utiliza o Flasgger para gerar documentação interativa da API. Isso permite que desenvolvedores visualizem e testem os endpoints diretamente através de uma interface web. A documentação Swagger é uma prática essencial para garantir que a API seja fácil de entender e integrar com outros sistemas.
  2. Docstrings Detalhadas:

    • Todas as funções e classes críticas possuem docstrings explicativas, descrevendo a finalidade do método, parâmetros de entrada e o valor de retorno. Isso facilita o entendimento do código e serve como documentação inline para desenvolvedores que precisem dar manutenção no futuro.
  3. Estrutura de Diretórios Organizada:

    • A estrutura de diretórios é organizada de maneira lógica, com separação clara entre camadas de apresentação, serviços e infraestrutura. Essa organização reflete uma preocupação com a escalabilidade e facilita a navegação pelo código.

Análise de Qualidade e Boas Práticas

  1. Complexidade Ciclomática:

    • A análise de complexidade ciclomática é realizada para garantir que o código permaneça simples e fácil de manter. Funções com alta complexidade são refatoradas para melhorar a legibilidade e reduzir o risco de erros.
  2. Cobertura de Testes:

    • Testes unitários e de integração são implementados para validar o comportamento esperado de cada componente. A cobertura de testes é monitorada para garantir que todos os casos de uso críticos sejam contemplados.
  3. Segurança:

    • Análises de segurança automatizadas são realizadas utilizando ferramentas como Bandit, garantindo que vulnerabilidades comuns em código Python sejam identificadas e mitigadas.

Conclusão

O projeto Clean Code é um exemplo prático de como a aplicação de boas práticas de Clean Code e padrões de projeto pode contribuir para a criação de um software de alta qualidade, fácil manutenção e extensibilidade. Através de uma arquitetura bem definida, injeção de dependências e separação clara de responsabilidades, o projeto serve como um estudo de caso aplicável a projetos reais no mercado de software.

Tempo de Desenvolvimento

Para o desenvolvimento completo deste projeto, considerando as boas práticas, padrões de projeto e a qualidade do código apresentada, as seguintes etapas foram realizadas:

  1. Planejamento e Levantamento de Requisitos (2 dias)

    • 8 horas: Entendimento detalhado do escopo do projeto, definição das funcionalidades a serem implementadas e levantamento de requisitos.
    • 8 horas: Discussão e refinamento dos requisitos, elaboração de um backlog com tarefas detalhadas e priorização das atividades.
  2. Arquitetura e Design do Sistema (3 dias)

    • 12 horas: Definição da arquitetura do sistema, escolha dos padrões de projeto a serem utilizados, e definição da estrutura de diretórios e módulos.
    • 12 horas: Desenho dos fluxos de dados e interação entre componentes, definição das interfaces dos serviços e repositórios, e documentação da arquitetura.
  3. Configuração do Ambiente e Ferramentas (1 dia)

    • 8 horas: Configuração inicial do ambiente de desenvolvimento, setup do banco de dados, configuração do Flask e dependências do projeto. Criação de arquivos de configuração como requirements.txt e .env.
  4. Implementação dos Repositórios (2 dias)

    • 4 horas: Criação das entidades de domínio e esquemas do banco de dados.
    • 8 horas: Implementação do repositório de usuários (user_repository.py), incluindo métodos de CRUD e testes unitários.
    • 4 horas: Ajustes finos e validações nas interações com o banco de dados.
  5. Desenvolvimento dos Serviços Principais (5 dias)

    • 8 horas: Implementação do UserService, incluindo a lógica de negócios relacionada ao processamento de usuários e tratamento de exceções.
    • 12 horas: Implementação do UserProcessingService, incluindo métodos de processamento, geração de PDFs e envio de notificações.
    • 4 horas: Criação de métodos auxiliares para validação e transformação de dados.
    • 4 horas: Integração dos serviços de processamento com o repositório e ajustes de comunicação entre camadas.
    • 12 horas: Implementação do UserNotificationService e integração com serviços de e-mail e geração de PDFs.
  6. Geração de Relatórios em PDF e Envio de E-mails (3 dias)

    • 8 horas: Desenvolvimento de templates HTML e implementação de lógica de geração de PDFs.
    • 8 horas: Implementação dos métodos de envio de e-mail (email_service.py) e integração com o serviço de SMTP.
    • 8 horas: Ajustes na personalização de templates e estruturação dos e-mails enviados.
  7. Implementação das Rotas e Documentação da API (2 dias)

    • 8 horas: Implementação das rotas da API utilizando o Flask, criação de endpoints para iniciar o processamento de usuários e consultar informações.
    • 4 horas: Documentação da API utilizando o Flasgger, configuração dos endpoints e parâmetros.
    • 4 horas: Testes dos endpoints e ajustes na documentação da API para garantir usabilidade e clareza.
  8. Testes e Validação de Qualidade (4 dias)

    • 8 horas: Criação de testes unitários para todas as funções críticas, incluindo repositórios e serviços.
    • 8 horas: Implementação de testes de integração para verificar a comunicação entre componentes.
    • 8 horas: Execução de análises de complexidade e segurança utilizando ferramentas como Radon e Bandit.
    • 8 horas: Refatoração e correções com base nos resultados dos testes, garantindo que todas as funcionalidades estejam cobertas.
  9. Ajustes Finais e Documentação do Projeto (2 dias)

    • 8 horas: Revisão do código, ajustes de nomenclatura e remoção de duplicações e código desnecessário.
    • 8 horas: Documentação do projeto, incluindo README detalhado, explicações sobre a arquitetura e instruções para execução e testes.

Tempo Total de Desenvolvimento: 22 dias

Distribuição de Tempo por Atividade:

  • Planejamento e Levantamento de Requisitos: 16 horas
  • Arquitetura e Design: 24 horas
  • Configuração do Ambiente: 8 horas
  • Implementação dos Repositórios: 16 horas
  • Desenvolvimento dos Serviços: 40 horas
  • Geração de Relatórios e Envio de E-mails: 24 horas
  • Implementação das Rotas e Documentação da API: 16 horas
  • Testes e Validação de Qualidade: 32 horas
  • Ajustes Finais e Documentação do Projeto: 16 horas

Considerações Finais:

Todo o desenvolvimento foi realizado em ambiente local, sem deploy em ambientes de produção. Esta estimativa reflete o tempo necessário para que um desenvolvedor experiente concluísse o projeto com base nos requisitos definidos e nas práticas recomendadas. O tempo pode variar dependendo da experiência do desenvolvedor e da complexidade adicional do projeto. """

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages