(musica de jazz)
Sandi: Então você pensaria que escrever
código orientado a objetos
fosse difícil.
Tudo que precisa fazer é
olhas nossos apps, certo?
Temos boas intenções,
e quase sempre escrevemos
códigos que podemos vir a
odiar.
E quando mais eu penso
nisso, vejo que,
meu trabalho é pensar em
como escrever código melhor.
E quanto mais penso,
mais acho que
todos os problemas, tem uma
mesma solução simples
e agora quando pessoas me perguntam
como escrever código
orientado a objetos,
eu dou-lhes uma pequena dica.
Eu digo "criar coisas menores", é só isso.
Criar classes menores, métodos menores,
e deixar-lhes saber o mínimo possível
um sobre o outro.
E ultimamente estou em uma missão
Tenho tido essa obsessão
nos últimos meses,
e é sobre condicionais.
Tem muito código por aí
com condicionais feios nele,
e ando me questionando
quando eu deveria substituir
trocar condicionais por objetos pequenos
e como eu deveria fazer isso
e o que aconteceria com meu código
se eu fizesse isso.
Eu estava muito confiante
em Miami em novembro
e eu tive essa obsessão em Jim Weirich,
quem alguns de vocês
provavelmente conheceram,
e ele me direcionou para o 'Gilded Rose'.
Isso é um 'Kata',
aparentemente é
muito conhecido,
mas eu não saio muito,
então eu
(risos)
nunca tinha ouvido disso.
É tão famoso que você pode
simplesmente botar no Google
e achar uma explicação do problema,
mas eu não fiz isso.
Eu queria tratar esse
problema como
se fosse um problema de produção mesmo,
e que minha única informação
fosse o teste e o código.
Então eu olhei para o dele.
Eu baixei o repositório dele,
e olhei para o problema,
e tinha tanta interesse nele
que tirei ideias
da minha palestra de hoje.
Eu alterei o código dele só um pouco,
mas só para ser
mais fácil de falar
Isso realmente é a 'Gilded Rose Kata',
então, vamos.
Tem a classe 'Gilded Rose', e essa
é a estrutura
Ela tem atributos para nome, qualidade
e dias restantes
ela initializa valores,
e tem um método "tick".
Agora aqui tem o método 'tick',
não, na verdade
isso é apenas a primeira metade dele,
aqui tem o resto.
Eu sei que não dá para ler isso
Nem tente, mesmo se conseguir, ok?
Aqui é o método inteiro.
Eu só quero que vocês tenham uma ideia
do tamanho e forma dele.
É um 'if' de 43 linhas.
E para mim isso é muito, muito difícil,
mas eu sou conhecida por
ser boolean-impedida.
(risos)
Eu sei que é subjetivo o meu senso de
quão dificil
de entender algo.
E isso possivelmente é errado
então em vez disso eu usei algumas métricas.
Analisei ele usando a métrica "Flog".
"Flog" é uma métrica.
Ok, o que é uma métrica?
Uma métrica é uma ideia "crowdsource" sobre alguma coisa.
Ok? Eu tenho minha própria opinião
sobre quanto isso é complexo,
mas eu posso usar a sabedoria-da-multidão
dessa métrica,
a métrica Flog, que anota....
É uma métrica ABC, então anota atribuições,
'branches', e condicionais.
Ela simplesmente conta coisas e soma-las.
Pontuações maiores são piores.
Elas indicam código mais complexo,
código que vai ser mais difícil
a entender e raciocinar.
Então, Flog disse que a classe GildedRose registrou 50,
e aquele método "tick" ganhou 45.
(lamentação)
Dói, né?
Então Flog disse que é complicado,
mas antes de continuar eu quero introduzir
uma métrica muito subjetiva
sobre complexidade.
Então, passo muito tempo esses dias
indo para lugares e olhando código
sobre qual eu não sei nada.
Pessoas me ligam, e vou pro escritório deles,
e passo alguns dias.
E como você poderia imaginar,
ninguém me liga se as coisas
estão indo bem.
(risos)
Né?
E quando eu chegar, eles não me pedem
para olhar o código do
qual eles tem orgulho.
Eles me pedem para olhar as
partes mais hediondas,
as coisas que tem contextos meio longos
e complexos na história.
Código que tem saído completamente
do controle.
E as explicações não são apenas
longas e confusas
porque o problema é difícil,
mas eles fazem aquilo que
todos nós fazemos,
você sabe aquilo que faz quando precisa
explicar um pouco de código que você escreveu
de qual você tem vergonha?
Você não apenas explica como funciona.
Você se sente obrigado a explicar
todos os motivos por ter ficado assim.
(risos) Né?
Podem rir. Eu faço. Eu sei que vocês
também fazem, né?
Simplesmente dói. Odiamos isso.
Então essas explicações são longas
e confusas e tem muitas
informações paralelas
E chega um ponto, eu entendo...
mas chega um ponto durante toda
explicação quando eu começo a
me sentir igual aquele cachorro,
Ginger, no desenho do Gary Larson.
quando começa a virar "blah, blah, blah,"
Sandi "blah, blah, blah"
(risos)
E de repente eu volto
para ouvir eles dizendo
então, o que você acha que
deveríamos fazer
sobre essa linha de código?
(risos)
E antigamente me assustava muito
Senti como se precisasse entender tudo
para poder ajudar com alguma coisa.
Mas depois de algumas viagens,
eu percebi que tem algo muito
simples que poderia fazer para me ajudar
a identificar o que eles poderiam
se beneficiar modificando.
Eu chamo isso do "teste vesgo".
(risos)
É assim que funciona:
Aperte os olhos, se incline
e olhe o código.
Buscamos por mudanças
na forma (risos)
e mudanças de cor.
Mudanças da forma quer dizer
que temos condicionais aninhados
e são difíceis de racionalizar.
Mudanças de cor dizem que seu código está
em níveis diferentes de abstração,
e querem dizer que a história que conta
vai ser difícil a seguir.
Agora, o que é sobre esse código?
Bem, ele tem 16 condicionais "if",
algumas delas são negadas,
e conectam algo com um "&",
tem 3 Strings mágicos, que são usados em todo lugar,
e vários números mágicos,
nem sei quantos.
(risos)
Agora, pelo menos tem testes.
Ah, desculpe, aqui são os Strings mágicos.
Essas três coisas:
Brie, Sulfuras, e Backstage passes,
sei lá o que isso quer dizer.
E tem testes e eles passam.
Agora, tem seis testes pulados, certo?
(risos)
Então sei lá o que é isso.
Então eu abro o código e só
olho esse primeiro teste.
Ah, desculpe, os testes são relacionados
as Strings mágicas
exceto desse grupo que é sobre
algo que se chama "Normal",
que nunca é mencionada nas condicionais.
(risos)
Eu suspeito que tem um "else"
em algum lugar que importa, certo?
Então eu abro o teste e olho nele.
Aqui tem um, são todos assim.
Estou vendendo algo, certo?
Presumindo um GildedRose
que tem esse nome,
atributo e qualidade,
esses são nossos três attr_readers,
quando eu dou 'tick', nesse caso,
qualidade baixa por um,
dias sobrando baixa por um,
ambos baixam por um.
É como seu eu estivesse vendendo leite,
ou ovos, ou queijo ou algo
que tem validade,
que vai expirar, onde eles
ficam ruins em alguma data.
Então, ainda estou explorando,
ainda nem sei qual é meu trabalho,
e olho para os três testes pulados,
e tem algo que se chama "Conjurado",
(risos)
e todos seguem a mesma linha,
todos os testes parecem que supondo isso
quando eu dou "tick", vejo essa mudança.
E agora eu percebo, caramba,
eu preciso modificar esse código.
(risos)
Então eu tentei, eu tentei,
muito obedientemente, eu tentei, mas foi uma falha miserável.
Eu não consegui.
Aquele condicional de 43 linhas me venceu.
Toda vez que eu tentei, eu tipo abri
um teste Conjurado
eu fui fazer uma mudança
naquele condicional
para fazer o teste passar,
quebraria mais algo.
Gastei horas nisso.
Agora, eu fui prejudicada,
mas realmente, foi difícil.
Seria difícil para você também, eu acho.
Então, se mudar aquele condicional
fosse tão difícil, você precisa perguntar,
por que eu estava tentando? Por que eu tentei fazer,
o que me levou a tentar alterar
aquele pedação de código incrívelmente complicado.
E a resposta é que me senti que eu deveria.
E isso é o que acontece, né?
Você escreve um código, e alguém pede uma mudança.
O que nos fazemos?
Você roda o código procurando
um código que é parecido com
a coisa nova que está tentando fazer,
e você coloque o código aí.
É assim que agimos.
Novatos mais, eles tem medo de criar novos objetos,
então eles só coloquem mais código aonde conseguem
achar algo parecido com aquilo que estão tentando adicionar,
e se aquele lugar já tem um "if",
eles adicionam mais um galho, né?
É assim que funciona.
E o que acontece é, a tendência natural
é que código cresce,
e cresce, e cresce.
E chega um ponto, né?
Ele cresce, e cresce, e cresce.
E chega um ponto em que vira,
e naquele ponto é tão grande que
você não consegue imaginar colocando código em outro lugar.
(aplausos)