ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
RubyConf Brasil - 2018
1. UM GUIA DE SOBREVIVÊNCIA
USANDO RUBY
REFATORAÇÃO
2. RUBYCONF BRASIL
GABRIEL SILVA PEREIRA
▸ Pai da Maria Luiza;
▸ Esposo da Marcella;
▸ Corinthiano;
▸ Consultor e Desenvolvedor de
Software na ThoughtWorks em
Belo Horizonte.
@gabrielpedepera
9. "A refatoração consiste na mudança do
design de um trecho de código em
pequenas etapas, sem alterar sua
funcionalidade, garantindo que o código
continue a funcionar após cada etapa.”
14. RUBYCONF BRASIL
ENTROPIA EM SISTEMAS COMPUTACIONAIS
▸ Por intervenção:
A cada intervenção, a
entropia do sistema cresce
de maneira
exponencialmente
proporcional à atual entropia
do sistema.
▸ Por potencial:
A entropia do sistema
cresce à medida em que a
diferença entre a ordem
interna e a ordem externa
crescem.
15. COMO A ENTROPIA AFETA A
EVOLUÇÃO DE UM SISTEMA
COMPUTACIONAL?
25. RUBYCONF BRASIL
SENDO ASSIM
▸ A refatoração deve ser uma atividade suporte no
desenvolvimento;
▸ Precisa ser dosada e aplicada com efetividade;
26. RUBYCONF BRASIL
SENDO ASSIM
▸ A refatoração deve ser uma atividade suporte no
desenvolvimento;
▸ Precisa ser dosada e aplicada com efetividade;
▸ Analise o código e se pergunte: Se eu tivesse um minuto
para refatorar, onde eu o utilizaria?
29. A code smell is a surface
indication that usually
corresponds to a deeper
problem in the system. The term
was first coined by Kent Beck
while helping me with
my Refactoring book.
Martin Fowler
30. RUBYCONF BRASIL
▸ Long Method
▸ Large Class
▸ Primitive Obsession
▸ Long Parameter List
▸ DataClumps
▸ Switch Statements
▸ Temporary Field
▸ Refused Bequest
▸ Alternative Classes with
Different Interfaces
▸ Divergent Change
▸ Shotgun Surgery
▸ Parallel Inheritance
Hierarchies
▸ Lazy class
▸ Data class
▸ Duplicate Code
▸ Dead Code,
▸ Speculative
Generality
▸ Feature Envy
▸ Inappropriate Intimacy
▸ Message Chains
▸ Middle Man
CODE SMELLShttp://mikamantyla.eu/BadCodeSmellsTaxonomy.html
THE BLOATERS
THE OO ABUSERS
THE CHANGE PREVENTERS
THE DISPENSABLES
THE COUPLERS
32. RUBYCONF BRASIL
MÉTODO LONGO (LONG METHOD)
▸ Extração de Método
▸ Introdução de parâmetros
▸ Decomposição de condicional
POSSÍVEIS SOLUÇÕES
▸ Fere o princípio de separação das responsabilidades
▸ Diminui o reaproveitamento e a manutenibilidade
33. RUBYCONF BRASIL
CLASSES GRANDES (LARGE CLASS)
▸ Extração de Classes
▸ Extração de Subclasses
POSSÍVEIS SOLUÇÕES
▸ Muitos métodos e atributos
34. RUBYCONF BRASIL
LISTA DE PARÂMETROS LONGA (LONG PARAMETER LIST)
▸ Extração de Classes
▸ Extração de Subclasses
POSSÍVEIS SOLUÇÕES
▸ São difíceis de entender
▸ Se muito utilizado, o método tende a receber muitos parâmetros
vazios
▸ Verificações e variáveis desnecessárias dificultam o entendimento
37. RUBYCONF BRASIL
RENOMEAR UM MÉTODO
# method to calculate the final price
def calculate(price, percent_modifier)
if percent_modifier.nil? || percent_modifier < 10
price
else
price * (percent_modifier / 100)
end
end
it 'calculate the final price with a modifier of 10%' do
expect(calculate(100, 10)).to eq(110)
end
44. RUBYCONF BRASIL
RENOMEAR UM MÉTODO É SIMPLES?
▸ Quem chama o método vai quebrar? (conflito de nomes)
▸ Mudar o nome do método não vai quebrar outro ponto?
(metaprogramação)
45. RUBYCONF BRASIL
RENOMEAR UM MÉTODO É SIMPLES?
▸ Quem chama o método vai quebrar? (conflito de nomes)
▸ Mudar o nome do método não vai quebrar outro ponto?
(metaprogramação)
▸ Tudo ou nada!
46. RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
# method to calculate the final price
def calculate(price, percent_modifier)
if percent_modifier.nil? || percent_modifier < 10
price
else
price * (percent_modifier / 100)
end
end
it 'calculate the final price with a modifier of 10%' do
expect(calculate(100, 10)).to eq(110)
end
48. RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
1. Declare um método com um novo nome, que chama o
anterior.
def final_price(price, percent_modifier)
calculate(price, percent_modifier)
end
49. RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
1. Declare um método com um novo nome, que chama o
anterior.
• Rode os testes
def final_price(price, percent_modifier)
calculate(price, percent_modifier)
end
50. RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
1. Declare um método com um novo nome, que chama o
anterior.
• Rode os testes
def final_price(price, percent_modifier)
calculate(price, percent_modifier)
end
52. RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
2. Agora, podemos atualizar os testes chamando o novo
método.
it 'calculate the final price with a modifier of 10%' do
expect(final_price(100, 10)).to eq(110)
end
53. RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
2. Agora, podemos atualizar os testes chamando o novo
método.
• Rode os testes
it 'calculate the final price with a modifier of 10%' do
expect(final_price(100, 10)).to eq(110)
end
54. RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
2. Agora, podemos atualizar os testes chamando o novo
método.
• Rode os testes
it 'calculate the final price with a modifier of 10%' do
expect(final_price(100, 10)).to eq(110)
end
56. RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
3. Por fim, atualizamos o nome do método e apagamos o
antigo.
# method to calculate the final price
def final_price(price, percent_modifier)
if percent_modifier.nil? || percent_modifier < 10
price
else
price * (percent_modifier / 100)
end
end
57. RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
3. Por fim, atualizamos o nome do método e apagamos o
antigo:
• Rode os testes
# method to calculate the final price
def final_price(price, percent_modifier)
if percent_modifier.nil? || percent_modifier < 10
price
else
price * (percent_modifier / 100)
end
end
58. RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
3. Por fim, atualizamos o nome do método e apagamos o
antigo:
• Rode os testes
# method to calculate the final price
def final_price(price, percent_modifier)
if percent_modifier.nil? || percent_modifier < 10
price
else
price * (percent_modifier / 100)
end
end
59. RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
3. Por fim, atualizamos o nome do método e apagamos o
antigo:
• Rode os testes
def final_price(price, percent_modifier)
if percent_modifier.nil? || percent_modifier < 10
price
else
price * (percent_modifier / 100)
end
end
68. RUBYCONF BRASIL
ATRITO ARQUITETURAL
▸ Impacto Desconhecido: Quando
percebo que não sei qual o
impacto que a refatoração tem
sobre o funcionamento do sistema.
▸ Impacto Indesejável: Quando
percebo que a refatoração tem
impacto em algo que eu não quero
ou posso mudar.
70. RUBYCONF BRASIL
ATRITO DE CONHECIMENTO
▸ A equipe não é fluente na
tecnologia em que está
trabalhando.
71. RUBYCONF BRASIL
APLICAÇÕES QUE EVOLUEM
https://pt.slideshare.net/devcamp/fbio-lima-santos-desenhando-aplicaes-que-evoluem
72. RUBYCONF BRASIL
REVISANDO…
‣ A refatoração é um processo contínuo para manter e
recuperar a qualidade da nossa aplicação, potencializando
a evolução do software.
‣E deve ser parte constante do processo de
desenvolvimento, pois permite à equipe continuar o
trabalho de evolução com os recursos necessários.