(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)