<?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>Forem: Arthur Barboza</title>
    <description>The latest articles on Forem by Arthur Barboza (@devarthurbarboza).</description>
    <link>https://forem.com/devarthurbarboza</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%2F3222744%2Fc02dfde8-50ec-4a65-ad73-541612a446ce.png</url>
      <title>Forem: Arthur Barboza</title>
      <link>https://forem.com/devarthurbarboza</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/devarthurbarboza"/>
    <language>en</language>
    <item>
      <title>Cronjob</title>
      <dc:creator>Arthur Barboza</dc:creator>
      <pubDate>Tue, 24 Jun 2025 02:06:58 +0000</pubDate>
      <link>https://forem.com/devarthurbarboza/cronjob-2408</link>
      <guid>https://forem.com/devarthurbarboza/cronjob-2408</guid>
      <description>&lt;p&gt;Atualmente muitos sistemas comerciais fazem uso de funcionalidades e recursos de forma repetitiva, até mesmo com alguns recursos que passam a se tornar procedimentos rotineiros e comuns.&lt;/p&gt;

&lt;p&gt;A Cron é uma ferramenta presente em vários sistemas e permite realizar o agendamento de tarefas (cronjob) e execução de scripts de forma automática.&lt;/p&gt;

&lt;p&gt;A mesma pode ser utilizada para processamento de informações em lote, pois também pode ser executada de forma assíncrona.&lt;/p&gt;

&lt;p&gt;Presente até mesmo em sistemas operacionais Unix, o formato "cron" serve para descrever o intervalo em que determinada cronjob deve ser executada podendo ser descrito conforme imagem abaixo &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ipa8ix6fzfmhut8vnq4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ipa8ix6fzfmhut8vnq4.png" alt="Image description" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O registro de tarefas é feito através da Crontab, um &lt;em&gt;deamon&lt;/em&gt; do sistema operacional que possibilita a criação e agendamento de tarefas.&lt;/p&gt;

&lt;p&gt;Tarefas agendadas serão executadas a menos que ocorra algum imprevisto, como por exemplo uma outra tarefa estava em execução naquele momento, sendo então necessário que a tarefa não executada seja reconfigurada na Cron a fim de executar a tarefa em outro momento.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Filas e Mensagens Assíncronas</title>
      <dc:creator>Arthur Barboza</dc:creator>
      <pubDate>Tue, 24 Jun 2025 00:52:31 +0000</pubDate>
      <link>https://forem.com/devarthurbarboza/filas-e-mensagens-assincronas-3cim</link>
      <guid>https://forem.com/devarthurbarboza/filas-e-mensagens-assincronas-3cim</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Um dos maiores progressos no desenvolvimento de software moderno, se trata da utilização de fila no processamento assíncrono de informação. Softwares modernos que fazem uso de dados em grande quantidade ou mesmo informações que não se encontram disponíveis naquele instante, são cenários os quais a implementação de uma fila de mensagens assíncronas é o ideal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fila na Estrutura de Dados
&lt;/h2&gt;

&lt;p&gt;A fila é uma estrutura de dados tradicional e bem conhecida tanto na literatura acadêmica quanto no mercado de trabalho, sendo utilizada em inúmeras aplicações. Alguns exemplos são sistemas para registro de pedidos, gerenciadores de tarefas do sistema operacional, sistemas de registro de entrada de trabalho, entre outros.&lt;/p&gt;

&lt;p&gt;A fila consiste em uma estrutura a qual uma sequência de elementos é processada de forma que cada elemento adicionado, entrará no final da sequência, após todos os elementos anteriores, este será processado antes dos elementos seguintes. Os elementos seguem uma ordem clara e preditiva, como uma fila para entrada de um cinema.&lt;/p&gt;

&lt;p&gt;A Fila também pode ser descrita como uma estrutura First In First Out (FIFO), resumindo o comportamento sequencial dos seus elementos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqsak2sw7hlg0m3gigaiw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqsak2sw7hlg0m3gigaiw.png" alt="Image description" width="740" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na fila da imagem acima, o elemento 1 é adicionado anteriormente ao elemento 2, e justamente por isso ele é processado e removido antes do elemento 2.&lt;/p&gt;

&lt;p&gt;Uma estrutura de fila apresentará essencialmente as seguintes operações (podendo ser adicionado outras conforme a necessidade do sistema) :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enqueue : Adicionar o elemento que se encontrará no final da fila&lt;/li&gt;
&lt;li&gt;Dequeue : Remover o elemento que se encontra no começo da fila&lt;/li&gt;
&lt;li&gt;isEmpty : Verifica se a fila está vazia&lt;/li&gt;
&lt;li&gt;Peek : Obtém o último valor da fila sem removê-lo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As informações dos elementos serão tratadas e controladas através dos índices "FRONT" e "REAR", representando respectivamente a posição do elemento no começo da fila e a posição do elemento no final da fila.&lt;/p&gt;

&lt;p&gt;Exemplo de implementação de fila :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Queue&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$front&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$rear&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;rear&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;rear&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$item&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;dequeue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UnderflowException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Queue is empty. Cannot dequeue."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nv"&gt;$item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;front&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="k"&gt;unset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;front&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;front&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Optional: compact the array when queue is empty&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;resetPointers&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$item&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;peek&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UnderflowException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Queue is empty."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;front&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;front&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;rear&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;rear&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;front&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Reset pointers when queue becomes empty&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;resetPointers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;front&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;rear&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;array_slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;front&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Example usage:&lt;/span&gt;
&lt;span class="nv"&gt;$q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Apple"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Banana"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Cherry"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Front item: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;peek&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="kc"&gt;PHP_EOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Dequeued: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;dequeue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="kc"&gt;PHP_EOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"New front: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;peek&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="kc"&gt;PHP_EOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;display&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A complexidade da implementação de uma fila pode aumentar conforme a regra de negócio, sendo necessário implementar também uma de suas variações.&lt;/p&gt;

&lt;p&gt;Algumas são : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fila Circular&lt;/li&gt;
&lt;li&gt;Fila de Prioridade&lt;/li&gt;
&lt;li&gt;Fila Duplamente Terminada&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em aplicações reais, estruturas de fila são utilizadas através de "consumidores" e "publicadores", os quais são classes ou mesmo estruturas desenvolvidas conforme necessidade da aplicação que estará se comunicando com a fila.&lt;/p&gt;

&lt;p&gt;As publicadoras se tratam de componentes que irão enviar para a fila algum elemento ou informação para ser processado, enquanto as consumidoras são componentes que irão consumir os dados após seu processamento, removendo os mesmos da fila.&lt;/p&gt;

&lt;p&gt;Este processo ocorre de forma assíncrona, permitindo que as publicadoras e consumidoras sejam independentes, sem ocorrer uma comunicação direta e sem haver a necessidade de ambas estarem disponíveis no mesmo instante.&lt;/p&gt;

&lt;p&gt;Por este motivo, é comum que as filas sejam implementadas de forma assíncrona para permitir o processamento de grande quantidade de dados ou até mesmo processamento de informações envolvendo a integração com sistemas externos.&lt;/p&gt;

&lt;p&gt;Exemplos : envio de e-mail, gerar relatórios, exportar dados do banco e muitas outras situações.&lt;/p&gt;

&lt;p&gt;Nesses casos é comumente utilizado softwares específicos para a implementação destes componentes, denominados mensageria.&lt;br&gt;
Alguns exemplos são RabbitMQ, Kafka e muitos outros. &lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>SOLID - Guia Completo</title>
      <dc:creator>Arthur Barboza</dc:creator>
      <pubDate>Tue, 17 Jun 2025 03:06:45 +0000</pubDate>
      <link>https://forem.com/devarthurbarboza/solid-guia-completo-doe</link>
      <guid>https://forem.com/devarthurbarboza/solid-guia-completo-doe</guid>
      <description>&lt;p&gt;SOLID é um acrônimo para descrever alguns dos princípios apresentados por Robert C Martin (também conhecido como Uncle Bob) para sistemas desenvolvidos através do paradigma orientado a objetos (POO). &lt;/p&gt;

&lt;p&gt;Tais princípios formam a base para um código bem estruturado, o qual permitiria uma manutenção mais fácil e facilitaria o desenvolvimento de novas funcionalidades e sua refatoração.&lt;/p&gt;

&lt;p&gt;Estes princípios buscam apresentar como um desenvolvedor pode tirar um bom proveito dos recursos do POO, evitando o aumento da complexidade do sistema e promovendo a reusabilidade do código.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Single Responsability Principal
&lt;/h2&gt;

&lt;p&gt;O Princípio da Responsabilidade Única consiste em atribuir apenas uma responsabilidade para uma classe, promovendo maior segmentação do sistema e facilidade para identificar a localização de determinado trecho de código. Além do mais, concentrar muito código em uma classe resulta em um código extremamente acoplado e dependente, dificultando a manutenção e aumentando a possibilidade de introduzir bugs.&lt;/p&gt;

&lt;p&gt;Tal cenário também dificulta o planejamento e desenvolvimento de testes para o sistema.&lt;/p&gt;

&lt;p&gt;Um software que não está de acordo com este princípio, apresenta em seu código fonte uma ou mais "&lt;a href="https://linearb.io/blog/what-is-a-god-class" rel="noopener noreferrer"&gt;God Classes&lt;/a&gt;", a qual se trata de um anti-pattern que descreve uma classe com inúmeras responsabilidades.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open-Closed Principle
&lt;/h2&gt;

&lt;p&gt;O Princípio Aberto-Fechado consiste em descrever um código que esteja Aberto para extensões e fechado para alterações. Em outras palavras, para o desenvolvimento de novas funcionalidades, devemos sempre incrementar através de novas classes, e não alterar as superclasses.&lt;/p&gt;

&lt;p&gt;Isso implica em um software com um nível de abstração bem estruturado e capaz de utilizar de forma eficiente os recursos de OOP tais como : herança, interfaces, polimorfismo e encapsulamento.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="c1"&gt;// Classe original alterada. Não segue o princípio&lt;/span&gt;

&lt;span class="c1"&gt;// Antes&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Empregado&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$salario&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;calcularSalario&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;salario&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Depois&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Empregado&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$salario&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$comissao&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;calcularSalario&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$vendas&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;salario&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;comissao&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$vendas&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="c1"&gt;// Classe original preservada e extendida, está seguindo o princípio&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Empregado&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$salario&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;calcularSalario&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;salario&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmpregadoComissionado&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Empregado&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$comissao&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;calcularSalarioComComissao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$vendas&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;calcularSalario&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;comissao&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$vendas&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Neste caso, além de facilitar a manutenção, o método original está sendo preservado e não sofre alterações diretas &lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Liskov Substitution Principle
&lt;/h2&gt;

&lt;p&gt;O princípio da substituição de Liskov, implica que uma classe A a qual possui como subclasse a classe B, pode ser "substituída" pela classe B. Em outras palavras : uma subclasse deve ser compatível com os casos de uso da superclasse.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Empregado&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$salario&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$vendas&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;calcularSalario&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;salario&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmpregadoComissionado&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Empregado&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$comissao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;calcularSalario&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;calcularSalario&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;comissao&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;vendas&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getEmpregadoSalario&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Empregado&lt;/span&gt; &lt;span class="nv"&gt;$empregado&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$empregado&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;calcularSalario&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="nv"&gt;$empregado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Empregado&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$empregadoComissionado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EmpregadoComissionado&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nf"&gt;getEmpregadoSalario&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$empregado&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nf"&gt;getEmpregadoSalario&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$empregadoComissionado&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Nesse caso acima, a classe EmpregadoComissionado herda de Empregado, e o uso de Empregado pode ser substituído por EmpregadoComissionado.&lt;/p&gt;

&lt;p&gt;O princípio implica em inúmeros fatores, tais como visibilidade e assinatura de métodos, lançamento e tratativa de exceções, retornar valores de tipos diferentes de dados. Todos estes devem ser tratados para que o desenvolvedor garanta a conformidade com o princípio.&lt;/p&gt;

&lt;p&gt;Este princípio garante a integridade do sistema e diminuí a possibilidade de surgir novos bugs inesperados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interface Segregation Principle
&lt;/h2&gt;

&lt;p&gt;O Princípio da Segregação de Interface implica que uma classe não deve implementar uma interface a qual apresenta métodos que não serão utilizados.&lt;/p&gt;

&lt;p&gt;Diferente do que por vezes ocorre, implementar uma interface e apenas apresentar a assinatura seguido pelo corpo vazio de alguns de seus métodos, não é o ideal e deve ser evitado ao máximo.&lt;/p&gt;

&lt;p&gt;Para garantir que este erro não ocorra, é necessário que o desenvolvedor implemente interfaces mais específicas segmentando melhor cada comportamento para cada caso de uso e regra de negócio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dependency Inversion Principle
&lt;/h2&gt;

&lt;p&gt;O princípio da inversão de dependência consiste em passar objetos externos como parâmetros para uma classe a qual dependa deles, através de uma abstração, evitando que a classe dependente mantenha alto acoplamento com relação à este objeto.&lt;/p&gt;

&lt;p&gt;Suponha que eu tenha a classe Pedido e essa classe instancia a classe CartaoDeCredito no interior de um dos seus métodos, o ideal seria que a classe Pedido recebesse uma instância de uma abstração MeioDePagamento permitindo que Pedido não tenha uma dependência restrita a CartaoDeCredito.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="c1"&gt;// Errado, não está seguindo o princípio de inversão de dependência&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CartaoDeCredito&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;pagar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;pagar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'endpoint_do_gateway_de_pagamento'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pedido&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;fecharPedido&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$cartaoDeCredito&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CartaoDeCredito&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nv"&gt;$cartaoDeCredito&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;pagar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="c1"&gt;// Correto, agora está em conformidade com o princípio&lt;/span&gt;

&lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MeioDePagamento&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;pagar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CartaoDeCredito&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;MeioDePagamento&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;pagar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;pagar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'endpoint_do_gateway_de_pagamento'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pedido&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$meioDePagamento&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;MeioDePagamento&lt;/span&gt; &lt;span class="nv"&gt;$meioDePagamento&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;meioDePagamento&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$meioDePagamento&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;fecharPedido&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;meioDePagamento&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;pagar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Isso promove a independência da classe Pedido, uma vez que é possível utilizar qualquer instância da abstração MeioDePagamento, também facilitando o desenvolvimento de novas funcionalidades. A classe Pedido mantem contato apenas com uma abstração, e não possui responsabilidades ou mesmo conhecimento sobre detalhes de implementação.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>backend</category>
    </item>
    <item>
      <title>Boas Práticas Para Uma Arquitetura Eficiente</title>
      <dc:creator>Arthur Barboza</dc:creator>
      <pubDate>Mon, 16 Jun 2025 15:34:02 +0000</pubDate>
      <link>https://forem.com/devarthurbarboza/boas-praticas-para-uma-arquitetura-eficiente-2nn8</link>
      <guid>https://forem.com/devarthurbarboza/boas-praticas-para-uma-arquitetura-eficiente-2nn8</guid>
      <description>&lt;p&gt;Ao lidarmos com o desenvolvimento de softwares de grande porte e inúmeras regras de negócio, muito provavelmente estaremos lidando com camadas complexas e muitos fluxos de execução, este que deve ser bem arquitetado e planejado pelo desenvolvedor.&lt;/p&gt;

&lt;p&gt;Para que o mesmo possa desenvolver uma arquitetura eficiente e com um código sólido, o desenvolver pode fazer uso de boas práticas para obter um código mais legível e bem manutenível.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fail Fast
&lt;/h2&gt;

&lt;p&gt;O conceito de Fail Fast (podemos traduzir como "falhar rápido") pode ser descrito como a prática de identificar e lidar imediatamente com problemas e erros em sua aplicação. Isso promove a estabilidade do software, uma vez que o mesmo não continuará sua execução com trechos e componentes instáveis.  &lt;/p&gt;

&lt;p&gt;O Fail Fast está em concordância com os princípios de Engenharia de Software pois o mesmo estimula a identificação e correção de bugs o mais cedo possível (tendo em vista que com o decorrer do crescimento do software, suas alterações e correções de bugs passam a ser mais caras) e promove um software mais legível e fácil de dar manutenção.&lt;/p&gt;

&lt;p&gt;Importante destacar que o Fail Fast não se trata exatamente de uma prática sólida, mas sim de um conceito o qual buscamos através de atividades as quais descreveremos algumas a seguir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Early Return
&lt;/h2&gt;

&lt;p&gt;O Early Return se trata de uma técnica de programação o qual o resultado esperado de uma função se encontra no final do seu corpo. Durante a execução da mesma é realizada várias validações para garantir que no caso de um fluxo falho (não desejado ou inesperado) a execução seja cancelada.&lt;/p&gt;

&lt;p&gt;Essa técnica promove maior legibilidade do código, além de diminuir a possibilidade de bugs e permite uma manutenção mais fácil.&lt;/p&gt;

&lt;p&gt;Veja o exemplo abaixo :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;fazerAlgo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;AlgumaInformacao&lt;/span&gt; &lt;span class="nv"&gt;$informacao&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;OutraInformacao&lt;/span&gt; &lt;span class="nv"&gt;$outra&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$informacao&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;temAlgumaCoisa&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$informacao&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;temOutraCoisa&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$outra&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;temSuaCoisa&lt;/span&gt;&lt;span class="p"&gt;()){&lt;/span&gt;

                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pode_fazer_uma_terceira_coisa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$informacao&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$outra&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'não pode fazer terceira coisa'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'não tem sua coisa'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; 
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NaoTemOutraCoisa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'talvez em outro momento...'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'não tem alguma coisa'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O código acima apresenta inúmeras condicionais e fluxos de execução, as quais dificultam a leitura do desenvolvedor e resulta em uma manutenção difícil.&lt;/p&gt;

&lt;p&gt;Interessante notarmos a existência de alguns "&lt;a href="https://medium.com/@christophnissle/anti-patterns-in-software-development-c51957867f27" rel="noopener noreferrer"&gt;anti-padrões&lt;/a&gt;": &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://wiki.c2.com/?ElseConsideredSmelly=" rel="noopener noreferrer"&gt;Else&lt;/a&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dificulta a manutenção pois o mesmo apresenta um fluxo de execução alternativo para quando a condição apresentar valor oposto ao fluxo normal.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Anti-padrão "Flecha" (ou "&lt;a href="https://wiki.c2.com/?ArrowAntiPattern=" rel="noopener noreferrer"&gt;Arrow&lt;/a&gt;"):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consiste na presença de inúmeras estruturas condicionais e/ou de repetição encadeadas, resultado no formato de flecha.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Estes problemas apresentados podem ser facilmente evitados caso o desenvolvedor aplicasse a técnica de "Early Return", a qual apenas invertendo os sinais de cada estrutura condicional, seria possível obter um resultado mais limpo e com um fluxo de execução mais claro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;fazerAlgo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;AlgumaInformacao&lt;/span&gt; &lt;span class="nv"&gt;$informacao&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;OutraInformacao&lt;/span&gt; &lt;span class="nv"&gt;$outra&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$informacao&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;temAlgumaCoisa&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'não tem alguma coisa'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$informacao&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;temOutraCoisa&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NaoTemOutraCoisa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'talvez em outro momento...'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$outra&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;temSuaCoisa&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'não tem sua coisa'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;pode_fazer_uma_terceira_coisa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$informacao&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$outra&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'não pode fazer terceira coisa'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;O "early return" nos proporciona as seguintes melhorias de código : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Código linear com apenas um nível de indentação, possibilitando uma leitura mais fácil&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O resultado esperado da função é fácil de encontrar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Promove um código mais fácil de testar.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  KISS (Keep It Simple, Stupid)
&lt;/h2&gt;

&lt;p&gt;O acrônimo significa "Mantenha Isso Simples, Estúpido" e seu conceito reforça a necessidade de mantermos as coisas simples, devido ao hábito de aumentar a complexidade buscando implementar algum design pattern ou conceito que por vezes é muito mais complexo do que de fato necessário.&lt;/p&gt;

&lt;p&gt;Este conceito nos lembra de atingir o mesmo objetivo mas por caminhos mais simples, reduzindo complexidades desnecessárias e esforços redundantes.&lt;/p&gt;

&lt;p&gt;Um bom exemplo seria um cenário em que um desenvolvedor pretende implementar um modelo de machine learning para resolver determinado problema, quando na realidade este problema poderia ser resolvido verificando algumas breves condições sem grande variabilidade de dados.&lt;/p&gt;

&lt;p&gt;Alguns pontos que o desenvolvedor pode se atentar para reduzir a complexidade seria : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Garantir que o nome de variáveis e de métodos transmitam corretamente seu propósito de acordo com o contexto inserido.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Escrever comentários dentro de métodos APENAS quando for necessário.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Garantir que suas classes tenham apenas uma responsabilidade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deletar classes, variáveis, métodos e quaisquer trechos de código que não esteja sendo utilizado.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A maior importância de aplicar o princípio KISS, é garantir que quando trabalhando em uma base de código já existente e compartilhada entre vários desenvolvedor, qualquer modificação seja fácil de ser compreendida e até mesmo alterada se necessário.&lt;/p&gt;

&lt;h2&gt;
  
  
  YAGNI (You Ain't Gonna Need It)
&lt;/h2&gt;

&lt;p&gt;O conceito traduzido "Você Não Vai Precisar Disso" segue o princípio KISS, reforçando a importância de manter simples tudo que for possível de manter simples.&lt;/p&gt;

&lt;p&gt;Este princípio consiste na prática de desenvolver apenas aquilo que for realmente necessário, desencorajando o hábito que muitos desenvolvedores praticam de desenvolver algo que acredita que será necessário no futuro.&lt;/p&gt;

&lt;p&gt;Isso porque alguns profissionais dedicam demasiado esforço em aplicar otimizações em cenários prematuros e desnecessários, ou mesmo alguma feature ou abstração a qual não se faz necessário atualmente, sendo que sua implementação no futuro pode também se tratar de uma incerteza.&lt;/p&gt;

&lt;p&gt;Além disso, essa implementação muito provavelmente acrescentaria maior complexidade no sistema, o que seria prejudicial para o cenário da aplicação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbrka5moj99oiyha4380.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbrka5moj99oiyha4380.png" alt="Image description" width="800" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  DRY (Don't Repeat Yourself)
&lt;/h2&gt;

&lt;p&gt;Com o paradigma funcional, o mercado se encontrou com uma das maiores revoluções e progressos na área de desenvolvimento de software : as funções e procedimentos. Ambos representavam um ganho de velocidade muito grande no desenvolvimento do software, pois fornecia ao desenvolvedor recursos suficientes para que o mesmo replicasse trechos de código conforme sua necessidade, aumentando a eficiência do desenvolvimento e também facilitando a manutenção do mesmo. &lt;br&gt;
A Orientação à Objetos foi outro grande passo dado nessa direção, através de classes, métodos e atributos, era possível que os desenvolvedores reutilizassem e encapsulassem funções de acordo com seu contexto.&lt;/p&gt;

&lt;p&gt;No entanto, mesmo que os desenvolvedores tenham em mãos tais recursos, é comum que ocorra a implementação de códigos e linhas repetidas em um sistema, aumentando a complexidade do mesmo e dificultando em sua manutenção.&lt;/p&gt;

&lt;p&gt;O princípio DRY afirma que uma lógica particular do sistema deve aparecer apenas uma única vez ao longo do código fonte, sendo reutilizado através dos recursos descritos anteriormente.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PHPDeveloper&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;saudacoes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Olá ! Sou um desenvolvedor!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Eu programo em PHP!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JavaDeveloper&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;saudacoes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Olá ! Sou um desenvolvedor!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Eu programo em Java!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste caso, podemos fazer uso da &lt;a href="https://sae.unb.br/cae/conteudo/unbfga/oo/new_heranca.html" rel="noopener noreferrer"&gt;Herança&lt;/a&gt; de Orientação a Objetos, e remover o trecho &lt;code&gt;echo 'Olá ! Sou um desenvolvedor!'&lt;/code&gt; de ambas as classes e abstrair para uma classe pai, removendo código duplicado e promovendo a manutenção e legibilidade do sistema.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Developer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;saudacoes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Olá ! Sou um desenvolvedor!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JavaDeveloper&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Developer&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;saudacoes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;saudacoes&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Eu programo em Java!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PHPDeveloper&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Developer&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;saudacoes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;saudacoes&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Eu programo em PHP!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Porém, é extremamente importante que o desenvolvedor se atente em não aplicar o princípio DRY enquanto não houver código duplicado no sistema, pois o mesmo pode buscar realizar uma abstração mesmo não havendo necessidade (vide princípio KISS e YAGNI).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6nyjzdi5fi9nn7x5el9p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6nyjzdi5fi9nn7x5el9p.png" alt="Image description" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Os princípios citados acima, descrevem boas práticas as quais foram estudadas e desenvolvidas por profissionais e pesquisadores ao longo dos anos.&lt;/p&gt;

&lt;p&gt;Tais práticas promovem uma arquitetura eficiente e um código fácil de trabalhar.&lt;/p&gt;

&lt;p&gt;No entanto, os profissionais que forem aplicas estes princípios, devem aplicar com sabedoria e cuidado, pois a má interpretação de um princípio pode resultar em conflito com outros, como consequência o código é prejudicado e afetado, dificultando sua manutenção.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>development</category>
      <category>productivity</category>
    </item>
    <item>
      <title>PHP PSR-12 - Resumo</title>
      <dc:creator>Arthur Barboza</dc:creator>
      <pubDate>Thu, 05 Jun 2025 15:38:01 +0000</pubDate>
      <link>https://forem.com/devarthurbarboza/psr-12-resumo-4mm7</link>
      <guid>https://forem.com/devarthurbarboza/psr-12-resumo-4mm7</guid>
      <description>&lt;p&gt;O PSR-12 faz parte do PHP Starndard Recommendations e tem o intuito de reduzir fricções no desenvolvimento de software quando um sistema envolve vários desenvolvedores. Isso é feito a partir da apresentação de várias regras e expectativas sobre como um código PHP deve ser formatado, além de proporcionar o desenvolvimento de ferramentas as quais podem revisar e validar se o código se encontra conforme esperado.&lt;/p&gt;

&lt;p&gt;Essa PSR substitui o PSR-2, apresentando recomendações sobre contextos e funcionalidades mais modernas (tendo em vista que o PSR-2 foi apresentado em 2012, um contexto mais antigo).&lt;/p&gt;

&lt;h2&gt;
  
  
  Geral
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Padronização de Código Básico
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Código deve se encontrar conforme especificidades da PSR-1&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Termo 'StudlyCaps' deve ser interpretado como 'PascalCase'&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Arquivos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Todos os arquivos PHP devem terminar com exatamente uma linha vazia (caractere \n, padrão Unix LF), precedida por uma linha não vazia com código ou comentário.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A tag PHP de fechamento "?&amp;gt;" deve ser omitida em arquivos que contenham apenas código PHP&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Linhas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Não deve existir um limite rigoso (ou obrigatório) para o comprimento de uma linha.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Um limite tolerável (mas que em situações adequadas pode ser desconsiderado) deve ser de 120 caracteres.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As linhas não deveriam ser maiores que 80 caracteres, linhas maiores deveriam ser separadas em múltiplas linhas subsequentes de não mais do que 80 linhas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não deve existir um espaço vazio no final de uma linha. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Linhas vazias podem ser adicionadas para para melhorar a legibilidade e indicar blocos relacionados de código&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não devem existir mais do que um "statement" por linha.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Indentação
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Código deve seguir indentação de 4 espaços para cada nível, não deve utilizar "tabs"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Palavras Reservadas e Tipagem
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Todas as palavras reservadas e tipagem devem estar em lowercase (quaisquer novas palavras reservadas adicionadas no futuro, devem seguir essa convenção)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Abreviações devem ser utilizadas ("bool" ao invés de "boolean" e etc)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Declaração, Namespace, Import e outros
&lt;/h2&gt;

&lt;p&gt;Um cabeçalho de uma classe PHP pode conter inúmeros statements relacionados à importação de outros componentes (classes, funções, constantes), declaração do atual namespace, comentários e documentações, e outras informações. É necessário que essas informações estejam presentes conforme ordem a seguir :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Abertura de tag PHP (&amp;lt;?php)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Docblock do arquivo &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Um ou mais statments de declaração&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O namespace do arquivo&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Um ou mais import de classes (reconhecimento pelo statement "use")&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Um ou mais import de funções &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Um ou mais import de constantes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O resto do arquivo&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cada statement deve ser separado em seu respectivo bloco, de forma que cada bloco seja separado por uma linha em branco, mas os mesmos não possuam uma linha em branco em seu conteúdo. &lt;/p&gt;

&lt;p&gt;Essa convenção deve ser aplicada mesmo em arquivos que apresentem uma mistura de PHP e HTML em seu conteúdo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A tag de abertura de PHP deve estar em linha única caso se encontre na primeira linha do arquivo. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Statments de importação não devem começar com a barra invertida &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Namespaces compostos não devem ter uma profundidade maior do que 2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ao declarar tipos estritos (declare(strict_types=1)) em um arquivo que misture PHP e HTML, é necessário que a declaração seja feita na primeira linha com abertura e fechamento PHP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Blocos de statements com a palavra chave "declare" são permitidos e devem se encontrar entre abertura e fechamento de chaves (abertura na mesma linha de palavra chave "declare" e o fechamento em uma nova linha)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Classes, Propriedades e Métodos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Qualquer fechamento de classe não deve ser seguido por um comentário ou statment na mesma linha&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Os parênteses devem sempre estar presentes ao instanciar uma nova classe, mesmo que não haja argumentos a serem passados ao construtor&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Extends e Implements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;As palavra-chaves "extends" e "implements" devem ser declaradas na mesma linha em que o nome de classe&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A abertura de chaves da classe deve se encontrar em sua própria linha, o fechamento deve estar na linha seguinte após o fim do corpo da classe&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A abertura e o fechamento não deve suceder uma linha vazia&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lista de interfaces a serem implementadas ou estendidas, deve apresentar cada uma em uma nova linha com sua indentação de acordo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Traits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A palavra chave "use" utilizada para implementar traits, deve ser declarada na linha seguinte à abertura de chaves da classe&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cada inclusão de trait deve estar em uma linha individual e deve utilizar seu próprio "use"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quando a classe não tiver mais nada além do use statement da trait, o fechamento deve estar presente logo na linha seguinte do mesmo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do contrário, deve haver uma linha em branco após o "use" statement
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Propriedades e Constantes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Visibilidade deve ser declarada em todas as propriedades e constantes (caso a versão do PHP seja maior que 7.1)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A palavra chave "var" não deve ser usada para declarar uma propriedade&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não deve haver mais do que uma palavra chave por statement&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Propriedades privadas não devem ter seu nome prefixado com um underline para indicar sua visibilidade&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deve haver um espaço na declaração do tipo de variável e o nome&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Métodos e Funções
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Visibilidade deve ser declarada para todos os métodos&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Métodos privados não devem ter seu nome prefixado com um underline para indicar sua visibilidade  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Método e nome de função não deve ser declarado com espaço após o nome&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Argumentos de Métodos e Funções
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Na lista de argumentos, não deve existir um espaço antes de cada linha, e deve existir um espaço após cada linha.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Argumentos com valores definidos por padrão, devem ir no final da lista&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lista de argumentos podem ser divididas entre várias linhas, no qual cada linha é indentada e cada item se encontra em uma linha. Quando assim ocorrer, o primeiro item deve estar na próxima linha da abertura de parênteses.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quando assim ocorrer, o fechamento de parênteses e a abertura de chaves devem estar na mesma linha com um espaço entre eles&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Quando houver uma declaração do tipo de retorno, o mesmo deve ter um espaço antes dos dois pontos. Ambos devem estar na mesma linha do fechamento de parênteses, sem espaço entre esses. &lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Declarações de tipo nulas não devem apresentar espaço entre o sinal de interrogação e o tipo de variável.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Quando utilizar o operador de referência ("&amp;amp;"), não deve apresentar espaço entre ele e o nome da variável.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Não deve apresentar espaço entre o operador de argumento "variadic" ("...") e o nome do argumento&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Ao combinar os últimos dois operadores citados, não deve haver espaço entre eles.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Abstract, final e static
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Abstract e final devem preceder a declaração de visibilidade&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Static deve suceder a declaração de visibilidade&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Chamadas de Métodos e de Funções
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ao realizar a chamada de um método ou função, não deve existir a presença de nenhum espaço com exceção de um espaço em branco após as linhas que separam os argumentos&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Listas de argumentos podem ser divididas entre várias linhas no qual cada linha deve ser um argumento indentado, o primeiro argumento deve se encontrar na linha que sucede a abertura de parênteses.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Estrutura de Controle
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Deve haver um espaço após a palavra reservada da estrutura de controle&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não deve haver espaço após a abertura de parênteses&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não deve haver espaço anterior ao fechamento de parênteses&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deve haver um espaço entre a abertura e o fechamento de parênteses&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O corpo da estrutura deve estar indentado&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O corpo da estrutura deve estar na próxima linha após a abertura de chaves&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O fechamento de chaves deve estar na próxima linha após o corpo&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  If, Elseif, Else
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A palavra chave &lt;code&gt;elseif&lt;/code&gt; deveria ser utilizada ao invés de &lt;code&gt;else if&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Expressões em parênteses podem ser divididas entre várias linhas no qual cada linha deve ser uma expressão indentada, a primeira expressão deve se encontrar na linha que sucede a abertura de parênteses, e operadores booleanos devem se encontrar no começo ou no fim da linha, de forma igual para todas as linhas e não uma mistura entre elas.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Switch, Case
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;"Case" statement deve estar indentado uma vez a partir do "switch", e a palavra-chave "break" deve estar indentada no mesmo nível em que o corpo do "case"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deve haver um comentário como "// no break" quando existir uma sequência intencional de um case não vazio para outro&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  While, Do While, For
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Expressões em parênteses podem ser divididas entre várias linhas no qual cada linha deve ser uma expressão indentada, a primeira expressão deve se encontrar na linha que sucede a abertura de parênteses, e operadores booleanos devem se encontrar no começo ou no fim da linha, de forma igual para todas as linhas e não uma mistura entre elas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Foreach
&lt;/h3&gt;

&lt;p&gt;Um foreach statement deve se parecer conforme o exemplo abaixo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

foreach ($iterable as $key =&amp;gt; $value) {
    // foreach body
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Try, catch, finally
&lt;/h3&gt;

&lt;p&gt;Um bloco try-catch-finally deve se parecer conforme o exemplo abaixo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

try {
    // try body
} catch (FirstThrowableType $e) {
    // catch body
} catch (OtherThrowableType | AnotherThrowableType $e) {
    // catch body
} finally {
    // finally body
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Operadores
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Incremento / Decremento
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Operadores de incremento e decremento não devem apresentar espaços entre estes e o operando&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Operadores de casting (conversão de tipo) não devem apresentar espaços entre parênteses&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Binários
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Todos os operadores binários de comparação, aritmética, atribuição e lógicos devem se encontrar entre um espaço em branco e outro&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ternário
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Deve apresentar um espaço entre os caracteres &lt;code&gt;?&lt;/code&gt; e &lt;code&gt;:&lt;/code&gt;&lt;br&gt;
&lt;code&gt;$variable = $foo ? 'foo' : 'bar';&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Quando o operador utilizar sua forma abreviada (sem o operando do meio), o espaço entre os caracteres operadores deve ser omitido &lt;br&gt;
&lt;code&gt;$variable = $foo ?: 'bar';&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Closures
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Devem ser declaradas com um espaço após a palavra chave 'function' e um espaço antes da palavra chave 'use'.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A abertura de chaves deve estar na mesma linha, e o fechamento na linha seguinte do corpo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não deve haver um espaço após a abertura e antes do fechamento de parênteses da lista de argumentos.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Na lista de argumentos, não deve haver um espaço antes de cada vírgula, mas sim um espaço após cada vírgula.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Argumentos com valores 'padrão' devem se encontrar no final da lista de argumentos&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Se um tipo de retorno estiver presente, ele deve seguir as regras de retorno das funções e métodos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caso a palavra chave 'use' esteja presente, deve haver dois pontos logo após o fechamento dos parênteses.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Argumentos podem ser separados em múltiplas linhas com cada linha indentada uma vez, deve haver apenas um argumento por linha e o primeiro argumento deve estar na linha seguinte à abertura de parênteses&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Classes Anônimas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Devem seguir os mesmos princípios e recomendações das closures&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A chave de abertura deve se encontrar na minha lista que a palavra chave "class", a menos que a lista de interfaces implementadas não resultem em quebra de linha&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caso ocorra uma quebra de linha, a chaves de abertura deve se encontrar na linha seguinte à última interface. &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>php</category>
    </item>
    <item>
      <title>PHP PSR 1 - Resumo</title>
      <dc:creator>Arthur Barboza</dc:creator>
      <pubDate>Thu, 29 May 2025 16:23:59 +0000</pubDate>
      <link>https://forem.com/devarthurbarboza/php-psr-1-resumo-4mi3</link>
      <guid>https://forem.com/devarthurbarboza/php-psr-1-resumo-4mi3</guid>
      <description>&lt;p&gt;As PSRs (PHP Standards Recomendations) se tratam de padronizações e boas práticas para o desenvolvimento de software com a linguagem PHP. &lt;/p&gt;

&lt;p&gt;A aplicação das PSRs no desenvolvimento de sistemas, tem o intuito de reforçar a qualidade interna do código, resultando em uma boa manutenibilidade e clareza para os desenvolvedores.&lt;/p&gt;

&lt;p&gt;Em alguns casos, a não procedência de uma recomendação pode até mesmo resultar problemas como a falta de coesão e clareza do código, ou até mesmo erros de runtime do software.   &lt;/p&gt;

&lt;p&gt;As PSRs apresentam diretivas tais como nomenclatura de variáveis, abertura de tags PHP, declaração de classes, protocolo HTTP, padrão de carregamento de classes, interface de cacheamento, interface de container e outros.&lt;/p&gt;

&lt;p&gt;Segue abaixo resumo da PSR1 - Padrões de Codificação Básica&lt;/p&gt;

&lt;p&gt;PSR 1 - Review&lt;/p&gt;

&lt;h2&gt;
  
  
  Files
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Arquivos podem usar as aberturas e fechamentos "&amp;lt;?php ?&amp;gt;" e "&amp;lt;?= ?&amp;gt;" mas não devem utilizar outras variações&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O código PHP deve estar em UTF-8&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O código PHP não deve declarar símbolos (classes, constantes, funções) e gerar "efeitos colateráis" (configurar variáveis .ini, carregar arquivos manualmente, gerar output, entre outros) no mesmo arquivo&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Namespaces e Nomes de Classes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Cada classe deve estar em um arquivo e um namespace de ao menos um nível (conforme padronizado pela PSR-4)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nome de classes devem ser declarados seguindo formato "StudlyCaps"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Código a partir do PHP 5.3 deve usar namespaces&lt;br&gt;
   3.1. Códigos de versões anteriores deve utilizar o pseudonamespace, muito comum no Magento 1 e outros sistemas legados &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Métodos, Constantes e Propriedade de Classes
&lt;/h2&gt;

&lt;p&gt;O termo "classe" se refere as classes, interfaces e traits&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Constantes de classes devem ser declaradas totalmente em upper case com underline como separador ("UPPER_CASE")&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não há uma convenção de nomenclatura pré-definida da PSR-1 para nomes de propriedades, apenas recomenda o uso consistente para escopos razoáveis (vendor, pacote, classe, método)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Métodos devem ser declarados em "camelCase"&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>php</category>
      <category>psr</category>
    </item>
  </channel>
</rss>
