Olá, tudo bem? O vídeo de hoje é mais um trecho de uma aula de um dos meus cursos onde trouxe aos alunos um pouco mais sobre Clean Code, mas desta vez aplicado a funções, usando sempre JavaScript/TypeScript como exemplo. Se gostou, deixe o seu like e se inscreva no canal!
Livro Código Limpo: https://amzn.to/3uc9CLv
– Meus cursos: http://184.73.67.74/meus-cursos?utm_source=youtube&utm_medium=link&utm_campaign=cursos&utm_content=cleancode
– Meus livros: http://184.73.67.74/meus-livros?utm_source=youtube&utm_medium=link&utm_campaign=livros&utm_content=cleancode
Me siga nas redes sociais: https://about.me/luiztools
Um abraço e sucesso.
Prof. Luiz
—
o Olá tudo bem Aqui é o Luiz e o vídeo
de hoje é um trecho de uma aula de um
dos meus cursos onde eu trago um resumo
mais prático do capítulo 3 do livro
Código Limpo é um capítulo e a aula
consequentemente inteiramente dedicados
a escrita de funções limpas nos
parâmetros ao conteúdo as
responsabilidades enfim muita coisa
bacana que eu tenho certeza que vai me
ajudar você tá querendo melhorar suas
habilidades com o programador Então
vamos lá ó
o capítulo 13 é o Robert Martin ele traz
um conteúdo bem rico relacionado a boas
práticas na cor dificação de funções
qualquer ideia aqui eu vou pegar com
vocês a função que a gente fez por
último a Live passada que foi a função
que not drink s para saber se o próximo
não bebê porque ela tem margem pra gente
trabalhar vários conceitos e funções
limpas e faturando ela a seguindo em
vários prefeitos do livro do código
Limpo mas não somente também como de
praxe eu vou trazer também algumas
experiências práticas algumas dicas que
eu considero válidos de serem trazidos
acho que aqui vale um disclaimer A o
livro ele é muito bom mas ao mesmo tempo
ele pode te levar muitas vezes a um
fanatismo ou um comportamento mais Chita
né mas radical E aí você querer aplicar
e o tempo todo sem por cento as regras e
isso eu diria que como todo excesso é
algo prejudicial tá então a gente vai
depender também alguns padrões que a
gente quer ou não seguir ou que vale ou
não vale a pena seguir dependendo do
contexto ou até mesmo a forma comprou a
gente passa um tempo programando aí
depois de alguns anos a gente acaba
criando algumas vamos dizer assim
algumas práticas próprias algumas
recomendações nós mesmos entendemos como
positivas e que as vezes não tem
conflito com o autor ou com outro autor
os próprios autores eles não são
unânimes em todas as regras que estão no
código do livro do Robert Martin por
exemplo a Então vamos Kleber que
totalmente eu vou falar alguma coisa
aqui a sempre lembrar você tá na isso
aqui eu eu gosto mas isso aquela do Java
por exemplo esse lado você sabe evento
para mim que eu pego alguns padrões de
outras linguagens e não de um autor
específico por exemplo tá
o assunto significar discordar de alguma
coisa que eu moro não tem problema
nenhum então estamos aqui do mesmo jeito
que nós deixamos ela a semana passada
que ela tem a função que é normal juntos
onde eu recebo alguns parâmetros na que
já estão ali já fatorados né com os
nomes mais expressivos então tipo de
bebida o ano de nascimento de quem quer
beber o ano atual e o país da pessoa e
aqui a gente já tem uma primeira
aplicação de uma regra que eu seria ali
né mas foi sem querer eu juro que é você
tem que escrever corretamente o que você
tava né programando e eu escrevi os
países em inglês mas Lívia tá escrito
errado tá livre em inglês é com Y algum
lugar no segundo ih tá bom então vamos
corrigir isso nós vamos lá no nosso
Reino de países certo e assim Líbia
e eu posso utilizar um recurso do
próprio vs code que é o renis Symbol tá
com o atalho F2 ou clique com o botão
direito em cima do carro renomear certo
bota o novo nome é Lívia com y no
segundo i e Dom Helder isto
automaticamente já procurou em todos os
pontos meu código onde eu estava
utilizando o livro escrito errado e aí
entra já uma primeira vantagem da gente
tá utilizando e no numerador ou
constante aí quando está trabalhando com
constante colaboradores eu posso dar
esse recurso de fatoração por exemplo
outra coisa que vale a pena ainda com as
lições passadas eu refaturar aqui é o
nosso numerador e nem somente eu botei o
nome de cantores aqui só que cantos como
ele fica no plural ele pode erroneamente
da entender que esse aqui é um tipo
multivalorado quando na verdade é só um
valor mesmo certo embora estou Yoki não
é países. Líbia
hoje nós vamos voltar atrás e vamos
mudar essa numerador para ele usar um
nome no singular
bom então eu vou aqui no arquivo vou
renomear ele
e para country no singular vou dar um
enter o vs code vai atualizar os
impostos para mim
o e internamente mas eu vou usar aquele
recurso do Rene símbolo de novo clique
com o botão direito no nome do numerador
Reni single o Botar ele no celular aqui
certo então agora fica mais mais Óbvio
mais expressivo que isso apenas um país
você quiser deixar ainda mais expressivo
talvez eu posso usar Country code por
exemplo uma coisa assim tá mas eu gosto
de como a gente ler agora país Líbia
país Sudão fica mais direto né com menos
com menos infecção na área de informação
ó
e ficar falando no capítulo 3 do livro
dá umas coisas que ele fala sobre o
número de parâmetros mas ele disse que a
função ideal não tem nenhum parâmetro
mas que você pode ter um parâmetro a pé
bom dois que é razoável EA partir do
terceiro parâmetro começa a ficar ruim
dentro da toda uma explicação do porquê
disso não era complexada isso gera
confusões isso causa mas o fato é que de
fato quando a gente tem muito parente
sua função a gente começa a Gerar uma
complexidade desnecessária a e começa a
Gerar daqui a pouco para mim
profissional com gerar um monte de
coisas ali se mais geram confusão do
Cajuru mas vale apenas ter mais de uma
função com parâmetros diferentes do que
tem uma função cheia de parâmetro não é
principalmente foi feito para os outros
mais
É mas aqui eles têm uma oportunidade bem
grande de acabar com um parâmetro muito
facilmente que é esse que mentia
é porque esse é o ano atual eu não
preciso receber isso por parâmetro certo
eu posso pegar isso da hora do sistema
que eu vou derrubar esse parâmetro que a
gente era aqui
o sangue escorria eu posso pegar o ano
atual do sistema
e mais do que isso eu vou remover essa
repetição aqui ó que eu tenho vários
pontos a esse cálculo da idade da pessoa
certo porque se eu tenho vários pontos
de código o mesmo código é certo que
isso aqui tá errado eu tenho a mesma
lógica é um Cold smell é um cheiro de
que está errado eu tenho exatamente o
mesmo código é que tá combatendo chamado
Então vamos estar aí aquilo ali aqui
para cima vamos decorar uma consiste aí
é a idade né que ela vai receber um New
date. Gretchen fui a menos warfire Então
o ano atual menos o ano que ela nasceu
isso vai me dar a idade e daí eu consigo
fazer uma primeira refatoração que vai
diminuir bastante código repetido aqui
na minha função deixando o que minha
função mais lembra aquele tivemos uma
primeira camada
Boa tarde demais que nós temos aqui teve
um país que é o treze aqui ó que a gente
não colocou não colocou o número do com
ela o Treze é eu assei a Estados Unidos
às vezes para você poder comprar bebida
né e Teoricamente beber também né é a
partir dos 21 anos o que que a gente
começa a ter aqui também né que nos
permite dá uma melhorada vamos lá eu
falei tudo bem Type quero poderia também
transformar em numerador Hoje ele tava
constante mas ideal que ele também fosse
um enumerador
eu vou criar aqui mais o numerador nosso
projeto que vai ser o jointype
e a ponto teste já fazer o EcoSport é um
o drinque Type tu tiver chegar mais
tarde drinque também se você achar que
você já fica declarativo o suficiente
vou ter que ir um Bia para ser um e eu
vou colocar aqui um o Anderson tá porque
hoje eu não tenho botar um moderno
celular que hoje eu não tenho uma regra
né específica para virou para celular
cachaça então eu botar a cerveja eu ele
aqui no nosso código eu posso importar
esse novo numerador é que o drinque Type
from
o ponto/Grande sabe eu não preciso mais
você vier aqui aquele juntos sabe. B e
também na minha função tão mais bacana
ele trabalhar com o nome eu não vou
esperar um número qualquer vou esperar
um dia em que tá aí beleza Vamos aos
poucos nós estamos ganhando forma aqui
é uma coisa que fala fala bastante um
código Limpo por quê que é as funções
elas tem que fazer uma única coisa essa
função aqui qual é a coisa que ela faz
ela te diz se uma determinada pessoa
pode ou não pode beber a década passada
as informações a pessoa né o anos
Nascimento que que ela quer beber o país
Faltar só pode ou não pode beber certo
no entanto uma outra coisa que uma
função limpa deve fazer é ter apenas um
nível de abstração O que quer dizer isso
ah eu tenho que dizer se eu posso ou não
posso beber mas essa função ela não
deveria descer o nível de abstração para
regra de um país específico
e ela deveria se manter no nível mais
alto de abstração O que é olha o
Tennessee dados aqui com grandes dados
saiu output.
é aquilo jeito que tá hoje ela conhece a
regra da Líbia a regra do Sudão a regra
Estados Unidos e assim e até mais a
regra do Egito que é mais complexa aqui
certo então isso não é legal como é que
a gente pode fazer uma primeira
refatoração para manter um mesmo nível
de abstração nessa função a gente pode
estar essas regras para outras funções
aqui vamos fazer uma primeira
refatoração aqui que é o que né Quem or
not drink in Líbia por exemplo a
bom então aqui eu vou jogar a regra da
Líbia para dentro essa função específica
que a gente criou aqui o que que essa
função vai receber a idade da pessoa dá
uma idade vai ser um Uber é o tipo de de
bebida já vão receber mais longe
Nascimento tá porque eu já tenho idade
para o lado então preciso mais essa essa
informação
e eu não precisa ser o país coloca na
Líbia certo pela sei que eu tô na Líbia
E no caso da Líbia a regra hoje é sempre
esta me falso certo
fala para ela ficar meio de ó tá essa
ideia que minha da função mas não
entender ao longo aqui da lição porque
questão interessante Então ela vai
receber a idade do indivíduo e o que que
ele quer beber o Sudão a mesma coisa
então criar uma função né se ele pode ou
não beber no Sudão
é a regra do Sudão é totalmente baseada
na idade certo um recebe os mesmos para
o nosso código aqui ah eu vou ter criado
mais mais funções lá no meu mas funções
na minha Quer o número da minha classe
me no módulo sim eu vou criar mais um
sonho mas a função que é a que realmente
importa que é que eu exporto para o
mundo exterior que é usada fora ver esse
módulo vai ser com chance de só uma não
vai continuar por causa para aplicação
super simples de usar ela certo e
internamente ela vai ficar mais
declarativa certo então eu tenho sim mas
funções Talvez sim eu tinha mais linhas
de código mas a minha função principal
eu vou deixar ela menos complexa de ser
entendida a poderia nas funções ali Ah
que não usam diante Type omitir essa
informação até poderia mas depois eles
vão ver
a manter coloca que minha função
principal ela ficou serão declarativa
certo então te passo o país a Líbia eu
peço a função Posso ou não beber na
Líbia né se o país estudam próximo não
beber no Sudão tanto então ficou no
mesmo nível de abstração que é um nível
de funções não tem um nível de dado o
país eu pergunto para aquele país se eu
posso ou não beber tem entrar nos
detalhes entrar um nível mais abaixo na
hierarquia né Entrar nos detalhes
daquele país seria um outro nível de
abstração certo bem aqui também numa
outra refatoração que foi citada na Live
passada que é eu posso aqui usar um
Switch Case homens wi-fi tá que o código
vai ficar menos ver Bozo pela fazer a
mesma coisa com menos informação Então
vamos lá Outra atração bem interessante
fazer aqui então vou ter que suíte em
cima do country
in case
o câncer ponto Líbia que vai fazer para
retornar à função da Lívia e eu vou
botar um de folk é uma coisa que não
tinha dentro uma saia nosso código onde
for o que é se ele não encontrar paz
nenhum o que que eu vou fazer qual que é
a recomendação use né exceções use erros
e não códigos de erro Ah não não um cara
habitação por exemplo de retornar que
hoje essa função que ela tem que
retornar é um plano certo que eu vou
colocar aqui ó agulha aqui tem um
booleano não cair na tentação de
retornar falci nesse caso que gostaria
dando um falso negativo para pessoa
certo porque não é que mas a pessoa
passa um país o código no país que é o
Afeganistão veio você retorna falso a
pessoa bota 18 tá ficando essa você é
uma falsa ela vai achar que eu sou com
na verdade você não tem meu para natação
para isso você tomou falso para o padrão
também
se você tomar código de erro Faria que
você tivesse que tomar mais um tipo
nessa função né ela tem que tomar um
boolean ou um Number A isso é ruim ficar
tratando o código tratando retorno
diferente lá fora A então aqui usem
esses sonhos caiu num cenário de a
sessão lança uma exceção da Unilever
account not found ou país não não
conhecido não informar sei lá mas você
coloca aqui para exceção na avisando a
você usou errado essa minha função aqui
beleza mesma coisa que você quiser
validar aqui né se foi passado um ano e
tetra essa poderia de parece é sonho não
é de uma função ao chamada era uma
requisição ao formada ou algo do tipo tá
então a recomendação é usa essa sonho
essas ações são para isso obviamente que
foi chamar essa função tem que tratar
esse ações contra quer Beleza então aqui
Já começamos a melhorar a nossa mente
com menos linha
É mas ele mais fácil de ler certo mais
fácil de ler o que que a gente tem de
problema agora fala para resolver
E conforme for aumentando na os meus os
meus países tá claro só metade mais eu
vou querer usar banco de dados Tá mas
conforme ele for aumenta nos países
hoje eu vou começar a crescer o número
de funções certo
Oi e eu vou ter que ficar colocando
várias vezes aqui no Switch Case certo e
essas minhas funções também nós o tempo
estão um tanto parecidas também lá então
como é que a gente pode resolver isso
não é de uma maneira mais elegante sim
para todos os países tá eu tenho que ir
ter uma lógica para verificar se ele
pode uma pessoa pode ou não pode beber
eu posso criar um contrato para isso uma
Interface para qual eu tenho
implementações essa regra em diferentes
países e com isso com essa abstração eu
consigo criar função extremamente mais
limpa eu vou mostrar que ficou esse
exemplo de beber ou não beber que as
coisas simples mas isso conversa para
vocês extremamente poderoso para que
vocês usem-no sofre de vocês é o mesmo
princípio né que é parecido mas à tarde
mesmo mas é parecido com o princípio que
eu usei no curso né quando adicionei
para tração de Evan handler
eu vou fazer aqui novamente num contexto
mais simples para ver se fica mais claro
entender então primeiro passo eu vou
criar aqui um arquivo para ser a nossa
interface né de poder ou não poder beber
certo então ela vai se manter fácil de
que a mãe dele fácil de de país tá só
que como ela não representa exatamente o
comportamento de um país mas somente um
comportamento de uma regra de Ribeirão
beber eu vou chamar sem interface e
Kendrick
e o pode beber dentro como fazer como é
que se podes interface já que tem que
ser uma maiuscula drinque certo o quê
que uma interface faz ela define
contrato regras e classes devem seguir
Então qual é a regra que eu vou definir
aqui a vai ser a regra aqui toda toda
toda classe né que eu precisava usar
essa minha aplicação ela tem que ter uma
função quem or not drink em Esta função
ela vai esperar um Heidi klum Number só
e um Dream que é do tipo drinque type
e eu vou importar aqui em cima e essa
função vai retornar sempre um bulha
Beleza então essa é a interface definida
ao contrato a regra do infinito sabe que
a minha aplicação né ela vai precisar né
os objetos aplicação precisar nessa
função aqui e daí agora eu posso criar
as classes para os meus países como por
exemplo E aí eu passo a criar uma camada
que não é aplicação não é para os meus
modelos ou coisa do tipo assim tá
e para agrupar essas passa no único
lugar certo vou criar aqui por exemplo
uma camada de tanques na camada gente
dar certo eu vou ter essa interface lá
dentro dá uma olhada aqui eu vou querer
andar espaço aqui dentro então quanto
minha casa para bloquear bloquear por
exemplo uma classe para Lívia tá então a
língua confesse que ela vai ter vai ter
um EcoSport ela essa Líbia e essa Líbia
ela vai implementar implement a minha
interface can drink 1
a parte tão cortou aqui em cima ainda
não ter fácil momento que entender faço
para me xingar ela a se libertar
incorretamente interface can-bus é
porque ela não tem aquela função ali
certo então vamos criar ela tem que ter
a uma função quem or not the 29th que me
sugeriu ali certo e vai vai esperar um
ente que é o Number 1 diz que é um
detalhe vai retornar um boolean e aqui
ela vai ter corpo aqui eu vou te a
implementação da minha função que no
caso da Líbia é sempre falso
Tá certo
e esta mesma ideia aqui eu vou
implementar para os outros países então
vou ter que ir um USA
Ah tá eu vou botar a regra do dia sei
qual é a regra né e di maior = 21 TAM
criei a minha abstração que a gente faz
e criei as minhas lágrimas implantações
estão as coisas
E por que que eu fiz toda essa
trabalheira né parece uma trabalheira
danada né que não vai me levar a lugar
nenhum Claro que esse nosso correntinha
aqui é muito simples tá mas você tem que
mostrar isso e pegar essa ideia para
projetos maiores então crianças em
plantações baseado na casa distração
agora
e aqui no nosso a nossa exercício 13
aqui né tchau onde tem uma função eu não
preciso mais as funções todas aqui certo
então esse módulo vai ficar mais lembro
Ah beleza mas eu poderia aqui baseado em
cada item do Switch certo chamar o que
no caso da Líbia uniu libya certo. Quem
or not drink certo poderia fazer isso
aqui
e qual que é o benefício disso joguei
fora todas as funções que estavam aqui
engordando no módulo agora está uma
bença para Dinha cadê Nossa classe ela
tava aqui enrolando logo eu tirei elas
certo tá chamando
é isso aqui já me daria mais algum ganho
certo mas vamos dar mais um passo além
nós vamos nos contentar com um pouco
porque porque isso aqui me resolveu o
problema de múltiplas funções aqui nesse
arquivo mas eu teria que ter um monte de
um forte como é que eu dou mais uma
melhorada ele só que ainda e a Último
Ponto que eu queria trazer aqui hoje
para vocês ligado a código Limpo de
funções na prática
e eu clico naquela abstração a para que
a gente consiga se beneficiar da
abstração aqui certo então isso quer
dizer com isso que independente na do
país que for eu posso usar abstração
Kendrick e chamar a função quer not
drink
se passa nos mesmos parâmetros
bom então aqui
e eu vou criar neste modo uma função que
a gente chama de Factory method aqui é
um pata né para criação de objetos
quando eu tenho justamente isso uma
única abstração vários objetos
implementados e eu preciso baseado num e
um baseado numa constante na informação
de perna gerar Instância correta né da
implementação para aquela abstração e se
chama de Factor metade tá porque eu vou
fazer aqui uma função um método não é
para fazer isso então aqui vou fazer um
fator método vai ser um Create and Hank
tanto daqui a uma estância de quem
doente baseado no que baseado em um país
e ele vai receber o país e ele vai gerar
a esperança de quem Gente o que que ele
vai retornar ele vai retornar um quem
drinque que aquela Nossa interface que
eu queria certo escreva retornar aqui
Como assim vai tomar uma interface na
verdade a mencionar um objeto que
respeita essa interface
eu já vou ter que dentro um Switch Case
que aquele a mesma pessoa esqueça de
baixo e aqui ele vai retornar tá o
objeto esse Factory method eu tô
querendo que junto nesse aqui você
poderia extrair ele tá bom Você poderia
colocar ele dentro uma classe de Factory
é um quem do Inter Factory por exemplo
até uma fazer isso aqui vou ficar só
falando fazer aqui ó então criar aqui um
drinque Factory certo eu vou dar um Fox
Sports classf can Dream Factory 1
e dentro dela eu vou ter o que é uma
Crush xandrin vai ser estática não é
obrigatório vocês aqui tá o meu caso
aqui faz mais sentido dor o para tinha
função aqui faz mais sentido vocês tarde
para o para forma que eu pensei aqui mas
não é uma regra não tem que importar
esse canteiro aqui tem que importar o
quem gente tá aqui
Tá certo e daí ele vai tornando
implantações aqui então a Líbia
E vai retornar o Sudão e o erro claro se
não encontrar o país Beleza então
preciso para cá agora aqui eu vou fazer
o que eu vou declarar uma tirar sem
participaram de mais uma variável do
tipo é do tipo que no juntos vou chamar
ela aqui the country
o drinque uma coisa assim tá só porque
ontem eu já chamei aqui em cima né
eu não usaria calça aqui mesmo que vai
receber esse cara aqui
e ele vai receber um can Dream Factory.
Como ela estática não precisa distanciar
né funcionar três tática né então
cliente condições passando o código do
meu país isso aqui internamente a fazer
o que aquele switch-case certo e vai me
retornar para cá o objeto do tipo certo
para eu guardar nessa variável aqui ó
eu também vou precisar aqui em cima do
tipo não é
a venda trabalhava aqui eu não preciso
mais isso the Case
hoje eu vou fazer o quê um retorno em
Country can drink. Quem or not3 passando
a idade e passa aqui o link aqui beleza
então reparem como o nosso módulo
principal do exercício ficou
extremamente Limpo ó eu poderia ainda
melhorar isso talvez tirando as esse
cálculo aqui do da idade já pedindo a
idade direto Sei lá tá para tirar esses
abstração aqui de calcular idade daqui
de dentro tá bom mas nós tem como depois
disso tirar o nome isso agora como ficou
limpar essa nossa função e mais do que
isso esta essa esse módulo desculpem ele
não apenas tá limpo como não importa
quantos países eu venha a ter no futuro
eu não vou mexer mais nesse módulo aqui
ó
é porque se eu queria agora um novo país
vou criar aqui por exemplo Argentina eu
não sei a regra da Argentina tá vou
chutar que é 18
eu vou criar aqui ó Argentina
a Export Class Argentina do motor é uma
regra gente no sistema implement and
Dreams
Tá certo implantando quero quem drinque
eu tenho que ir na implementar função
que é normal diferentes eles maior igual
a 18 certo Creia raiva da gente né que é
um botão a batata no sistema
o único ponto que eu vou ter que
modificar é no meu Factory Vou teclar
minha Factor
o e colocar né a regra aqui para a
Argentina a bater botar no meu numerador
também né porque eu tô usando numerador
retorne Neu Argentina vou lá numerador
a Argentina vai ser o seis mas não tem
que botei um item numerador
eu botei um Case mais no nosso
e no nosso Nossa Factory e a certas
ações para isso por centralizar essas
criações objetos mas o meu módulo
principal eu não mexi nele eu não mexi
nele então se eu tô fazendo por exemplo
testes unitários mas eu tenho uma
cobertura de teste bacana e ele tá
pensando essa função o meu teste ele não
deve quebrar ele deve continuar
funcionando normalmente porque eu não
mexi assinatura não mexer retorno não
mexi sequer no corpo nesse código aqui
certo então tem um princípio vai fazer
um gancho aqui com Solid é tem um
princípio dos óleo de que ele fala do
outro inclusive né você tem que tar
aberto né para derivação e mais fechado
para modificações Então esse meu código
aqui ele tá bem De acordo com o
princípio do Open closet porque ele
permite que vocês Panda ele você tá
aberto para que seu código o valor certo
mas ele tá
a família ele foi construída com
arquitetura de tal forma que eu posso
pegar mais países na minha aplicação sem
precisar mexer no meu código principal
certo pensa um pouquinho queria trazer
aqui para vocês na prática que
relacionado a Clean Code em função tá
com aí são algumas dicas que resume bem
o capítulo 3 do livro O código não tá E
aí gostou do vídeo Então deixe seu like
se inscreva no canal se você ainda não é
inscrito se você ficou qualquer dúvida
sobre alguma das técnicas utilizadas
para deixar as funções mais lentas deixa
aí nos comentários terei maior prazer em
tirar suas dúvidas se você curtiu a
didática curtir o conteúdo Considere a
possibilidade de conhecer alguns meus
cursos completos de node.js e pode me
ajudar muito na sua carreira Linda nos
cursos também está na descrição tem os
cursos também tem opções mais acessíveis
de livros que eu publiquei também sobre
esses assuntos para ver se essa
audiência um abraço e até a próxima
valeu
Olá, tudo bem?
O que você achou deste conteúdo? Conte nos comentários.