Movatterモバイル変換


[0]ホーム

URL:


Skip to content
DEV Community
Log in Create account

DEV Community

Cover image for Três conceitos para um Código Limpo
Daniel Reis
Daniel Reis

Posted on

     

Três conceitos para um Código Limpo

Prólogo

A pergunta mais constante entre os desenvolvedores que estão querendo sair do nível Júnior para Pleno é "será que meu código tá uma merda?" ou "beleza isso funciona, mas como melhorar esse lixo?" e se questionar sobre a qualidade do produto que você está entregando é um sinal de que você está (digi)evoluindo.

Na minha jornada como desenvolvedor eu venho cada vez entendendo que no final das contas o importante é aengenharia e não aferramenta, até porquê você sabe que um CRUD é uma sequencia X que pode ser replicada em TODAS as linguagens, certo? Logo, se você sabe a teoria/engenharia, a pratica só precisa da ferramenta/linguagem.

Agora, vamos entender sobre conceitos/padrões que podem estar ligados diretamente à qualidade do código entregue, onde nós deveriamos nos preocupar muito mais do que sobre "qual framework usar".

O que vamos aprender?

Nesse post, quero dar exemplos de conceitos e métodologias para que possamos melhorar nosso código. Sendo eles:

  • DRY (Don't Repeat Yourself)
  • Early Return (Anti Hadouken)
  • KISS (Keep it Simple Stupid)

1. Dont Repeat Yourself (DRY)

O tal do DRY é algo bem visto quando o assunto é abstração. A ideia do principio é você não repetir coisas que podem ser abstraidas pra blocos de códigos únicos. Se você está fazendo o mesmo bloco de código duas vezes, ele é refatorável pra uma função com argumentos.

Não entendeu? Se liga aqui então:

classUserRepository{publicfunctioncreateUser(array$payload):bool{$query=$this->pdo->prepare('SELECT * FROM users WHERE email = :email');$query->bindParam(':email',$payload['email'],PDO::PARAM_STR);$query->execute();if($query->count()){thrownewException('E-mail já cadastrado');}$query=$query->prepare('INSERT INTO users values (null,:name,:email, :password)');return$query->execute();}publicfunctiongetUser(string$email):?array{$query=$this->pdo->prepare('SELECT * FROM users WHERE email = :email');$query->bindParam(':email',$email,PDO::PARAM_STR);$query->execute();if(!$query->count()){thrownewException('Usuário inexistente.');}return$query->fetch(PDO::FETCH_ASSOC);}}
Enter fullscreen modeExit fullscreen mode

Nesse exemplo feito em menos de 5 minutos podemos ver que há uma duplicidade de código quando fazemos a query docreateUser e a query dogetUser e não há necessidade de duplicar isso caso haja uma função pra lidar com esse comportamento.

Se liga:

classUserRepository{publicfunctioncreateUser(array$payload):bool{$query=$this->getUserByEmail($payload['email']);if(count($query)){thrownewException('E-mail já cadastrado');}$query=$query->prepare('INSERT INTO users values (null,:name,:email, :password)');return$query->execute();}publicfunctiongetUser(string$email):?array{$query=$this->getUserByEmail($email);if(!count($query)){thrownewException('Usuário inexistente.');}return$query->fetch(PDO::FETCH_ASSOC);}publicfunctiongetUserByEmail(string$email):array{$query=$this->pdo->prepare('SELECT * FROM users WHERE email = :email');$query->bindParam(':email',$email,PDO::PARAM_STR);$query->execute();return$query->fetch(PDO::FETCH_ASSOC);}}
Enter fullscreen modeExit fullscreen mode

Isolamos uma abstração em uma única função e usamos ela em 2 lugares e o código ainda ficou um pouco mais legível (desde que você dê um nome bacana pra sua função abstraida). Bacana né? Se a galera juninha prestasse atenção nesse tipo de coisa desde o dia zero já teriamos carros voadores :p

2. Early Return Statement

Beleza, agora vamos falar de complexidade de código: tá ligado aquele código que tem um monte de if/else um dentro do outro parecendo um hadouken? Então, isso ai é um PORRE pra gente que vai dar manutenção no futuro e muitas vezes perdemos uns minutos refatorando o negócio. Então, se ensinarmos a rapaziada como não criar esse tipo de código vai ser a maior vitória pros devs que mexem com legado (eu incluso).

Você não sabe o que é um código hadouken? É isso aqui ó:

classAuthRepository{publicfunctionadminAuthenticate(array$credentials):bool{if($user=User::where('email',$credentials['email'])){$password=Hash::verify($user->password,$credentials['password']);if($password){if($user->isAdmin){Auth::login($user);returntrue;}else{thrownewUnauthorizedException('vc n é um admin seu merda');}}else{thrownewUnauthorizedException('senha errada seu otário');}}else{thrownewUnauthorizedException('ce nem existe no meu banco wtf');}}}
Enter fullscreen modeExit fullscreen mode

Acho que nesse exemplo deu pra entender o conceito de hadouken, né? Encadeamos tantos ifs e elses que não fez o menor sentido e só aumentou a complexidade do código. Agora, se entendermos a lógica doEarly Return a coisa fica um pouco mais bonita.

O que é: fazer com que o else seja sempre a condição principal e dar o retorno da função o quanto antes. Ou seja: negar a função e retornar em caso de erro. Não entendeu? Vamos pra prática então:

classAuthRepository{publicfunctionadminAuthenticate(array$credentials):bool{$user=User::where('email',$credentials['email'])if(!$user){thrownewUnauthorizedException('ce nem existe no meu banco wtf');}$password=Hash::verify($user->password,$credentials['password']);if(!$password){thrownewUnauthorizedException('senha errada seu otário');}if(!$user->isAdmin){thrownewUnauthorizedException('vc n é um admin seu merda');}Auth::login($user);returntrue;}}
Enter fullscreen modeExit fullscreen mode

Negamos todas as condicionais pra fazer com que elas retornassem o quanto antes e garantimos uma melhor legibilidade pro código. O Early Return vem sendo cada vez mais citados por devs e empresas como algo obrigatório pra criar um código bacana e saber isso com certeza vai te deixar a frente de uma galera.

Mas Daniel, não devo usar o else? Bom, isso fica inteiramente pra você. Eu não gosto, mas tem vezes que não dá pra fugir. Fica ai a reflexão :p

3. Keep it Simple Stupid (KISS)

Cara, é bem legal implementar lógicas ao seu software e tudo mais porém chega numa hora que a própria linguagem já tem aquele método ali que você fez pronto, e com toda certeza mais otimizado. Então, pra quê?! As vezes manter as coisas simples são mais vantajosas a longo prazo e isso visto de um lado mais dev da vida onde temos gambiarras pra todo lado, é um puta ponto positivo.

Vamos um exemplo de um bloco de código zoado e uma versão desse mesmo bloco porém simples:

// Jeito zoadofunctiongetOAuthProvider(string$providerId){switch($providerId){case0:return'twitch';case1:return'discord';case2:return'twitter';case3:return'google';case4:return'facebook';}}// Jeito simplesfunctiongetOAuthProvider(string$providerId){$providers=['twitch','discord','twitter','google','facebook'];return$providers[$providerId];}
Enter fullscreen modeExit fullscreen mode

Adicionar um switch case num bloco de código que era só retornar um array não parece engenharia demais? Sempre que você ver algo extremamente complexo, ou ficando grande, tente refatorar pra ficar o mais simples possível.

Gostou desse post? Clica no coraçãozinho e me siga nas redes sociais!

Top comments(8)

Subscribe
pic
Create template

Templates let you quickly answer FAQs or store snippets for re-use.

Dismiss
CollapseExpand
 
mdouglaslopes profile image
Michael Douglas
Musician since age 14. Now I'm entering this world of programming.
  • Location
    Rio Grande do Sul
  • Joined

Com esses exemplos ficou muito fácil abstrair. Massa demais!

CollapseExpand
 
jessilyneh profile image
Jessilyneh
Arq. de Software | ela/a Ultimamente não estou conseguindo tempo para escrever artigos novos mas, saibam que estou bem e não tenho novidades.
  • Location
    São Paulo
  • Pronouns
    Ela/a
  • Work
    Solutions Architect
  • Joined

excelentes dicas!!!

CollapseExpand
 
rodrigobsimon profile image
Rodrigo Simon
..
  • Location
    Brazil
  • Work
    Automation Developer
  • Joined

Mandou bem!

CollapseExpand
 
osnibjunior profile image
Osni B. Junior
  • Work
    SRE & Platform Engineer | Observability | DevOps Advocate
  • Joined

Parabéns 👏👏👏👏

CollapseExpand
 
viniciusgabrielfo profile image
Vinicius Gabriel
  • Work
    Software Engineer at Firstbase
  • Joined

Massa, sempre bom relembrar conceito importantes e a linguagem do post ficou bem clara!

CollapseExpand
 
figmateus profile image
Mateus Figueredo
  • Joined

excelente post vou aplicar em meu código a partir de agora.

CollapseExpand
 
dellamora profile image
Francielle Dellamora
Hi, Im Fran (: I will be writing about my experiences, challenges and some programming tips.
  • Location
    Porto Alegre, Brasil
  • Joined

ficou muito bom!! Conceitos básicos que muitas vezes a maioria nem procura saber sobre e que faz muita diferença profissionalmente

CollapseExpand
 
xossy profile image
Xossy
  • Education
    analysis and systems development
  • Work
    developer
  • Joined

Me ensinou conceitos que nenhum curso que eu fiz até hoje me ensinou! parabéns Daniel.

Some comments have been hidden by the post's author -find out more

Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment'spermalink.

For further actions, you may consider blocking this person and/orreporting abuse

A Developer who likes to teach.
  • Location
    São Paulo
  • Education
    Stackoverflow Researcher
  • Pronouns
    he/him
  • Work
    Developer Advocate
  • Joined

More fromDaniel Reis

DEV Community

We're a place where coders share, stay up-to-date and grow their careers.

Log in Create account

[8]ページ先頭

©2009-2025 Movatter.jp