<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: welingtoncassis</title>
    <description>The latest articles on DEV Community by welingtoncassis (@welingtoncassis).</description>
    <link>https://dev.to/welingtoncassis</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F633168%2F15c81ea3-9931-4198-8eb1-1134c1f39be4.jpg</url>
      <title>DEV Community: welingtoncassis</title>
      <link>https://dev.to/welingtoncassis</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/welingtoncassis"/>
    <language>en</language>
    <item>
      <title>Herança em JavaScript com prototype e function</title>
      <dc:creator>welingtoncassis</dc:creator>
      <pubDate>Thu, 21 Jul 2022 22:17:05 +0000</pubDate>
      <link>https://dev.to/welingtoncassis/heranca-em-javascript-com-prototype-e-function-35lf</link>
      <guid>https://dev.to/welingtoncassis/heranca-em-javascript-com-prototype-e-function-35lf</guid>
      <description>&lt;p&gt;Herança de objetos é um princípio de orientação a objetos e fornece a habilidade de acessar métodos e propriedades de outro objeto (pai) a partir de um objeto derivado (filho). Herança em javascript é possível através do &lt;strong&gt;prototype&lt;/strong&gt; ou seja &lt;strong&gt;herança de protótipo&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;O javascript disponibiliza a palavra chave &lt;strong&gt;class&lt;/strong&gt; - a &lt;strong&gt;palavra-chave class&lt;/strong&gt; foi introduzida no &lt;strong&gt;ES2015&lt;/strong&gt;, mas é &lt;strong&gt;syntax sugar&lt;/strong&gt;, o JavaScript permanece baseado em &lt;strong&gt;prototype&lt;/strong&gt; - para declarar classes e extends para fazer herança. Nesse post irei usar a abordagem &lt;strong&gt;function&lt;/strong&gt; e &lt;strong&gt;prototype&lt;/strong&gt; para detalhar o processo de herança e prototype chain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prototype chain(Processo de pesquisa nos prototype)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No javascript quando vamos acessar uma propriedade de um objeto o motor do javascript vai &lt;strong&gt;verificar se existe essa propriedade no objeto&lt;/strong&gt; e caso não encontre i*&lt;em&gt;rá procurar no prototype do objeto&lt;/em&gt;* e se também não encontrar &lt;strong&gt;irá procurar no prototype do prototype&lt;/strong&gt; e assim por diante passando por todas as instâncias que foram herdadas &lt;strong&gt;até chegar ao último prototype&lt;/strong&gt;. Caso não encontre o JS irá retornar &lt;strong&gt;undefined&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para acessar as informações do prototype utilizamos &lt;code&gt;__proto__&lt;/code&gt; e com ele podemos acessar informações de outros prototypes acima (mais genéricos).&lt;/p&gt;

&lt;p&gt;Vejamos o seguinte exemplo onde temos três objetos em que a classe mais baixa &lt;strong&gt;Diretor&lt;/strong&gt; herda características de &lt;strong&gt;Professor&lt;/strong&gt; e &lt;strong&gt;Funcionário&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Funcionario&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="nx"&gt;Funcionario&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;salario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;R$ 10000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Professor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="nx"&gt;Professor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Funcionario&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;Professor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;horaExtra&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;R$ 500&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Diretor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="nx"&gt;Diretor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Professor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;Diretor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bonus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;R$ 2000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos inicializar o objeto Diretor e acessar o método salario() que foi herdado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;diretor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Diretor&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;diretor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;salario&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;//output =&amp;gt; 'R$ 10000'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso foi possível porque quando chamamos o método salario() o motor do javascript verificou se esse método existia no prototype de Diretor e como não encontrou foi "subindo" passando de prototype em prototype até encontar o método no prototype de Funcionario.&lt;/p&gt;

&lt;p&gt;Utilize &lt;code&gt;__proto__&lt;/code&gt; e veja a cadeia de prototype (prototype chain) através instância mais baixa que é Diretor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;diretor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__proto__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;//output =&amp;gt; prototype Diretor&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;diretor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__proto__&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__proto__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;//output =&amp;gt; prototype Professor&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;diretor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__proto__&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__proto__&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__proto__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;//output =&amp;gt; prototype Funcionario&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;É muito importante entender bem  "herança de protótipo" no javascript para escrever códigos complexos. Evite que sua cadeia de protótipos seja grande e quebre a cadeia caso necessário para evitar problemas de performance.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>O poder das expressões regulares em Python</title>
      <dc:creator>welingtoncassis</dc:creator>
      <pubDate>Thu, 17 Mar 2022 23:26:58 +0000</pubDate>
      <link>https://dev.to/welingtoncassis/o-poder-das-expressoes-regulares-em-python-2fdg</link>
      <guid>https://dev.to/welingtoncassis/o-poder-das-expressoes-regulares-em-python-2fdg</guid>
      <description>&lt;p&gt;​​Expressões Regulares são padrões de caracteres que associam sequências de caracteres no texto e são essencialmente uma mini linguagem de programação altamente especializada que podem ser usadas para validar formato de email, senhas, cep, adicionar ou remover partes de uma string, etc. As ​​Expressões Regulares estão incluídas dentro do Python e disponíveis através do módulo ‘&lt;a href="https://docs.python.org/pt-br/3/library/re.html#module-re"&gt;re&lt;/a&gt;’.&lt;/p&gt;

&lt;p&gt;Neste tutorial irei criar uma simples extração do cep contido em uma string.&lt;/p&gt;

&lt;p&gt;Primeiro vamos importar o módulo re:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import re
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos assumir que a variável endereço tem o seguinte valor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;endereco = "Avenida Nossa Senhora de Copacabana 558, Copacabana, Rio de Janeiro, RJ, 22020-001"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eu quero extrair desta string que está na variável o CEP. Nós sabemos que o CEP é composto pelo seguinte padrão: &lt;code&gt;5 dígitos + hífen + 3 dígitos&lt;/code&gt;. Com isso vamos compilar esse padrão utilizando &lt;code&gt;compile()&lt;/code&gt; do módulo re.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;padrao = re.compile('[0123456789][0123456789][0123456789][0123456789][0123456789][-]?[0123456789][0123456789][0123456789]')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O sinal de &lt;code&gt;?&lt;/code&gt; indica que o caracter &lt;code&gt;-&lt;/code&gt; é opcional.&lt;/p&gt;

&lt;p&gt;Com o padrão compilado agora podemos verificar se em algum trecho da string existe um combina com o nosso padrão e vamos utilizar o método &lt;code&gt;search()&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;busca = padrao.search(endereco)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em caso de sucesso &lt;code&gt;search()&lt;/code&gt; retorna o objeto &lt;code&gt;Match&lt;/code&gt; ou caso não há nenhuma ocorrência do nosso padrão na string retorna &lt;code&gt;None&lt;/code&gt;. Sendo assim, vamos verificar e extrair string encontrada em nosso padrão compilado que neste caso será a informação do CEP.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if busca:
    cep = busca.group()
    print(cep)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma maneira mais simples e elegante de compilar este mesmo padrão para extrair o CEP pode ser escrita assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;re.compile('[0-9]{5}[-]{0,1}[0-9]{3}')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Onde colocamos entre &lt;code&gt;-&lt;/code&gt; o intervalo, entre &lt;code&gt;{}&lt;/code&gt; a quantidade ou limites como no caso do hífen.&lt;/p&gt;

&lt;p&gt;As Regex pode desempenhar um papel importante na fase de pré-processamento de dados. A biblioteca ‘&lt;a href="https://docs.python.org/pt-br/3/library/re.html#module-re"&gt;re&lt;/a&gt;’ fornece várias funções que a tornam uma habilidade que vale a pena dominar. Deixarei aqui alguns links que podem ajudar nesse aprendizado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.python.org/pt-br/3/howto/regex.html#regex-howto"&gt;https://docs.python.org/pt-br/3/howto/regex.html#regex-howto&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.python.org/pt-br/3/library/re.html#module-re"&gt;https://docs.python.org/pt-br/3/library/re.html#module-re&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>beginners</category>
      <category>regex</category>
      <category>programming</category>
    </item>
    <item>
      <title>Boas práticas no desenho de APIs - 11 Dicas úteis</title>
      <dc:creator>welingtoncassis</dc:creator>
      <pubDate>Fri, 21 Jan 2022 20:11:59 +0000</pubDate>
      <link>https://dev.to/welingtoncassis/boas-praticas-no-desenho-de-apis-11-dicas-uteis-2f78</link>
      <guid>https://dev.to/welingtoncassis/boas-praticas-no-desenho-de-apis-11-dicas-uteis-2f78</guid>
      <description>&lt;h2&gt;
  
  
  1 - Organize APIs ao longo de recursos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Não usar verbos no nome da URI e sim substantivos que são os dados aos quais a API fornece acesso&lt;/li&gt;
&lt;li&gt;Ex: GET /v1/public/stories, GET /v1/public/stories/{storyId}/series, GET /v1/public/series&lt;/li&gt;
&lt;li&gt;Link de api de exemplo &lt;a href="https://developer.marvel.com/docs"&gt;https://developer.marvel.com/docs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2 - Padronização da Api
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Usar prefixo de versão /v1, /v2&lt;/li&gt;
&lt;li&gt;Usar prefixo de exposição /public, /private&lt;/li&gt;
&lt;li&gt;Usar recursos no plural /events&lt;/li&gt;
&lt;li&gt;Ex de uri: &lt;a href="https://gateway.marvel.com:443/v1/public/events"&gt;https://gateway.marvel.com:443/v1/public/events&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3 - Evitar Api anêmicas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pensar no negócio&lt;/li&gt;
&lt;li&gt;Os endpoints devem refletir as Regras de negócio e não a base dados&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4 - Criar Api simples
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Evitar criar URIs grandes&lt;/li&gt;
&lt;li&gt;O ideal é utilizar 3 níveis: coleção/item/coleção&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5 - Considerar a atualização em lotes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Evitar que o Cliente tenha que fazer um loop e chamar várias vezes o endpoint para poder atualizar mais de um recurso&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6 - Se precisar receber datas e horas utilize o padrão ISO 8601
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://api.com/%7Btimestamp%7D"&gt;https://api.com/{timestamp}&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://api.com/YYYYMMDDThhmmssZ"&gt;https://api.com/YYYYMMDDThhmmssZ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://api.com/1937-01-01T12:00:27.87+00:20"&gt;https://api.com/1937-01-01T12:00:27.87+00:20&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7 - Documente sua API
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A maioria dos devs irão verificar as docs antes de tentar qualquer esforço de interação&lt;/li&gt;
&lt;li&gt;Ex de ferrameta: Swagger&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8 - Sempre use HTTPS/SSL
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pense sempre em segurança&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  9 Versione suas APIs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ex: &lt;a href="https://api.com/v1/aulas"&gt;https://api.com/v1/aulas&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Considere o versionamento da sua API necessário toda vez que uma mudança resultar em breaking changes do lado do cliente.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  10 - Crie e use paginação
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Facilita a utilização educada do servidor&lt;/li&gt;
&lt;li&gt;Usar limit e offset&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  11 - Utilize corretamente os códigos de retorno HTTP
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Se está implementando um GET e foi bem-sucedido o retorno deve ser status code 200&lt;/li&gt;
&lt;li&gt;Link com informações sobre status code &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Status"&gt;https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Status&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Referências:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api"&gt;https://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api&lt;/a&gt;&lt;br&gt;
&lt;a href="https://martinfowler.com/articles/richardsonMaturityModel.html_"&gt;https://martinfowler.com/articles/richardsonMaturityModel.html_&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rest</category>
      <category>api</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Comparando objetos no Python</title>
      <dc:creator>welingtoncassis</dc:creator>
      <pubDate>Fri, 21 Jan 2022 19:23:30 +0000</pubDate>
      <link>https://dev.to/welingtoncassis/comparando-objetos-no-python-54a7</link>
      <guid>https://dev.to/welingtoncassis/comparando-objetos-no-python-54a7</guid>
      <description>&lt;p&gt;Por padrão os tipos primitivos (inteiro, string ...) no Python já têm implementado nativamente suas próprias maneiras de se comparar e no caso do inteiro e da string o que se compara são seus valores. Porém, ao tentar comparar objetos de classes criadas em nosso código utilizando o operador &lt;code&gt;==&lt;/code&gt; ele não funciona como queremos. Isso porque o Python não sabe como deve comparar os objetos de tipo que declaramos no código quando utilizamos o operador &lt;code&gt;==&lt;/code&gt; .&lt;/p&gt;

&lt;p&gt;Suponha que temos em nosso código duas instâncias da classe Produto e queremos verificar se elas são iguais.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oDg8_RIU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y6zlr5hd56c1r81tgc4d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oDg8_RIU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y6zlr5hd56c1r81tgc4d.png" alt="Classe Produto" width="750" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao usarmos &lt;code&gt;==&lt;/code&gt; o retorno será &lt;code&gt;False&lt;/code&gt; pois ele irá checar se as varáveis em comparação apontam para o mesmo objeto na memória. &lt;/p&gt;

&lt;h3&gt;
  
  
  Rich comparison
&lt;/h3&gt;

&lt;p&gt;No Python temos como implementar algo similar ao &lt;code&gt;equals()&lt;/code&gt; do Java, utilizando rich comparison podemos definir os seguintes métodos de comparação em uma classe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;__eq__()&lt;/code&gt;, chamado pelo operador &lt;code&gt;==&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;__ne__()&lt;/code&gt;, chamado pelo operador &lt;code&gt;!=&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;__gt__()&lt;/code&gt;, chamado pelo operador &lt;code&gt;&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;__lt__()&lt;/code&gt;, chamado pelo operador &lt;code&gt;&amp;lt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;__ge__()&lt;/code&gt;, chamado pelo operador &lt;code&gt;&amp;gt;=&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;__le__()&lt;/code&gt;, chamado pelo operador &lt;code&gt;&amp;lt;=&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para resolvermos nosso problema de comparação iremos utilizar o método &lt;code&gt;__eq__()&lt;/code&gt;. Vamos utilizar a propriedade 'nome' da classe para fazer a comparação.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ATuLGjOE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nur603bxxibd09dydi6m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ATuLGjOE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nur603bxxibd09dydi6m.png" alt="Classe Produto com __eq__()" width="800" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora ao usarmos &lt;code&gt;==&lt;/code&gt; o retorno será &lt;code&gt;True&lt;/code&gt; e não teremos problemas com comparações entre objetos que nós mesmos implementamos no Python!&lt;/p&gt;

</description>
      <category>python</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
