-
Notifications
You must be signed in to change notification settings - Fork 46
Refactoring
Dívidas técnicas: https://www.youtube.com/watch?v=pqeJFYwnkjE
A refatoração é um processo de reorganização da estrutura interna do software, sem alterar o seu comportamento externo. É um modo disciplinado de reorganizar código, facilitando a posterior depuração, eliminando código presumível de introduzir erros. De modo geral, quando se refabrica o código, melhora-se o desenho e a estruturação deste.
- Encontrar e arrumar bugs enquanto faz o código, de maneira que essa ação é considerada apenas como melhoria de código.
- Intensificar o tratamento de erros, que também é considerado apenas como melhoria da cobertura de código.
- Código defensivo, de maneira que erros aplicação sejam raros.
- Tornar o código mais testável.
Em resumo, melhoria de cobertura e tratamento de erros não é considerado como refatoração de código.
Bugs são como baratas: se escondendo nos lugares mais escuros e sujos do código. Desta forma, a limpeza do código vai tornar evidente os possíveis bugs.
Ao se adicionar uma nova funcionalidade é necessário refatorar o código para um melhor entendimento do código e para que os bugs fiquem mais visíveis, pois um código desnecessariamente complexo dificulta a visualização de problemas.
A revisão de código é sempre um bom momento para a refatoração, pois pode ser o último momento antes do código/software estar disponível para o público.
A melhor forma de revisar o código é em conjunto com o autor do código, pois pode-se decidir formas e técnicas de refatoração sem prejudicar as funcionalidades. As mudanças podem ser feita diretas ao ponto.
De tempos em tempos o código precisa ser revisado para refatoração, de forma que fique mais limpo.
- Eliminação de código duplicado, fazendo com que a repetição de código seja nivelada ao mínimo possível.
- Elimanação de código morto, excluindo linhas de código que não acrescentam nada à aplicação.
- Melhorar a lógica utilizada no sistema, de maneira que o design seja mais claro para programadores de fora.
- Melhorar o uso da linguagem, otimizando o desempenho.
Bad smell é uma situação na qual a estrutura do programa pode ser melhorada com refatoração, como por exemplo: Duplicação de código e classe ou métodos longos.
Existem vários indicativos de bad smells, abaixo deixo algumas definições desses bad smells bem como a refatoração sugerida:
- Long Method/ God Method:
São métodos que centralizam a funcionalidade da classe e que, geralmente, são difíceis de entender e de manter. Para melhorar esses métodos pode-se dividir o método em dois ou transformar o método em uma classe.
- Feature Envy:
Acontece quando uma parte do código de uma classe "inveja" outra classe, por exemplo quando um método de uma classe usa atributos somente de outra classe. Para refatorar pode-se mover os métodos e atributos entre classes ou juntar duas classes em uma.
- Divergent Change:
Ocorre quando uma classe pode mudar frequentemente de diferentes formas e por razões distintas. Como refatoração pode-se dividir a classe em duas.
- Shotgun Surgery:
Oposto do Divergent Change acima, pois toda vez que uma classe for alterada, são necessárias várias pequenas mudanças em outras classes diferentes. Como refatoração pode se mover métodos e atributos entre as classes e juntar duas classes em uma.
- Refused Bequest:
Ocorre quando uma classe herda atributos e métodos de outra classe, mas não os usa. Como refatoração propõe-se mover o método ou atributo da superclasse para a subclasse e substituir o relacionamento de herança por associação.
- Comments:
Os comentários não são ruins, porém quando em excesso podem indicar que os nomes de métodos/atributos não estão suficientemente expressivos. Pode-se quebrar um método em dois ou renomear.
A refatoração deve resultar em um código mais limpo, que seja legível, claro e com o mínimo de repetições. Na imagem abaixo podemos fazer uma analogia a refatoração:
Esta imagem retrata uma cozinha em duas situações distintas. Na esquerda, vemos uma cozinha em situação caótica, onde preparar alimentos, lavar e encontrar utensílios, que são o objetivo principal da cozinha, se tornaram tarefas difíceis. Já na direita, vemos uma cozinha limpa e organizada, onde pode-se realizar as mesmas tarefas da anterior, porém com muito mais facilidade.
A refatoração deve funcionar desta mesma forma: fazer com que um código inadequado se torne limpo, facilitando seu entendimento, e tornando a detecção de bugs mais simples. A refatoração não pode alterar o comportamento do código.
Os testes estão intrinsecamente relacionados à refatoração. Como a refatoração não pode alterar o funcionamento do código, os testes são a perfeita ferramenta para garantir o funcionamento correto do código antes e depois da refatoração.
O TDD também está relacionado à refatoração, pois a refatoração dos testes é parte básica do ciclo de desenvolvimento direcionado à testes. Pode-se entender essa relação através da figura abaixo:
- Incluir descrição do treinamento/DOJO - passo a passo - etapas
- Registrar os detalhes da dinâmica
- Infraestrutura Necessária para a dinâmica
- Código referência no projeto da disciplina (00-Disciplina)
- Treinamento em, pelo menos 2 linguagens
Engenharia de software. Refactoring.
Ian Sommerville. Engenharia de Software, 9ª Edição. Pearson Education, 2011.
EPS/MDS - FGA/UnB
Métodos de Desenvolvimento de Software
Gestão de Portfólio e Projetos de Software
RUP (Rational Unified Process)
Fase Elaboração (RUP) Planejamento(PMBOK)
Fase de Construção (RUP), Execução/Monitoramente e Controle (PMBOK)
Fase Transição (RUP), Finalização (PMBOK)
Acceptance Test Driven Development (ATDD)
Integração Contínua Deploy Contínuo
Automação de Ambiente com Docker
Orquestração de Containers com Docker Compose
Automação de Ambiente com Vagrant
Deploy Contínuo na Plataforma Heroku
Integração Contínua com Travis CI
Disponibilizando a Aplicação com o Proxy Reverso Nginx
Tutorial de Instalação do Ionic
Android Integração contínua com Circle CI
Configuração de Ambiente para React Native
Tutorial Instalação Ruby on Rails
Teste Automatizado Cucumber JS
Teste Automatizado Cucumber Rails
Testando AngularJS com Jasmine
Teste Automatizado com Selenium IDE
Configurar o SonarCloud para um projeto usando Jest
Configurar o SonarCloud para um projeto usando Pytest
Configurar o SonarCloud para um projeto usando Mocha e Istambul