Repositório para praticar todo conteúdo absorvido durante o curso "Python Clean Coding" na plataforma Udemy.
..algumas anotações sobre meu aprendizado durante o curso...
- DRY - Don't Repeat Yourself.
- KISS - Keep It Simple Stupid.
- YAGNI - You Aren't Going to Need It.
- SOC - Separation of Concerns.
- NIH - Not Invented Here.
A refatoração tem como objetivo melhorar a estrutura (fundação) de um código sem alterar seu comportamento. Ao refatorar temos como objetivo limpar o código, tornando mais fácil de compreender, fazendo com que seja mais barato e rápido manter e consequentemente diminuindo problemas causados por bugs.
Refatorar ajuda no amadurecimento do código, melhorando continuamente o design do software. Ajuda encontrar bugs, mantém o código limpo e consequentemente melhora o entendimento daquilo que foi escrito.
- Renomear arquivos.
- Renomear classes e métodos de classes.
- Renomear funções, rotinas e variáveis.
- Alterar assinaturas de métodos.
- Atualizar contratos entre métodos e classes.
- Mover a logica para cima na cadeia de herança.
- Melhor esclarecimento de código .
- Explica o porquê .
- Explica como .
- Planejamento, revisão e inclusão de recursos .
- Debbugging.
- Os comentários apodrecem com o tempo. (seu comentário pode não refletir o momento atual do código).
- Adiciona sobrecarga (isso pode ser mitigado).
- Adiciona ruído (apenas quando apodrecem).
** Exemplos retirados do curso "Python Clean Coding - Udemy"
"""
Get Active Users
"""
def get_active_users(users):
return [user for user in users if user.active]
"""
This code needs refactoring
"""
items = ('Python', 'PHP', 'JavaScript')
for x in items:
do_something(x)
"""
This code is bad and you should feel bad
"""
class Order:
username = ''
last_logged_in = None
total = 0
items = []
def __init__(self, username, last_logged_in, total, items):
self.username = username
self.last_logged_in = last_logged_in
self.total = total
self.items = items
"""
PF: 25/05/2014
Loop over the pets and update the portfolio
"""
items = ('Python', 'PHP', 'JavaScript')
for x in items:
portfolio_update()
resume_update()
# ...
# Wait, what's `x` for again?
do_something(x)
Basicamente se baseia em pequenos ciclos de desenvolvimento, onde para cada nova funcionalidade desenvolvida escreve-se primeiros os testes antes mesmo de qualquer código. O teste inicial irá falhar(Red), então escrevemos um código que fará o teste passar(Green). Após o teste passar, é feita a refatoração(Refactor), onde as boas práticas serão aplicadas garantindo um código limpo, coeso e com baixo acoplamento.
Utilizar TDD duranto o desenvolvimento do seu projeto pode ter muitos benefícios como:
- Feedback instantâneo sobre funcionalidades.
- Código mais limpo.
- Mais confiança durante a refatoração do código.
- Mais confiança durante a correção de bugs.
- Maior produtividade, já que gastará menos tempo caçando bugs e com depuradores.
- Ajuda a documentar aquilo que está sendo feito, melhorando o entendimento do propósito do código.
- Escreva testes claros e confiáveis, livres de bugs e que acompanhem o desenvolvimento do projeto. Lembre-se, nós passamos mais tempo lendo códigos que escrevendo.
- Mantenha os testes simples (Baby Steps).
- Escreva nomes descritivos para os testes, que descrevam de maneira simples e clara aquilo que esta sendo testado.
- Você deve ter uma meta de 100% de cobertura de código em funções com lógica real, evitando testar simples getters/setters.
- Execute seus testes com frequência para garantir que você nao tenha testes que falham intermitentemente.
- Evite dependências entre os testes. Executa-los de forma aleatória garantirá que seus testes não possuem dependências.
** Exemplos retirados do curso "Python Clean Coding - Udemy"
n = "William"
first_name = "William"
get_page(u)
URL = 'https://github.com'
get_page(URL)
get_prod()
get_p_stock()
get_record_product()
get_product()
get_product_stock()
get_product_record()
Os nomes das funções devem dizer o que estão fazendo com precisão e devem indicar o que é devolvido.
class Validation:
def handle(self, val, max):
if val < max:
return False
validator = Validation()
# Oq 'handle' faz?
validator.handle(5, 6)
class Validation:
def is_valid(self, val, max):
if val < max:
return False
validator = Validation()
validator.is_valid(5, 6)