<?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: Fabiano Santos Florentino</title>
    <description>The latest articles on DEV Community by Fabiano Santos Florentino (@fabianoflorentino).</description>
    <link>https://dev.to/fabianoflorentino</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%2F664835%2F992c2eb1-bde3-4b9c-9b82-4c750c4763da.jpeg</url>
      <title>DEV Community: Fabiano Santos Florentino</title>
      <link>https://dev.to/fabianoflorentino</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fabianoflorentino"/>
    <language>en</language>
    <item>
      <title>A interface Write</title>
      <dc:creator>Fabiano Santos Florentino</dc:creator>
      <pubDate>Wed, 20 Nov 2024 18:39:51 +0000</pubDate>
      <link>https://dev.to/fabianoflorentino/a-interface-write-11c5</link>
      <guid>https://dev.to/fabianoflorentino/a-interface-write-11c5</guid>
      <description>&lt;p&gt;Em Go, interfaces são fundamentais para promover polimorfismo e abstração. Elas atuam como contratos que especificam um conjunto de métodos que um tipo deve implementar, permitindo que diferentes tipos sejam tratados de maneira uniforme e flexível.&lt;/p&gt;

&lt;h1&gt;
  
  
  Interfaces
&lt;/h1&gt;

&lt;p&gt;Em Go, uma interface é um tipo que define um conjunto de métodos, sem implementá-los. Ela especifica apenas as assinaturas dos métodos que um tipo deve possuir para satisfazer a interface. Isso permite que diferentes tipos possam ser tratados de forma uniforme, desde que implementem os métodos definidos pela interface. Interfaces promovem polimorfismo e abstração, facilitando a criação de código flexível e reutilizável.&lt;/p&gt;

&lt;h1&gt;
  
  
  io.Writer
&lt;/h1&gt;

&lt;p&gt;A interface &lt;a href="https://pkg.go.dev/io#Writer" rel="noopener noreferrer"&gt;&lt;code&gt;io.Writer&lt;/code&gt;&lt;/a&gt; é uma das mais utilizadas em Go. Ela define o método &lt;code&gt;Write&lt;/code&gt;, que recebe um slice de bytes (&lt;code&gt;[]byte&lt;/code&gt;) e retorna um inteiro (&lt;code&gt;int&lt;/code&gt;) e um erro (&lt;code&gt;error&lt;/code&gt;). Diversos tipos implementam essa interface, incluindo &lt;a href="https://pkg.go.dev/os@go1.23.3#File.Write" rel="noopener noreferrer"&gt;&lt;code&gt;os.File&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://pkg.go.dev/log/slog/internal/buffer#Buffer.Write" rel="noopener noreferrer"&gt;&lt;code&gt;bytes.Buffer&lt;/code&gt;&lt;/a&gt; e &lt;a href="https://pkg.go.dev/net@go1.23.3#Conn" rel="noopener noreferrer"&gt;&lt;code&gt;net.Conn&lt;/code&gt;&lt;/a&gt;. Isso permite que diferentes tipos de destinos de escrita sejam tratados de maneira uniforme e flexível.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Writer é a interface que encapsula a operação básica de escrita.&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Writer&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="kt"&gt;error&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;ul&gt;
&lt;li&gt;
&lt;code&gt;Write&lt;/code&gt;: é o método que recebe um slice de bytes (&lt;code&gt;[]byte&lt;/code&gt;) como argumento e retorna dois valores.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;n&lt;/code&gt;: é o número de bytes escritos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;err&lt;/code&gt;:  é um valor do tipo &lt;code&gt;error&lt;/code&gt; que indica se ocorreu algum erro durante a escrita.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Qualquer tipo que implemente o método &lt;code&gt;Write&lt;/code&gt; com a assinatura correta será considerarado um &lt;code&gt;io.Writer&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que o &lt;code&gt;io.Writer&lt;/code&gt;?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Abstração&lt;/strong&gt;: permite tratar diferentes tipos de destinos de escrita de forma uniforme.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexibilidade&lt;/strong&gt;: facilita a criação de métodos genéricos que aceitam qualquer tipo que implemente a interface &lt;code&gt;io.Writer&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reutilização de código&lt;/strong&gt;: utilizando o &lt;code&gt;io.Writer&lt;/code&gt; pode ser reutilizado com diferentes tipos de destinos, como arquivos, sockets, buffers, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teste&lt;/strong&gt;: permite criar mocks e stubs para testar código de forma isolada.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Exemplo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s"&gt;"fmt"&lt;/span&gt;
  &lt;span class="s"&gt;"os"&lt;/span&gt;
  &lt;span class="s"&gt;"io"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stdout&lt;/span&gt; &lt;span class="c"&gt;// w é do tipo io.Writer&lt;/span&gt;

  &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Erro:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\b&lt;/span&gt;&lt;span class="s"&gt;Bytes escritos: %b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/tmp ➜ go run example_io_writer.go
Hello, World!
Bytes escritos: 1101
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;A interface &lt;code&gt;io.Writer&lt;/code&gt; é uma das interfaces mais comuns em Go. Ela é usada para abstrair a operação de escrita de dados, permitindo que diferentes tipos de destinos de escrita sejam tratados de forma uniforme. Isso facilita a reutilização de código, a criação de métodos genéricos e a escrita de testes. Além disso, a interface &lt;code&gt;io.Writer&lt;/code&gt; promove polimorfismo, permitindo que diferentes tipos que implementam a interface sejam usados de maneira intercambiável. Ela é amplamente implementada em vários pacotes padrão da linguagem Go, como &lt;code&gt;os&lt;/code&gt;, &lt;code&gt;bytes&lt;/code&gt;, &lt;code&gt;net&lt;/code&gt;, entre outros, demonstrando sua versatilidade e importância no ecossistema Go.&lt;/p&gt;

&lt;h1&gt;
  
  
  Referências
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://pkg.go.dev/io#Writer" rel="noopener noreferrer"&gt;https://pkg.go.dev/io#Writer&lt;/a&gt;&lt;br&gt;
&lt;a href="https://pkg.go.dev/os@go1.23.3#File.Write" rel="noopener noreferrer"&gt;https://pkg.go.dev/os@go1.23.3#File.Write&lt;/a&gt;&lt;br&gt;
&lt;a href="https://pkg.go.dev/log/slog/internal/buffer#Buffer.Write" rel="noopener noreferrer"&gt;https://pkg.go.dev/log/slog/internal/buffer#Buffer.Write&lt;/a&gt;&lt;br&gt;
&lt;a href="https://pkg.go.dev/net@go1.23.3#Conn" rel="noopener noreferrer"&gt;https://pkg.go.dev/net@go1.23.3#Conn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>braziliandevs</category>
      <category>go</category>
    </item>
    <item>
      <title>Programação Orientada a Objetos: Polimorfismo</title>
      <dc:creator>Fabiano Santos Florentino</dc:creator>
      <pubDate>Wed, 30 Oct 2024 20:08:43 +0000</pubDate>
      <link>https://dev.to/fabianoflorentino/programacao-orientada-a-objetos-polimorfismo-230b</link>
      <guid>https://dev.to/fabianoflorentino/programacao-orientada-a-objetos-polimorfismo-230b</guid>
      <description>&lt;p&gt;A programação orientada a objetos (POO) é amplamente utilizada para criar sistemas modulares e reutilizáveis. Dentro desse paradigma, um dos pilares mais importantes é o polimorfismo, que, em Golang, pode ser implementado através de interfaces. Este artigo explora o conceito de polimorfismo em Golang e como ele pode ser aplicado para criar sistemas flexíveis e expansíveis.&lt;/p&gt;

&lt;h1&gt;
  
  
  O que é Polimorfismo?
&lt;/h1&gt;

&lt;p&gt;Polimorfismo, derivado do grego poli (muitos) e morfos (formas), é um conceito fundamental na programação orientada a objetos (POO). Ele permite que diferentes tipos de objetos respondam ao mesmo conjunto de operações de maneiras específicas. Em termos práticos, isso significa que podemos definir um método com o mesmo nome em várias classes diferentes, e cada classe pode ter sua própria implementação desse método. Isso facilita a criação de código flexível e reutilizável, pois podemos tratar objetos de diferentes tipos de maneira uniforme, sem precisar conhecer suas implementações específicas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona em Golang?
&lt;/h2&gt;

&lt;p&gt;Em Golang, o polimorfismo é alcançado através do uso de interfaces. Diferente de linguagens orientadas a objetos tradicionais que utilizam herança, Golang permite que tipos diferentes implementem a mesma interface, desde que eles definam os métodos especificados pela interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é uma Interface?
&lt;/h3&gt;

&lt;p&gt;Uma interface em Golang é um tipo que especifica um conjunto de métodos. Qualquer tipo que implemente esses métodos é considerado como implementando a interface.&lt;/p&gt;

&lt;p&gt;Para ilustrar, imagine que estamos desenvolvendo um sistema de pagamentos capaz de processar diferentes métodos, como pagamentos via cartão de crédito e boleto bancário. Podemos definir uma interface chamada PaymentProcessor que declara um método ProcessPayment().&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="c"&gt;// Definindo a interface PaymentProcessor que declara o método ProcessPayment&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;PaymentProcessor&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;ProcessPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Struct para pagamento via cartão de crédito&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;CreditCard&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;// Implementação do método ProcessPayment para CreditCard&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;CreditCard&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ProcessPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;// Taxa de 2% aplicada no valor original&lt;/span&gt;
  &lt;span class="n"&gt;finalAmount&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="m"&gt;1.02&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processando pagamento via cartão de crédito. Valor original: R$%.2f, Valor final com taxa: R$%.2f&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;finalAmount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Struct para pagamento via boleto bancário&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Boleto&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;// Implementação do método ProcessPayment para Boleto&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="n"&gt;Boleto&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ProcessPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;// Desconto de 5% no valor original&lt;/span&gt;
  &lt;span class="n"&gt;finalAmount&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="m"&gt;0.95&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processando pagamento via boleto. Valor original: R$%.2f, Valor final com desconto: R$%.2f&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;finalAmount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Função que aceita qualquer tipo que implemente a interface PaymentProcessor&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;ProcessarPagamento&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;PaymentProcessor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ProcessPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;cartao&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;CreditCard&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="n"&gt;boleto&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;Boleto&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;100.00&lt;/span&gt; &lt;span class="c"&gt;// Exemplo de valor de pagamento&lt;/span&gt;

  &lt;span class="c"&gt;// Utilizando polimorfismo para processar diferentes tipos de pagamento&lt;/span&gt;
  &lt;span class="n"&gt;ProcessarPagamento&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cartao&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// Saída: Processando pagamento via cartão de crédito. Valor original: R$100.00, Valor final com taxa: R$102.00&lt;/span&gt;
  &lt;span class="n"&gt;ProcessarPagamento&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;boleto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// Saída: Processando pagamento via boleto. Valor original: R$100.00, Valor final com desconto: R$95.00&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, temos dois tipos (CreditCard e Boleto), cada um com sua própria implementação do método ProcessPayment(). A função ProcessarPagamento() pode aceitar qualquer tipo que implemente a interface PaymentProcessor, o que nos dá flexibilidade para adicionar novos métodos de pagamento sem modificar o código existente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Polimorfismo em Tempo de Execução
&lt;/h2&gt;

&lt;p&gt;Em Golang, o polimorfismo ocorre principalmente em tempo de execução, pois o tipo exato que implementa a interface é resolvido dinamicamente. Em outro exemplo onde novos tipos de pagamentos podem ser facilmente adicionados.&lt;/p&gt;

&lt;p&gt;Imagine que queremos suportar um novo método de pagamento, como o Pix. Basta criarmos uma nova struct Pix e implementar o método ProcessPayment().&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="c"&gt;// Definindo a interface PaymentProcessor que declara o método ProcessPayment&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;PaymentProcessor&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;ProcessPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Struct para pagamento via Pix&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Pix&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;// Implementação do método ProcessPayment para Pix&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;Pix&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ProcessPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;// Desconto de 1% no valor original&lt;/span&gt;
  &lt;span class="n"&gt;finalAmount&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="m"&gt;0.99&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processando pagamento via Pix. Valor original: R$%.2f, Valor final com desconto: R$%.2f&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;finalAmount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Função que aceita qualquer tipo que implemente a interface PaymentProcessor&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;ProcessarPagamento&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;PaymentProcessor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ProcessPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;pix&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;Pix&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;100.00&lt;/span&gt; &lt;span class="c"&gt;// Exemplo de valor de pagamento&lt;/span&gt;

  &lt;span class="c"&gt;// Processando o novo tipo de pagamento via Pix&lt;/span&gt;
  &lt;span class="n"&gt;ProcessarPagamento&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// Saída: Processando pagamento via Pix. Valor original: R$100.00, Valor final com desconto: R$99.00&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sem precisar alterar a função ProcessarPagamento, podemos facilmente integrar o novo tipo de pagamento, mostrando o poder do polimorfismo em Golang.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefícios do Polimorfismo em Golang
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flexibilidade:&lt;/strong&gt; O polimorfismo permite que novos comportamentos sejam adicionados sem modificar o código existente. Adicionamos novos tipos como Pix, sem precisar alterar a função ProcessarPagamento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expansibilidade:&lt;/strong&gt; Podemos adicionar quantos tipos forem necessários que implementem a interface PaymentProcessor, criando um sistema que pode crescer de forma orgânica.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reutilização de código:&lt;/strong&gt; A lógica principal pode ser reutilizada para diferentes tipos, evitando duplicação de código.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manutenção simplificada:&lt;/strong&gt; Como a lógica está centralizada na interface, a manutenção se torna mais fácil, já que o código não depende de implementações específicas.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;O polimorfismo permite que diferentes tipos sejam tratados de forma uniforme através de interfaces. Isso promove a flexibilidade e a extensibilidade do código, permitindo que novos tipos sejam adicionados sem modificar o código existente que depende da interface.&lt;/p&gt;

&lt;p&gt;Ao entender e utilizar o polimorfismo, você poderá desenvolver software mais flexível e preparado para crescer com as necessidades do seu projeto, criando soluções eficientes e escaláveis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.devmedia.com.br/conceitos-e-exemplos-polimorfismo-programacao-orientada-a-objetos/18701" rel="noopener noreferrer"&gt;Devmedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://golang.org/doc/effective_go.html#interfaces" rel="noopener noreferrer"&gt;Golang Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pt.wikipedia.org/wiki/Polimorfismo_(ci%C3%AAncia_da_computa%C3%A7%C3%A3o)" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>braziliandevs</category>
      <category>poo</category>
    </item>
    <item>
      <title>Programação Orientada a Objetos: Herança</title>
      <dc:creator>Fabiano Santos Florentino</dc:creator>
      <pubDate>Thu, 27 Jun 2024 17:39:01 +0000</pubDate>
      <link>https://dev.to/fabianoflorentino/programacao-orientada-a-objetos-heranca-1pc3</link>
      <guid>https://dev.to/fabianoflorentino/programacao-orientada-a-objetos-heranca-1pc3</guid>
      <description>&lt;h1&gt;
  
  
  Herança
&lt;/h1&gt;

&lt;p&gt;Herança é um dos pilares da programação orientada a objetos, e é uma das formas de reutilização de código. A herança é um mecanismo que permite que uma classe herde atributos e métodos de outra classe, chamada de superclasse ou classe base. A classe que herda os atributos e métodos é chamada de subclasse ou classe derivada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principais Conceitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Superclasse (Classe Base):&lt;/strong&gt; A classe cujos atributos e métodos são herdados por outras classes. É a classe “pai”.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subclasse (Classe Derivada):&lt;/strong&gt; A classe que herda atributos e métodos da superclasse. É a classe “filha”.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Herança Simples:&lt;/strong&gt; Quando uma subclasse herda de uma única superclasse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Herança Múltipla:&lt;/strong&gt; Quando uma subclasse herda de mais de uma superclasse. Nem todas as linguagens de programação suportam herança múltipla devido à sua complexidade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sobrescrita de Método:&lt;/strong&gt; A subclasse pode fornecer uma implementação específica de um método que já existe na superclasse.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Herança &amp;amp; Composição não são a mesma coisa
&lt;/h2&gt;

&lt;p&gt;Composição e herança são duas formas de reutilização de código em programação orientada a objetos. A herança é uma forma de reutilização de código que permite que uma classe herde atributos e métodos de outra classe. A composição é uma forma de reutilização de código que permite que uma classe contenha objetos de outras classes. A composição é geralmente preferida à herança, pois é mais flexível e menos propensa a problemas de design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona em Go
&lt;/h2&gt;

&lt;p&gt;Go &lt;code&gt;não possui herança&lt;/code&gt; como em linguagens orientadas a objetos clássicas. Ao invés de herança, Go utiliza composição e interfaces para alcançar o mesmo comportamento. Geralmente, a composição é feita através de structs (estruturas) e interfaces.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="c"&gt;// Veiculo é uma interface que define um método dados que retorna uma string&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Veiculo&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;dados&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Carro é uma struct que representa um carro&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Carro&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;marca&lt;/span&gt;  &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;modelo&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// dados é um método que retorna uma string com os dados do carro&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;Carro&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;dados&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Marca: %s, Modelo: %s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;marca&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Hatch é uma struct que representa um carro do tipo hatch&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Hatch&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Carro&lt;/span&gt;
    &lt;span class="n"&gt;portas&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// dados é um método que retorna uma string com os dados do carro hatch&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="n"&gt;Hatch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;dados&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Marca: %s, Modelo: %s, Portas: %d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;marca&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;portas&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Sedan é uma struct que representa um carro do tipo sedan&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Sedan&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Carro&lt;/span&gt;
    &lt;span class="n"&gt;portaMalas&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// dados é um método que retorna uma string com os dados do carro sedan&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;Sedan&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;dados&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Marca: %s, Modelo: %s, Porta Malas: %d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;marca&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;portaMalas&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Conversivel&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Carro&lt;/span&gt;
    &lt;span class="n"&gt;capota&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;Conversivel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;dados&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%s, Capota: %t"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Carro&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dados&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;capota&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// imprimirDados é uma função que recebe um veículo e imprime os dados do veículo&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;imprimirDados&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="n"&gt;Veiculo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dados&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Acessando atributos&lt;/span&gt;
    &lt;span class="n"&gt;hatch&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;Hatch&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Carro&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Chevrolet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Onix"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;sedan&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;Sedan&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Carro&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Honda"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Civic"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Acessando métodos dados da struct Carro de forma explícita&lt;/span&gt;
    &lt;span class="n"&gt;conversivel&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;Conversivel&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Carro&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Fiat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Spyder"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;imprimirDados&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hatch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;imprimirDados&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sedan&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;imprimirDados&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conversivel&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;heranca main 29m ➜ go run main.go
Marca: Chevrolet, Modelo: Onix, Portas: 4
Marca: Honda, Modelo: Civic, Porta Malas: 500
Marca: Fiat, Modelo: Spyder, Capota: &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, temos uma interface &lt;code&gt;Veiculo&lt;/code&gt; que define um método &lt;code&gt;dados&lt;/code&gt; que retorna uma string. Temos também uma struct &lt;code&gt;Carro&lt;/code&gt; que representa um carro e um método &lt;code&gt;dados&lt;/code&gt; que retorna uma string com os dados do carro. As structs &lt;code&gt;Hatch&lt;/code&gt; e &lt;code&gt;Sedan&lt;/code&gt; representam carros do tipo hatch e sedan, respectivamente. Ambas as structs &lt;code&gt;Hatch&lt;/code&gt; e &lt;code&gt;Sedan&lt;/code&gt; incorporam a struct &lt;code&gt;Carro&lt;/code&gt; através da composição. Cada uma das structs &lt;code&gt;Hatch&lt;/code&gt; e &lt;code&gt;Sedan&lt;/code&gt; tem um método &lt;code&gt;dados&lt;/code&gt; que retorna uma string com os dados do carro do tipo hatch ou sedan. A função &lt;code&gt;imprimirDados&lt;/code&gt; recebe um veículo e imprime os dados do veículo.&lt;/p&gt;

&lt;p&gt;Com a composição você pode acessar tantos os atributos quanto os métodos da struct incorporada. No entanto, se houver um método com o mesmo nome ele será sobrescrito.Você pode acessar o método da struct incorporada de forma explícita &lt;code&gt;c.Carro.dados()&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="n"&gt;Hatch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;dados&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%s, Portas: %d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Carro&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dados&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;portas&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;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A herança é um mecanismo importante da programação orientada a objetos que permite a reutilização de código. No entanto, a herança pode levar a problemas de design, como acoplamento excessivo e hierarquias de classes profundas. Em Go, a linguagem não possui herança como em linguagens orientadas a objetos clássicas. Em vez disso, Go utiliza composição e interfaces para alcançar o mesmo comportamento. A composição é geralmente preferida à herança, pois é mais flexível e menos propensa a problemas de design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Projeto
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/fabianoflorentino/poo/tree/main/heranca" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://pt.wikipedia.org/wiki/Heran%C3%A7a_(programa%C3%A7%C3%A3o_orientada_a_objetos)" rel="noopener noreferrer"&gt;Wikipédia (Herança)&lt;/a&gt;&lt;br&gt;
&lt;a href="https://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_orientada_a_objetos#Composi%C3%A7%C3%A3o,_heran%C3%A7a_e_delega%C3%A7%C3%A3o" rel="noopener noreferrer"&gt;Wikipédia (Composição, herança e delegação)&lt;/a&gt;&lt;br&gt;
&lt;a href="https://medium.com/@ViniciusPach_97728/go-composi%C3%A7%C3%A3o-vs-heran%C3%A7a-2e8b78928c26" rel="noopener noreferrer"&gt;Go: Composição vs Herança (Vinicius Pacheco)&lt;/a&gt;&lt;br&gt;
&lt;a href="https://go.dev/doc/effective_go#embedding" rel="noopener noreferrer"&gt;Effective Go&lt;/a&gt;&lt;br&gt;
&lt;a href="https://go.dev/ref/spec#Struct_types" rel="noopener noreferrer"&gt;The Go Programming Language Specification&lt;/a&gt;&lt;br&gt;
&lt;a href="https://gobyexample.com/struct-embedding" rel="noopener noreferrer"&gt;Go by Example&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>braziliandevs</category>
      <category>poo</category>
    </item>
    <item>
      <title>Programação Orientada a Objetos: Encapsulamento</title>
      <dc:creator>Fabiano Santos Florentino</dc:creator>
      <pubDate>Thu, 27 Jun 2024 00:41:39 +0000</pubDate>
      <link>https://dev.to/fabianoflorentino/programacao-orientada-a-objetos-encapsulamento-n0n</link>
      <guid>https://dev.to/fabianoflorentino/programacao-orientada-a-objetos-encapsulamento-n0n</guid>
      <description>&lt;h1&gt;
  
  
  Encapsulamento
&lt;/h1&gt;

&lt;p&gt;é um dos princípios fundamentais da programação orientada a objetos (POO). O encapsulamento consiste em ocultar os detalhes internos de um objeto e expor apenas a interface necessária. Essa prática tem como objetivo proteger o estado interno do objeto contra acessos diretos e não autorizados, promovendo a modularidade e facilitando a manutenção do código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principais Conceitos
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Atributos Privados:&lt;/strong&gt; Variáveis que armazenam o estado interno de um objeto e são acessíveis apenas dentro da classe onde são definidas. Em linguagens como Java e Python, usa-se o modificador de acesso private ou o prefixo _ para denotar atributos privados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Métodos Públicos:&lt;/strong&gt; Funções que permitem a interação com o objeto e seu estado de forma controlada. Estes métodos expõem a funcionalidade do objeto sem revelar os detalhes de implementação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Getters e Setters:&lt;/strong&gt; Métodos específicos para acessar e modificar atributos privados. Um getter permite ler o valor de um atributo privado, enquanto um setter permite modificá-lo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona em Go
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Campos e Funções não Exportados:&lt;/strong&gt; Em Go, se um campo ou uma função começa com uma letra minúscula, ele é acessível apenas dentro do pacote onde foi definido. Esse é o modo como Go implementa encapsulamento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Campos e Funções Exportados:&lt;/strong&gt; Se um campo ou uma função começa com uma letra maiúscula, ele é exportado e pode ser acessado de outros pacotes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="c"&gt;// Conta é uma estrutura que representa uma conta bancária.&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Conta&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;saldo&lt;/span&gt;  &lt;span class="kt"&gt;float64&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Depositar é um método que adiciona um valor ao saldo da conta.&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Conta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Depositar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Sacar é um método que subtrai um valor do saldo da conta.&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Conta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Sacar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Saldo é um método que retorna o saldo da conta.&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Conta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Saldo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saldo&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Cria uma nova conta com saldo inicial de 100.0.&lt;/span&gt;
    &lt;span class="n"&gt;conta&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;Conta&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100.0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Tell, Don't Ask - Princípio de design de software.&lt;/span&gt;
    &lt;span class="c"&gt;// Depositar e Sacar são métodos que informam a conta sobre as ações a serem realizadas.&lt;/span&gt;
    &lt;span class="n"&gt;conta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Depositar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;50.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;conta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sacar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;25.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Saldo&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;encampulamento ➜ go run main.go
125
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, a estrutura &lt;code&gt;Conta&lt;/code&gt; possui dois campos privados (&lt;code&gt;numero&lt;/code&gt; e &lt;code&gt;saldo&lt;/code&gt;) e três métodos públicos (&lt;code&gt;Depositar&lt;/code&gt;, &lt;code&gt;Sacar&lt;/code&gt; e &lt;code&gt;Saldo&lt;/code&gt;). Dessa forma, o estado interno da conta é protegido contra acessos diretos e não autorizados, garantindo que as operações de depósito e saque sejam realizadas de forma segura.&lt;/p&gt;

&lt;h1&gt;
  
  
  Tell, Don't Ask
&lt;/h1&gt;

&lt;p&gt;Tell, Don't Ask é um princípio de design de software que sugere que os objetos devem ser responsáveis por realizar ações e não por fornecer informações. Em vez de perguntar a um objeto sobre seu estado interno e tomar decisões com base nesse estado, o princípio Tell, Don't Ask recomenda que o objeto seja informado sobre o que deve ser feito e tome as ações necessárias.&lt;/p&gt;

&lt;h2&gt;
  
  
  Afirmando o Princípio
&lt;/h2&gt;

&lt;p&gt;No mesmo exemplo acima, a estrutura &lt;code&gt;Conta&lt;/code&gt; possui três métodos públicos (&lt;code&gt;Depositar&lt;/code&gt;, &lt;code&gt;Sacar&lt;/code&gt; e &lt;code&gt;Saldo&lt;/code&gt;) que permitem interagir com o objeto sem acessar diretamente seu estado interno. Dessa forma, o princípio &lt;code&gt;Tell, Don't Ask&lt;/code&gt; é seguido, pois o objeto &lt;code&gt;Conta&lt;/code&gt; é informado sobre as ações a serem realizadas (&lt;code&gt;depósito&lt;/code&gt; e &lt;code&gt;saque&lt;/code&gt;) e toma as ações necessárias.&lt;/p&gt;

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

&lt;p&gt;O encapsulamento é um conceito fundamental da programação orientada a objetos que visa proteger o estado interno de um objeto contra acessos diretos e não autorizados. Em Go, o encapsulamento é implementado por meio de campos e funções não exportados, que são acessíveis apenas dentro do pacote onde foram definidos. Dessa forma, é possível garantir a integridade e a segurança do objeto, promovendo a modularidade e facilitando a manutenção do código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Projeto
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/fabianoflorentino/poo/tree/main/encapsulamento" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Agradecimento
&lt;/h1&gt;

&lt;p&gt;Deixo aqui meu agradecimento ao @moretoend (fala comigo!), como sempre ajudando a melhorar o conteúdo dos meus artigos, e nesse em especial, me ajudando a entender melhor o conceito de &lt;code&gt;Tell, Don't Ask&lt;/code&gt;. vlw!&lt;/p&gt;

&lt;h1&gt;
  
  
  Referências
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_orientada_a_objetos#Encapsulamento" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.devmedia.com.br/os-4-pilares-da-programacao-orientada-a-objetos/9264" rel="noopener noreferrer"&gt;Devmedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://go.dev/ref/spec#Exported_identifiers" rel="noopener noreferrer"&gt;The Go Programming Language Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://go.dev/doc/effective_go#names" rel="noopener noreferrer"&gt;Effective Go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://robsoncastilho.com.br/2014/05/11/conceitos-tell-dont-ask/" rel="noopener noreferrer"&gt;Tell, Don't Ask (Robson Castilho)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://martinfowler.com/bliki/TellDontAsk.html" rel="noopener noreferrer"&gt;Tell, Don't Ask (Martin Fowler)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>braziliandevs</category>
      <category>poo</category>
    </item>
    <item>
      <title>Programação Orientada a Objetos: Abstração</title>
      <dc:creator>Fabiano Santos Florentino</dc:creator>
      <pubDate>Thu, 13 Jun 2024 20:36:03 +0000</pubDate>
      <link>https://dev.to/fabianoflorentino/programacao-orientada-a-objetos-abstracao-157o</link>
      <guid>https://dev.to/fabianoflorentino/programacao-orientada-a-objetos-abstracao-157o</guid>
      <description>&lt;h1&gt;
  
  
  Abstração
&lt;/h1&gt;

&lt;p&gt;Em ciência da computação, abstração é a habilidade de se concentrar nos aspectos essenciais de um contexto, ignorando características menos importantes ou acidentais. Em programação orientada a objetos, uma classe é uma abstração de entidades existentes no contexto de uma aplicação. Como exemplo, uma classe Usuario pode representar um usuário de um sistema que pode se dividir em subclasses como UsuarioAdministrador, UsuarioComum, UsuarioVisitante, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principais Conceitos
&lt;/h2&gt;

&lt;p&gt;Uma classe abstrada é criada para representar entidades e conceitos abstratos. A classe abstrata é sempre uma "Super classe" que não possui instâncias, que implementa métodos que são de uso comum a todas as subclasses. As subclasses são classes que herdam os métodos e atributos da classe abstrata, podendo implementar métodos específicos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona em Go
&lt;/h2&gt;

&lt;p&gt;Em Go, não existe o conceito de classes, mas podemos alcançar a abstração por meio de interfaces. Uma interface é um tipo abstrato que define um conjunto de métodos que um tipo deve possuir. Em Go, a implementação das interfaces é implícita, o que significa que qualquer tipo que tenha os métodos exigidos por uma interface automaticamente a implementa, sem a necessidade de uma declaração explícita. Isso permite que um tipo concreto seja tratado como uma interface, sem a necessidade de conhecer a implementação específica do tipo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Usuario&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;Email&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;

&lt;span class="c"&gt;// Struct que representa um usuário administrador&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;UsuarioAdministrador&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;nome&lt;/span&gt;  &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Método que retorna o nome do usuário administrador&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ua&lt;/span&gt; &lt;span class="n"&gt;UsuarioAdministrador&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ua&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Método que retorna o email do usuário administrador&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ua&lt;/span&gt; &lt;span class="n"&gt;UsuarioAdministrador&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Email&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ua&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Função que registra um usuário administrador&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;RegistraUsuarioAdministrador&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Usuario&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;UsuarioAdministrador&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;

&lt;span class="c"&gt;// Struct que representa um usuário comum&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;UsuarioComum&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;nome&lt;/span&gt;  &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Método que retorna o nome do usuário comum&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uc&lt;/span&gt; &lt;span class="n"&gt;UsuarioComum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;uc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Método que retorna o email do usuário comum&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uc&lt;/span&gt; &lt;span class="n"&gt;UsuarioComum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Email&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;uc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Função que registra um usuário comum&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;RegistraUsuarioComum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Usuario&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;UsuarioComum&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="c"&gt;// PrintUsuarioComum imprime os dados de um usuario&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;PrintUsuario&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="n"&gt;Usuario&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Nome: %s, Email: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Email&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"abstracao/usuario"&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Registra um usuário comum&lt;/span&gt;
    &lt;span class="n"&gt;usuario_comum&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RegistraUsuarioComum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Usuario Commum"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"usuario_comum@email.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Registra um usuário administrador&lt;/span&gt;
    &lt;span class="n"&gt;usuario_administrador&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RegistraUsuarioAdministrador&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Usuario Administrador"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"usuario_administrador@email.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Imprime os dados dos usuários&lt;/span&gt;
    &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PrintUsuario&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usuario_comum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PrintUsuario&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usuario_administrador&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;abstracao ➜ go run main.go
Nome: Usuario Commum, Email: usuario_comum@email.com
Nome: Usuario Administrador, Email: usuario_administrador@email.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, temos uma interface &lt;code&gt;Usuario&lt;/code&gt; que define os métodos &lt;code&gt;Nome&lt;/code&gt; e &lt;code&gt;Email&lt;/code&gt;. As structs &lt;code&gt;UsuarioAdministrador&lt;/code&gt; e &lt;code&gt;UsuarioComum&lt;/code&gt; implementam a &lt;code&gt;interface Usuario&lt;/code&gt;, fornecendo suas próprias versões dos métodos &lt;code&gt;Nome&lt;/code&gt; e &lt;code&gt;Email&lt;/code&gt;. As funções &lt;code&gt;RegistraUsuarioAdministrador&lt;/code&gt; e &lt;code&gt;RegistraUsuarioComum&lt;/code&gt; são responsáveis por criar instâncias de &lt;code&gt;UsuarioAdministrador&lt;/code&gt; e &lt;code&gt;UsuarioComum&lt;/code&gt;, respectivamente. No arquivo &lt;code&gt;main.go&lt;/code&gt;, instanciamos objetos de &lt;code&gt;UsuarioAdministrador&lt;/code&gt; e &lt;code&gt;UsuarioComum&lt;/code&gt;, e chamamos os métodos Nome e Email de cada um para demonstrar a implementação da interface.&lt;/p&gt;

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

&lt;p&gt;A abstração é fundamental no design de software, permitindo a definição de contratos de comportamento independentes das implementações específicas. Em Go, embora não existam classes como nas linguagens orientadas a objetos tradicionais, a abstração é alcançada eficientemente através de interfaces. Interfaces permitem a criação de tipos que aderem a um conjunto de métodos, promovendo flexibilidade e reutilização de código. Ao separar a definição de comportamento da implementação concreta, interfaces simplificam a manutenção de sistemas complexos e permitem que novos tipos possam ser integrados com facilidade, melhorando a modularidade e a extensibilidade do código.&lt;/p&gt;

&lt;h1&gt;
  
  
  Projeto
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://github.com/fabianoflorentino/poo/tree/main/abstracao" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Referências
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pt.wikipedia.org/wiki/Abstra%C3%A7%C3%A3o_(ci%C3%AAncia_da_computa%C3%A7%C3%A3o)" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pt.stackoverflow.com/questions/23103/o-que-%C3%A9-abstra%C3%A7%C3%A3o" rel="noopener noreferrer"&gt;Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://go.dev/doc/effective_go#interfaces" rel="noopener noreferrer"&gt;Effective Go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gobyexample.com/interfaces" rel="noopener noreferrer"&gt;Go by Example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aprendagolang.com.br/trabalhando-com-interfaces/" rel="noopener noreferrer"&gt;Aprenda Golang&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



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

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

&lt;/div&gt;

</description>
      <category>programming</category>
      <category>braziliandevs</category>
      <category>poo</category>
    </item>
    <item>
      <title>Melhorando a Compreensão de Slices Multidimensionais em Golang</title>
      <dc:creator>Fabiano Santos Florentino</dc:creator>
      <pubDate>Wed, 12 Jun 2024 13:06:23 +0000</pubDate>
      <link>https://dev.to/fabianoflorentino/slice-multi-dimensional-em-golang-2pne</link>
      <guid>https://dev.to/fabianoflorentino/slice-multi-dimensional-em-golang-2pne</guid>
      <description>&lt;h2&gt;
  
  
  Olá mundo!
&lt;/h2&gt;

&lt;p&gt;Faz tempo desde o último artigo, mas estou de volta! Neste artigo, vou tentar explicar e aprimorar o entendimento sobre slices multidimensionais em Golang.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é um slice multidimensional?
&lt;/h2&gt;

&lt;p&gt;Um slice multidimensional é um slice que contém outros slices. Em outras palavras, é uma matriz de slices. Isso é útil quando você precisa de uma matriz de tamanho variável.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona em Golang?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Conceitos básicos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Array multidimensional: um array multidimensional é um array que contém outros arrays como elementos. Em Go, você pode declarar um array de duas dimensões (por exemplo, uma matriz) como &lt;code&gt;var slice [3][3]int&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Slice: Uma fatia é uma referência a um segmento contínuo de um array. Fatias em Go têm uma capacidade (cap) e um comprimento (len) e podem ser redimensionadas.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Criando um slice 2D
&lt;/h3&gt;

&lt;p&gt;Primeiro, criamos uma matriz 2D e a inicializamos com alguns valores. Em seguida, criamos um slice 2D e atribuímos a matriz 2D a ele.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;matrix&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Matriz 2D original:"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;printMatrix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matrix&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 exemplo, criamos um slice multidimensional de inteiros. Cada elemento do slice principal é um slice de inteiros. Podemos acessar os elementos individuais da matriz usando a notação de colchetes duplos.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Fazendo Slice de Linhas Específicas
&lt;/h3&gt;

&lt;p&gt;Criamos uma fatia para acessar partes específicas da matriz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;matrix&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Matriz 2D original:"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;printMatrix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Fatia da primeira linha&lt;/span&gt;
    &lt;span class="n"&gt;firstRow&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&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="c"&gt;// Equivalente a matrix[0][0:4]&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Primeira linha como fatia:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;firstRow&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Fatia da segunda linha, mas apenas os dois primeiros elementos&lt;/span&gt;
    &lt;span class="n"&gt;secondRowPartial&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Parte da segunda linha:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;secondRowPartial&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 exemplo, acessamos os elementos individuais da matriz usando a notação de colchetes duplos. O primeiro índice refere-se ao índice do slice principal e o segundo índice refere-se ao índice do slice interno.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Fazendo Slice de Colunas
&lt;/h3&gt;

&lt;p&gt;Para acessar colunas, você precisa iterar pelas linhas e criar fatias das colunas desejadas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;matrix&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Matriz 2D original:"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;printMatrix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Fatia da primeira coluna&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;firstCol&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;firstCol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstCol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Primeira coluna como fatia:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;firstCol&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Fatia da segunda coluna&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;secondCol&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;secondCol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secondCol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Segunda coluna como fatia:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;secondCol&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;h3&gt;
  
  
  4. Função auxiliar para imprimir a matriz
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;printMatrix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matrix&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&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;h3&gt;
  
  
  Código completo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;matrix&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Matriz 2D original:"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;printMatrix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Fatia da primeira linha&lt;/span&gt;
    &lt;span class="n"&gt;firstRow&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&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="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Primeira linha como fatia:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;firstRow&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Fatia da segunda linha, mas apenas os dois primeiros elementos&lt;/span&gt;
    &lt;span class="n"&gt;secondRowPartial&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Parte da segunda linha:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;secondRowPartial&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Fatia da primeira coluna&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;firstCol&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;firstCol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstCol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Primeira coluna como fatia:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;firstCol&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Fatia da segunda coluna&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;secondCol&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;secondCol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secondCol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Segunda coluna como fatia:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;secondCol&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;printMatrix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matrix&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&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;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Compreender o conceito de slices multidimensionais é essencial para qualquer desenvolvedor que deseja manipular estruturas de dados complexas de forma eficiente. Esse conhecimento não apenas aprimora a capacidade de lidar com arrays em várias linguagens, mas também simplifica a execução de operações complexas, aumentando a clareza e a manutenibilidade do código. Ao dominar o uso de slices multidimensionais, você ganha uma ferramenta poderosa para enfrentar desafios em áreas como processamento de imagens, ciência de dados e outras que exigem a manipulação de grandes volumes de dados. Essa habilidade se traduz em código mais eficiente e expressivo, capacitando você a resolver problemas de maneira ágil e eficaz, e a criar soluções mais robustas e escaláveis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://go.dev/ref/spec#Slice_expressions" rel="noopener noreferrer"&gt;Go Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://go.dev/doc/effective_go#slices" rel="noopener noreferrer"&gt;Effective Go&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>braziliandevs</category>
      <category>go</category>
    </item>
    <item>
      <title>Autorização no Ransack, Permitindo ou Negando operações de pesquisa e ordenação</title>
      <dc:creator>Fabiano Santos Florentino</dc:creator>
      <pubDate>Sun, 28 Jan 2024 15:44:08 +0000</pubDate>
      <link>https://dev.to/fabianoflorentino/autorizacao-no-ransack-permitindo-ou-negando-operacoes-de-pesquisa-e-ordenacao-33aj</link>
      <guid>https://dev.to/fabianoflorentino/autorizacao-no-ransack-permitindo-ou-negando-operacoes-de-pesquisa-e-ordenacao-33aj</guid>
      <description>&lt;p&gt;Por padrão, o Ransack autoriza a pesquisa e a ordenação em todos os campos do modelo e não autoriza quaisquer escopos de classe. No entanto, podemos personalizar essa autorização usando quatro métodos específicos que podem ser redefinidos em nossos modelos: &lt;strong&gt;ransackable_attributes&lt;/strong&gt;, &lt;strong&gt;ransackable_associations&lt;/strong&gt;, &lt;strong&gt;ransortable_attributes&lt;/strong&gt; e &lt;strong&gt;ransackable_scopes&lt;/strong&gt;. Vamos explorar como podemos utilizar esses métodos para controlar precisamente quais operações de pesquisa e ordenação são permitidas em nossa aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Permitindo ou Negando Operações de Pesquisa
&lt;/h2&gt;

&lt;p&gt;O método &lt;strong&gt;ransackable_attributes&lt;/strong&gt; determina quais atributos de um modelo podem ser usados para pesquisa. Por padrão, ele retorna todos os nomes de colunas do banco de dados e quaisquer ransackers definidos. Esse método pode ser redefinido para permitir apenas pesquisas em determinados campos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ransackable_attributes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth_object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="sx"&gt;%w[name email]&lt;/span&gt; &lt;span class="c1"&gt;# Apenas 'nome' e 'email' são permitidos para pesquisa&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo, apenas os campos &lt;strong&gt;nome&lt;/strong&gt; e &lt;strong&gt;email&lt;/strong&gt; podem ser usados para pesquisa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Controlando as Associações Permitidas
&lt;/h2&gt;

&lt;p&gt;O método &lt;strong&gt;ransackable_associations&lt;/strong&gt; determina quais associações de um modelo podem ser usadas para pesquisa. Por padrão, ele retornas os nomes de todas as associações definidas no modelo. Podemos redefinir as associações através desse método.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ransackable_associations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth_object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="sx"&gt;%w[posts]&lt;/span&gt; &lt;span class="c1"&gt;# Apenas 'posts' pode ser usado para pesquisa&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo, apenas as associações &lt;strong&gt;posts&lt;/strong&gt; podem ser usadas para pesquisa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Permitindo ou Negando a Ordenação
&lt;/h2&gt;

&lt;p&gt;O método &lt;strong&gt;ransortable_attributes&lt;/strong&gt; determina quais atributos de um modelo podem ser usados para ordenação. Por padrão, ele retorna os mesmos atributos definidos em &lt;strong&gt;ransackable_attributes&lt;/strong&gt;. Podemos redefinir esse método para permitir ou negar a ordenação em determinados atributos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ransortable_attributes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth_object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="sx"&gt;%w[name email]&lt;/span&gt; &lt;span class="c1"&gt;# Apenas 'nome' e 'email' podem ser usados para ordenação&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo, apenas os campos &lt;strong&gt;nome&lt;/strong&gt; e &lt;strong&gt;email&lt;/strong&gt; podem ser usados para ordenação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Controlando os Escopos Autorizados
&lt;/h2&gt;

&lt;p&gt;O método &lt;strong&gt;ransackable_spoces&lt;/strong&gt; determina quais escopos de classe &lt;strong&gt;(método de classe)&lt;/strong&gt; de um modelo podem ser usados para pesquisa. Por padrão, ele retorna uma lista vazia, o que significa que nenhum escopo de classe está autorizado. Podemos redefinir esse método para permitir ou negar a pesquisa em determinados escopos de classe.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ransackable_scopes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth_object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:active&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# Apenas o escopo 'ativo' pode ser usado para pesquisa&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso significa que apenas o escopo de classe &lt;strong&gt;active&lt;/strong&gt; do modelo pode ser usado em operações de pesquisa.&lt;/p&gt;

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

&lt;p&gt;Ao personalizar esses métodos em nossos modelos Rails, podemos controlar precisamente quais operações de pesquisa e ordenação são permitidas em nossos modelos. Isso nos dá maior flexibilidade e segurança ao lidar com consultas em nossas aplicações, garantindo que apenas as operações autorizadas sejam executadas em campos e associações específicas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sabia Mais
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ransack Documentation: &lt;a href="https://activerecord-hackery.github.io/ransack/going-further/other-notes/#authorization-allowlistingdenylisting" rel="noopener noreferrer"&gt;Authorization (allowlisting/denylisting)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ruby</category>
      <category>programming</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Ransack</title>
      <dc:creator>Fabiano Santos Florentino</dc:creator>
      <pubDate>Sun, 28 Jan 2024 02:45:23 +0000</pubDate>
      <link>https://dev.to/fabianoflorentino/ransack-2p44</link>
      <guid>https://dev.to/fabianoflorentino/ransack-2p44</guid>
      <description>&lt;h2&gt;
  
  
  Ransack uma Query Language em Rails
&lt;/h2&gt;

&lt;p&gt;No contexto do desenvolvimento web com Rails, o &lt;a href="https://activerecord-hackery.github.io/ransack/" rel="noopener noreferrer"&gt;Ransack&lt;/a&gt; oferece uma maneira conveniente e flexível de construir consultas dinâmicas em bancos de dados. Funcionando como uma "linguagem de consulta" embutida, o Ransack simplifica a tarefa de filtrar, ordenar e pesquisar registros em modelos ActiveRecord&lt;/p&gt;

&lt;h2&gt;
  
  
  Filtrando Registros
&lt;/h2&gt;

&lt;p&gt;Uma das funcionalidades principais do Ransack é permitir que os desenvolvedores filtrem registros com base em critérios específicos. Isso pode ser útil em cenários como uma página de administração onde o usuário deseja ver apenas os registros que correspondem a determinados critérios.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# No controlador&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;
  &lt;span class="vi"&gt;@q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ransack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:q&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="vi"&gt;@posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="vi"&gt;@q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;result&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, &lt;strong&gt;Post.ransack(params[:q])&lt;/strong&gt; cria um objeto Ransack com base nos parâmetros recebidos da solicitação HTTP. Os parâmetros geralmente vêm de um formulário na interface do usuário, onde o usuário pode especificar os critérios de filtro desejados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ordenando Registros
&lt;/h2&gt;

&lt;p&gt;Outra característica útil do Ransack é a capacidade de ordenar os registros recuperados. Isso é feito adicionando os parâmetros de ordenação adequados à solicitação HTTP.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# No controlador&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;
  &lt;span class="vi"&gt;@q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ransack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:q&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="vi"&gt;@posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="vi"&gt;@q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;created_at: :desc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, &lt;strong&gt;@q.result.order(created_at: :desc)&lt;/strong&gt; garante que os registros sejam ordenados por created_at em ordem decrescente. Isso pode ser personalizado conforme a necessidade da aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pesquisando Registros
&lt;/h2&gt;

&lt;p&gt;Além de filtrar e ordenar, o Ransack também facilita a realização de pesquisas de texto completo em registros. Isso pode ser especialmente útil em interfaces de pesquisa onde os usuários podem buscar registros com base em palavras-chave. Para deixar a pesquisa mais especifica, você pode utilizar as colunas do banco de dados combinado a uma &lt;a href="https://activerecord-hackery.github.io/ransack/getting-started/search-matches/#search-matchers" rel="noopener noreferrer"&gt;lista de predicados&lt;/a&gt; do ransack para filtrar os resultados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/route?q[title_cont]&lt;span class="o"&gt;=&lt;/span&gt;title
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/route?q[title_cont]&lt;span class="o"&gt;=&lt;/span&gt;tittle&amp;amp;q[author_eq]&lt;span class="o"&gt;=&lt;/span&gt;author
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No primeiro exemplo, o Ransack recebe como parametro os filtro &lt;strong&gt;title_cont&lt;/strong&gt;, com o valor &lt;strong&gt;title&lt;/strong&gt;. &lt;strong&gt;title_cont&lt;/strong&gt; é a combinação do nome da colune &lt;strong&gt;title&lt;/strong&gt; com o predicado &lt;strong&gt;*_cont&lt;/strong&gt;, o controlador recebe esse parametro como &lt;strong&gt;params[:q]&lt;/strong&gt; e realiza a busca com o valor &lt;strong&gt;title&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No segundo exemplo, o Ransack recebe como parametro os filtros &lt;strong&gt;title_cont&lt;/strong&gt; e &lt;strong&gt;author_eq&lt;/strong&gt;, com os valores &lt;strong&gt;title&lt;/strong&gt; e &lt;strong&gt;author&lt;/strong&gt;, respectivamente. Da mesma forma como no primeiro exemplo o controlador recebe esses parametros para realizar a busca com os valores &lt;strong&gt;title&lt;/strong&gt; e &lt;strong&gt;author&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;O Ransack é uma ferramenta poderosa que simplifica a construção de consultas dinâmicas em aplicativos Rails. Com sua sintaxe amigável e recursos abrangentes, ele permite que os desenvolvedores criem interfaces de usuário poderosas e flexíveis para interagir com bancos de dados. Ao usar o Ransack como sua Query Language em Rails, você pode construir aplicativos mais eficientes e fáceis de usar para seus usuários.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sabia Mais
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://activerecord-hackery.github.io/ransack/" rel="noopener noreferrer"&gt;Ransack Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ruby</category>
      <category>programming</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Query Language</title>
      <dc:creator>Fabiano Santos Florentino</dc:creator>
      <pubDate>Sun, 28 Jan 2024 02:39:16 +0000</pubDate>
      <link>https://dev.to/fabianoflorentino/query-language-36dn</link>
      <guid>https://dev.to/fabianoflorentino/query-language-36dn</guid>
      <description>&lt;p&gt;Uma "Query Language" (QL), em tradução literal "Linguagem de Consulta", é uma linguagem de programação projetada especificamente para interagir com bancos de dados e recuperar informações deles. Essas linguagens são fundamentais para o desenvolvimento de aplicativos que precisam armazenar e manipular dados de maneira eficiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é uma Query Language?
&lt;/h2&gt;

&lt;p&gt;Uma Query Language é uma linguagem de programação usada para realizar operações em um banco de dados. Ela permite que os desenvolvedores definam e executem consultas para recuperar, inserir, atualizar ou excluir dados de um banco de dados relacional ou não relacional. As consultas são escritas em uma sintaxe específica que é interpretada pelo sistema de gerenciamento de banco de dados (SGBD).&lt;/p&gt;

&lt;h2&gt;
  
  
  Principais Características
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Estruturada:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uma Query Language geralmente é estruturada em termos de sua sintaxe e gramática. Isso ajuda a garantir consistência e compreensibilidade ao escrever consultas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Declarativa&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em muitos casos, uma QL é declarativa, o que significa que você descreve o que deseja alcançar e não precisa se preocupar com os detalhes de como isso será feito. O SGBD cuida da implementação das consultas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tipos de Operações:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uma QL permite realizar uma variedade de operações, como seleção (recuperação de dados), inserção, atualização e exclusão de registros.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplos de Query Languages:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SQL (Structured Query Language):&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.w3schools.com/sql/sql_intro.asp" rel="noopener noreferrer"&gt;SQL&lt;/a&gt; é a linguagem de consulta mais comum e amplamente utilizada para bancos de dados relacionais. Permite realizar operações como &lt;strong&gt;SELECT&lt;/strong&gt;, &lt;strong&gt;INSERT&lt;/strong&gt;, &lt;strong&gt;UPDATE&lt;/strong&gt; e &lt;strong&gt;DELETE&lt;/strong&gt; em tabelas. NoSQL Query Languages: Existem várias Query Languages associadas a bancos de dados NoSQL, como MongoDB Query Language (MQL) para MongoDB e Couchbase Query Language (N1QL) para Couchbase.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GraphQL:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://graphql.org/learn/" rel="noopener noreferrer"&gt;GraphQL&lt;/a&gt; é uma linguagem de consulta poderosa e flexível que permite aos desenvolvedores solicitar exatamente os dados necessários em uma API web. Diferentemente de abordagens tradicionais de API, onde os clientes têm acesso a endpoints predefinidos que retornam dados fixos, o GraphQL permite que os clientes especifiquem exatamente quais dados precisam, o que resulta em consultas mais eficientes e em respostas mais enxutas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OData:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/odata/overview" rel="noopener noreferrer"&gt;OData&lt;/a&gt; é um protocolo de padrão aberto desenvolvido pela Microsoft que permite a criação e consumo de APIs RESTful de forma mais eficiente e consistente. Ele define um conjunto de regras para criar consultas avançadas, filtrar, ordenar e paginar dados em APIs RESTful.&lt;/p&gt;

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

&lt;p&gt;Uma Query Language é uma parte fundamental do desenvolvimento de aplicativos que interagem com bancos de dados. Seja SQL para bancos de dados relacionais ou uma QL específica para um banco de dados NoSQL, entender e dominar a linguagem de consulta apropriada é essencial para desenvolver aplicativos robustos e eficientes.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>programming</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Ruby on Rails</title>
      <dc:creator>Fabiano Santos Florentino</dc:creator>
      <pubDate>Thu, 27 Jul 2023 16:09:22 +0000</pubDate>
      <link>https://dev.to/fabianoflorentino/ruby-on-rails-2i0e</link>
      <guid>https://dev.to/fabianoflorentino/ruby-on-rails-2i0e</guid>
      <description>&lt;p&gt;Ruby on Rails é um framework popular de desenvolvimento web em Ruby, que adota o padrão arquitetural MVC para separar a aplicação em Model, View e Controller. Com ênfase em "Convenção sobre Configuração", o Rails permite desenvolver rapidamente com menos código. Oferecendo operações CRUD simplificadas, suporte a Gemas para adicionar funcionalidades extras e Scaffolding para prototipagem ágil. Além disso, o framework conta com Active Record para mapear dados do banco de dados em objetos Ruby e Rake para executar tarefas importantes. O Rails ainda garante segurança integrada e possui uma comunidade ativa para suporte e aprendizado.&lt;/p&gt;

&lt;p&gt;Os principais pontos para entender melhor o Ruby on Rails. Dominar esses pontos ajudará você a entender melhor o funcionamento do Ruby on Rails e a tirar o máximo proveito desse poderoso framework de desenvolvimento web.&lt;/p&gt;

&lt;h2&gt;
  
  
  MVC (Model-View-Controller)
&lt;/h2&gt;

&lt;p&gt;O Ruby on Rails segue o padrão arquitetural Model-View-Controller, que separa a aplicação em três componentes principais. O Model representa a camada de dados e a lógica de negócios, o View é responsável pela interface do usuário e o Controller manipula as interações do usuário e coordena as ações.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Imagine que estamos criando um aplicativo de lista de tarefas (to-do list). O Model seria a classe que representa uma tarefa, contendo atributos como título, descrição e status. O View seria a interface do usuário, onde ele verá a lista de tarefas e poderá adicionar novas tarefas. O Controller seria responsável por manipular as requisições do usuário, como adicionar uma nova tarefa à lista.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://guiarails.com.br/getting_started.html#mvc-e-voce" rel="noopener noreferrer"&gt;https://guiarails.com.br/getting_started.html#mvc-e-voce&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Convenção sobre Configuração
&lt;/h2&gt;

&lt;p&gt;O Rails segue o princípio de "Convenção sobre Configuração", o que significa que ele possui uma série de convenções bem definidas que permitem que os desenvolvedores escrevam menos código para configurar a aplicação. Isso torna o desenvolvimento mais rápido e fácil.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ao criar um novo projeto Ruby on Rails, o Rails já define a estrutura de diretórios e arquivos padrão para o projeto. Por exemplo, os modelos devem ser colocados na pasta "app/models", os controladores em "app/controllers" e as visualizações em "app/views".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://guiarails.com.br/getting_started.html#criando-a-aplicacao-blog" rel="noopener noreferrer"&gt;https://guiarails.com.br/getting_started.html#criando-a-aplicacao-blog&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Arquivo/Pasta&lt;/th&gt;
&lt;th&gt;Objetivo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;app/&lt;/td&gt;
&lt;td&gt;Contém os controllers, models, views, helpers, mailers, channels, jobs, e assets para sua aplicação. Você irá se concentrar nesse diretório pelo restante desse guia.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bin/&lt;/td&gt;
&lt;td&gt;Contém o script rails que inicializa sua aplicação e contém outros scripts que você utiliza para configurar, atualizar, colocar em produção ou executar sua aplicação.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;config/&lt;/td&gt;
&lt;td&gt;Contém configurações de rotas, banco de dados entre outros de sua aplicação. Este conteúdo é abordado com mais detalhes em Configuring Rails Applications.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;config.ru&lt;/td&gt;
&lt;td&gt;Configuração Rack para servidores baseados em Rack usados para iniciar a aplicação. Para mais informações sobre o Rack, consulte Rack website.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;db/&lt;/td&gt;
&lt;td&gt;Contém o schema do seu banco de dados atual, assim como as migrations do banco de dados.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemfile&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemfile.lock&lt;/td&gt;
&lt;td&gt;Esses arquivos permitem que você especifique quais dependências de gem são necessárias na sua aplicação Rails. Esses arquivos são usados pela gem Bundler. Para mais informações sobre o Bundler,&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lib/&lt;/td&gt;
&lt;td&gt;Módulos extendidos da sua aplicação.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;log/&lt;/td&gt;
&lt;td&gt;Arquivos de log da aplicação.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;public/&lt;/td&gt;
&lt;td&gt;Contém arquivos estáticos e assets compilados. Quando sua aplicação está rodando esse diretório é exposto como ele está.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rakefile&lt;/td&gt;
&lt;td&gt;Este arquivo localiza e carrega tarefas que podem ser rodadas por linhas de comando. As tarefas são definidas nos componentes do Rails. Ao invés de editar o Rakefile, você deve criar suas próprias&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;README.md&lt;/td&gt;
&lt;td&gt;Este é um manual de instruções para sua aplicação. Você deve editar este arquivo para informar o que seu aplicativo faz, como configurá-lo e assim por diante.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;storage/&lt;/td&gt;
&lt;td&gt;Arquivos de armazenamento ativo do serviço de disco. Mais informações em Active Storage Overview.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;test/&lt;/td&gt;
&lt;td&gt;Testes unitários, fixtures, e outros tipos de testes. Mais informações em Testing Rails Applications.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tmp/&lt;/td&gt;
&lt;td&gt;Arquivos temporários (como cache e arquivos pid).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vendor/&lt;/td&gt;
&lt;td&gt;Diretório com todos os códigos de terceiros. Em uma típica aplicação Rails inclui vendored gems.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.gitignore&lt;/td&gt;
&lt;td&gt;Este arquivo diz ao Git quais arquivos (ou padrões) devem ser ignorados. Acesse GitHub - Ignoring files para mais informações sobre arquivos ignorados.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.ruby-version&lt;/td&gt;
&lt;td&gt;Este arquivo contém a versão padrão do Ruby.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  CRUD Simplificado
&lt;/h2&gt;

&lt;p&gt;O Rails oferece operações CRUD (Create, Read, Update, Delete) de forma simples e direta. Com apenas algumas linhas de código, é possível criar interfaces para interagir com bancos de dados.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para criar as operações CRUD para a nossa lista de tarefas, basta executar o seguinte comando no terminal Rails
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails generate scaffold Task title:string description:text status:boolean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://guiarails.com.br/getting_started.html#operacoes-crud" rel="noopener noreferrer"&gt;https://guiarails.com.br/getting_started.html#operacoes-crud&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Gemas (Gems):
&lt;/h2&gt;

&lt;p&gt;As Gemas são pacotes de código Ruby que podem ser facilmente adicionados à aplicação para adicionar funcionalidades extras. O Ruby on Rails possui uma grande quantidade de gemas disponíveis, o que facilita a incorporação de recursos adicionais à sua aplicação.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Suponha que precisamos adicionar um calendário à nossa aplicação de lista de tarefas. Podemos pesquisar uma gema existente para isso, como a &lt;strong&gt;'simple_calendar'&lt;/strong&gt;. Então, adicionamos essa gema ao arquivo "Gemfile" e executamos "bundle install" para instalá-la. O Gemfile é o arquivo que contém todas as gemas que serão utilizadas na aplicação com a versão definida. O Gemfile.lock força as versões de cada gem que estão sendo utilizadas no seu projeto. Isso é pra evitar que o projeto fique com verões de gems diferentes em outros lugares.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em seguida, podemos seguir a documentação da gema para integrá-la às nossas visualizações e controladores para exibir um calendário de tarefas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gem &lt;span class="nb"&gt;install &lt;/span&gt;simple_calendar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://rubygems.org/" rel="noopener noreferrer"&gt;https://rubygems.org/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Scaffolding
&lt;/h2&gt;

&lt;p&gt;O Scaffolding é uma ferramenta do Rails que permite gerar automaticamente partes básicas de uma aplicação, como modelos, controladores e visualizações. Isso é útil para criar rapidamente protótipos de funcionalidades.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Como mencionado no exemplo anterior, o comando "rails generate scaffold" cria rapidamente todas as partes básicas necessárias para um recurso (no exemplo, "Task"), incluindo o modelo, o controlador e as visualizações para as operações CRUD.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.rubyguides.com/2020/03/rails-scaffolding/" rel="noopener noreferrer"&gt;https://www.rubyguides.com/2020/03/rails-scaffolding/&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails generate scaffold books
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;This example creates:

A BooksController
A Book model
A new resources :books route added to your config/routes.rb file
A set of testing-related files
View files under app/views/books (five in total)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Active Record
&lt;/h2&gt;

&lt;p&gt;O Active Record é a camada de ORM (Mapeamento Objeto-Relacional) do Rails. Ele mapeia os registros do banco de dados para objetos Ruby e vice-versa, permitindo que você trabalhe com dados do banco de dados de forma orientada a objetos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Active Record permite que você defina facilmente um modelo e use-o para interagir com o banco de dados. Por exemplo, com o modelo "Task" criado pelo scaffolding, podemos criar uma nova tarefa e salvá-la no banco de dados desta forma:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;title: &lt;/span&gt;&lt;span class="s1"&gt;'Comprar mantimentos'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;description: &lt;/span&gt;&lt;span class="s1"&gt;'Ir ao supermercado'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;status: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://guiarails.com.br/active_record_basics.html" rel="noopener noreferrer"&gt;https://guiarails.com.br/active_record_basics.html&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Rake
&lt;/h2&gt;

&lt;p&gt;Rake é uma ferramenta de linha de comando que vem com o Rails e permite executar tarefas como migrações de banco de dados, execução de testes, entre outras operações úteis.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Rake permite que você execute tarefas definidas no Rakefile do projeto. Por exemplo, podemos criar uma tarefa personalizada para imprimir todas as tarefas no console:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# No Rakefile&lt;/span&gt;
&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:list_tasks&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;
  &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; - &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; (&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# No terminal&lt;/span&gt;
&lt;span class="n"&gt;rake&lt;/span&gt; &lt;span class="n"&gt;list_tasks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://guiarails.com.br/command_line.html" rel="noopener noreferrer"&gt;https://guiarails.com.br/command_line.html&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Rotas (Routes)
&lt;/h2&gt;

&lt;p&gt;O Rails usa um sistema de roteamento para direcionar as solicitações HTTP para os controladores adequados. Isso permite que você defina facilmente as URLs da aplicação.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Podemos definir rotas no arquivo "config/routes.rb". Por exemplo, para definir uma rota para exibir uma lista de tarefas, faríamos o seguinte:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# No config/routes.rb&lt;/span&gt;
&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;draw&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;resources&lt;/span&gt; &lt;span class="ss"&gt;:tasks&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso criará as seguintes rotas:&lt;/p&gt;

&lt;p&gt;GET /tasks (index)&lt;br&gt;
GET /tasks/new (new)&lt;br&gt;
POST /tasks (create)&lt;br&gt;
GET /tasks/:id (show)&lt;br&gt;
GET /tasks/:id/edit (edit)&lt;br&gt;
PATCH /tasks/:id (update)&lt;br&gt;
PUT /tasks/:id (update)&lt;br&gt;
DELETE /tasks/:id (destroy)&lt;/p&gt;

&lt;p&gt;O Rails gera automaticamente essas rotas e as mapeia para as ações correspondentes no controlador.&lt;/p&gt;

&lt;p&gt;Para fixar a rota você pode usar asssim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# No config/routes.rb&lt;/span&gt;
&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;draw&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;resources&lt;/span&gt; &lt;span class="ss"&gt;:tasks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;only: &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://guiarails.com.br/configuring.html#initializers" rel="noopener noreferrer"&gt;https://guiarails.com.br/configuring.html#initializers&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Segurança
&lt;/h2&gt;

&lt;p&gt;O Rails possui recursos integrados para ajudar a proteger a aplicação contra ameaças comuns, como ataques de injeção de SQL, ataques CSRF (Cross-Site Request Forgery) e mais.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Rails possui recursos de segurança integrados, como proteção contra ataques CSRF. Isso é feito automaticamente através do uso de um token de autenticidade em formulários gerados pelo Rails.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://guiarails.com.br/getting_started.html#seguranca" rel="noopener noreferrer"&gt;https://guiarails.com.br/getting_started.html#seguranca&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Comunidade e Documentação
&lt;/h2&gt;

&lt;p&gt;O Ruby on Rails possui uma comunidade ativa e solidária, com muitos recursos de aprendizado, fóruns e documentação disponíveis online. É fácil encontrar ajuda e respostas para dúvidas através da comunidade Rails.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A comunidade Rails é bastante ativa, e você pode encontrar muita documentação e recursos online. Por exemplo, você pode visitar o site oficial do Ruby on Rails (&lt;a href="https://rubyonrails.org/" rel="noopener noreferrer"&gt;https://rubyonrails.org/&lt;/a&gt;) para encontrar a documentação oficial e o GitHub (&lt;a href="https://github.com/rails/rails" rel="noopener noreferrer"&gt;https://github.com/rails/rails&lt;/a&gt;) para acessar o código-fonte e recursos adicionais.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Ruby on Rails é uma ferramenta poderosa e eficiente para o desenvolvimento web, permitindo aos desenvolvedores criar aplicações de forma ágil e produtiva. Ao seguir o padrão MVC e adotar a "Convenção sobre Configuração", o framework simplifica a estruturação e configuração do projeto, acelerando o processo de desenvolvimento. Com recursos como Gemas, Scaffolding, Active Record e Rake, o Rails oferece ferramentas práticas e integradas para lidar com diversas tarefas com facilidade. Além disso, a preocupação com a segurança e a presença de uma comunidade ativa tornam o Ruby on Rails uma escolha popular e confiável para desenvolvedores em todo o mundo. Se você deseja construir aplicações web de forma eficiente e segura, dominar os principais conceitos do Ruby on Rails é essencial para obter resultados bem-sucedidos e satisfatórios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Empresas que usam Ruby:&lt;/strong&gt; &lt;a href="https://www.google.com/search?q=ruby+on+rails+plataforms&amp;amp;oq=ruby+on+rails+plataforms&amp;amp;aqs=edge..69i57j0i22i30l2j0i390i650l3j69i64l2.7987j0j1&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8" rel="noopener noreferrer"&gt;https://www.google.com/search?q=ruby+on+rails+plataforms&amp;amp;oq=ruby+on+rails+plataforms&amp;amp;aqs=edge..69i57j0i22i30l2j0i390i650l3j69i64l2.7987j0j1&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://rubyonrails.org/" rel="noopener noreferrer"&gt;https://rubyonrails.org/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>programming</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Microserviços Desafios e Desvantagens</title>
      <dc:creator>Fabiano Santos Florentino</dc:creator>
      <pubDate>Fri, 02 Jun 2023 16:53:59 +0000</pubDate>
      <link>https://dev.to/fabianoflorentino/microservicos-desafios-e-desvantagens-34o8</link>
      <guid>https://dev.to/fabianoflorentino/microservicos-desafios-e-desvantagens-34o8</guid>
      <description>&lt;p&gt;A arquitetura de microserviços ganhou popularidade devido à sua capacidade de oferecer escalabilidade, flexibilidade e agilidade no desenvolvimento de software. No entanto, sua implementação apresenta desafios significativos que precisam ser enfrentados para garantir o sucesso do sistema. Neste contexto, se destaca os seguintes pontos no desafio de implementar essa arquitetura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Desafios
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Decomposição do sistema&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dividir um sistema monolítico em microserviços requer uma análise cuidadosa para definir os limites corretos e garantir a coesão entre os serviços. Isso envolve identificar as funcionalidades que pode ser encapsuladas em microserviços independentes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gerenciamento de comunicação&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A comunicação entre os microserviços deve ser eficiente e confiável. É necessário escolher os mecanismos adequados de comunicação síncrona e assíncrona, como mensagens ou chamadas de API, e garantir a tolerância a falhas e a escalabilidade na troca de informações entre eles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Controle de transações distribuidas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Em um ambiente de microserviços, quando várias operações precisam ser realizadas de forma transacional, garantir a consistência dos dados se torna um desafio complexo. É necessário adotar padrões e técnicas como compensação, consistência eventual ou uso de barramento de eventos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gerenciamento de configuração&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Com grande número de microserviços, o gerenciamento de configurações e variáveis de ambiente se torna difícil e propenso a erros. É necessário estabelecer uma estratégia de armazenar, distribuir e atualizar as configurações dos serviços de forma consistente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitoramento e rastreamento&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rastrear e monitorar o fluxo de solicitações entre os microserviços é essencial para solucionar problemas de desempenho e identificar possíveis gargalos. É necessário implementar ferramentas e técnicas de monitoramento e observabilidade, como logs distribuídos, métricas e rastreamento de solicitações.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gerenciamento de versões&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Manter várias versões dos microserviços e coordenar as atualizações e migração entre eles requer um processo cuidadoso para evitar incompatibilidade e interrupções no sistema. É necessário adotar boas práticas de versionamento, testes de regressão e estratégias de rollout controlado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Garantia de disponibilidade&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A falha de um microserviço não pode comprometer todo o sistema. É necessário implementar mecanismos de recuperação de falhas, como replicações, balanceamento de carga e estratégias de fallback e circuitbreak, para garantir a disponibilidade contínua do sistema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Segurança&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cada microserviço deve ser protegido contra ameaças de segurança. É necessário adotar medidas como autenticação, autorização, criptografia de dados e auditoria de acesso para garantir a integridade e confidencialidade dos dados em um ambiente distribuído.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testes e deploy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A complexidade dos testes aumenta com o número de microserviços envolvidos. A abordagem de teste deve ser automatizado e eficiente, como testes de unidade, integração e contrato, além de investir em pipeline de entrega contínua para facilitar o deploy dos serviços.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Governança e cultura organizacional&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A adoção de uma arquitetura de microserviços muitas vezes requer uma mudança cultural significativa na organização, bem como a definição de padrões de governança para garantir a consistência e o alinhamento dos serviços. É necessário estabelecer práticas de colaboração, comunicação e documentação entre as equipes.&lt;/p&gt;

&lt;p&gt;A arquitetura de microserviços tem sido amplamente adotada devido às suas vantagens de escalabilidade, flexibilidade e agilidade. No entando, é importante reconhecer que essa abordagem também apresenta desvantagens significativas. Ao optar por uma arquitetura de microserviços, as organizações devem estar cientes dos desafios que podem surgir ao longo do caminho. A decomposição do sistema em vários microserviços aumenta a complexidade geral do sistema, tornando o entendimento a manutenção e o gerenciamento mais complexos. Além disso, a comunicação entre os microserviços requer uma implantação cuidadosa e pode resultar em problemas de desempenho e integridade do sistema. A garantia da consistência dos dados em transações distribuídas também é um desafio, exigindo o uso de técnicas específicas. O gerencimaneto de configuração, monitoramento, versões, segurança, testes e governança são áreas adicionais que se tornam mais complexas com a arquitetura de microserviços. Embora essas desvantagens possam ser superadas com planejamento adequado, adoção de boas práticas e ferramentas adequadas, é essencial estar ciente delas para tomar decisões informadas ao adotar essa arquitetura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Desvantagens
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Complexidade do sistema&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A decomposição de um sistema monolítico em microserviços introduz uma maior complexidade ao ambiente. Com múltiplos serviços interconectados, entender e manter a arquitetura como um todo pode se tornar um desafio. Cada microserviço possui sua própria lógica de negócio, requisitos de comunicação e dependências externas, o que aumenta a complexidade geral do sistema. A coordenação e a resolução de problemas que envolvem múltiplos serviços podem exigir um esforço adicional devido à natureza distribuída da arquitetura.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gerenciamento de comunicação&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A comunicação entre os microserviços é fundamental para o funcionamento correto do sistema. No entanto, coordenar essa comunicação de forma eficiente pode ser desafiador. É necessário escolher os protocolos, formatos de mensagem e estratégias de troca de dados adequados. Além disso, problemas de desempenho, latência e perda de dados podem surgir, afetando a integridade e o desempenho geral do sistema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Controle de transações distribuídas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No ambiente de microserviços, garantir a consistência dos dados em transações distribuídas pode ser complexo. Diferentes microserviços podem precisar se comunicar e coordenar suas operações para manter a integridade dos dados. A implementação de transações distribuídas requer técnicas avançadas, como compensação, consistência eventual ou o uso de um &lt;a href="https://learn.microsoft.com/pt-br/dotnet/architecture/microservices/multi-container-microservice-net-applications/integration-event-based-microservice-communications" rel="noopener noreferrer"&gt;barramento de eventos&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gerenciamento de configuração&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Com um grande número de microserviços, o gerenciamento de configuração se torna mais desafiador. Cada serviço pode ter suas próprias configurações, variáveis de ambiente e dependências externas. Manter e atualizar essas configurações de forma consistente em um ambiente distribuído requer uma estratégia adequada, evitando erros e inconsistências.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitoramento e rastreamento&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rastrear e monitorar o fluxo de solicitações entre os microserviços é essencial para identificar problemas de desempenho, depuração e análise de erros. No entanto, em uma arquitetura de microserviços, o rastreamento e o monitoramento podem se tornar mais complexos devido à naturaza distribuída dos serviços. É necessário implementar ferramentas e técnicas apropriadas, como logs distribuídos, métricas e rastreamento de solicitações, para obter insights valiosos sobre o sistema como um todo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gerenciamento de versões&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Manter várias versões dos microserviços e coordenar as atualizações entre eles pode ser um desafio. À medida que os serviços evoluem independentemente, diferentes verões podem coexistir, resultando em possíveis incompatibildiades e complexidades de integração. É necessário adotar práticas sólidas de versionamento, testes de regressão e estratégias de rollout controlado para minimizar interrupções e garantir a compatibilidade entre os serviços.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impacto na disponibilidade&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A falha de um único microserviço pode ter um impacto direto na disponibilidade geral do sistema. Uma vez que os microserviços são independentes, se um serviço enfrentar problemas, pode afetar a funcionalidade de outros serviços que dependem dele. É necessário implementar estratégias de resiliência, como &lt;a href="https://microservices.io/patterns/reliability/circuit-breaker.html" rel="noopener noreferrer"&gt;circuit breaker&lt;/a&gt; e &lt;a href="https://badia-kharroubi.gitbooks.io/microservices-architecture/content/patterns/communication-patterns/fallback-pattern.html" rel="noopener noreferrer"&gt;fallbacks&lt;/a&gt;, para lidar com falhas e garantir a continuidade do serviço.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Segurança&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A segurança em uma arquitetura de microserviços é um desafio complexo. Com várias partes do sistema em execução independetemente, é necessário proteger cada microserviço individualmente e garantir a segurança das comunicações entre eles. A implementação de autenticação, autorização e proteção de dados sensíveis em um ambiente distribuído requer uma abordagem cuidadosa e o uso de práticas de segurança adequadas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complexidade dos testes de deploy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Com o aumento do número de microserviços, a complexidade dos testes e do processo de deploy também aumenta. É necessário garantir que cada microserviço seja testado individualmente, além de realizar testes de integração para verificar a interação correta entre eles. Além disso, a implamtação dos serviços em um ambiente distribuído requer estratégias de implantação eficiente e automatizadas para garantir um processo suave e consistente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desafios de governança e cultura organizacional&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A adoção da arquitetura de microserviços pode exigir mudanças culturais e estabelecimento de governança para garantir a consistência e o alinhamento dos serviços. É necessário estabelecer práticas de colaboração, comunicação e documentação entre as equipes de desenvolvimento e operações. Além disso, a definição de padrões de governança é essencial para garantir a conformidade e a compatibilidade entre os microserviços.&lt;/p&gt;

&lt;h2&gt;
  
  
  Então...
&lt;/h2&gt;

&lt;p&gt;a arquitetura de microserviços apresenta desafios significativos, incluindo a complexidade do sistema, o gerenciamento da comunicação, o controle de transações distribuídas, a administração da configuração, o monitoramento e rastreamento, o gerenciamento de versões, o impacto na disponibilidade, os desafios de segurança, a complexidade dos testes e implementações, e os desafios de governança e cultura organizacional. No entanto, essas dificuldades podem ser superadas por meio de um planejamento criterioso, a adoção de melhores práticas e a utilização de ferramentas adequadas. Ao enfrentar essas desvantagens, as organizações podem aproveitar os benefícios da arquitetura de microserviços, criando sistemas escaláveis, flexíveis e resilientes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Algumas referências
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://microservices.io/index.html" rel="noopener noreferrer"&gt;microservices.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://badia-kharroubi.gitbooks.io/microservices-architecture/content/strategy/what-is-microservices-architecture.html" rel="noopener noreferrer"&gt;What is Microservice Architecture?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.lambda3.com.br/2019/02/lambda3-podcast-128-microsservicos/" rel="noopener noreferrer"&gt;128 - Microserviços&lt;/a&gt;, &lt;strong&gt;este é uma série de 6 epsódios de podcast em PT-BR&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com.br/Microsservi%C3%A7os-Prontos-Para-Produ%C3%A7%C3%A3o-Padronizados/dp/8575226215/ref=sr_1_1?qid=1685722493&amp;amp;refinements=p_27%3ASusan+Fowler&amp;amp;s=books&amp;amp;sr=1-1" rel="noopener noreferrer"&gt;Microsserviços Prontos Para a Produção: Construindo Sistemas Padronizados em uma Organização de Engenharia de Software&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/pt-br/dotnet/architecture/microservices/architect-microservice-container-applications/microservices-architecture" rel="noopener noreferrer"&gt;Arquitetura de microsserviços&lt;/a&gt;&lt;/p&gt;

</description>
      <category>distributed</category>
      <category>computing</category>
      <category>microservices</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Projeto de Software</title>
      <dc:creator>Fabiano Santos Florentino</dc:creator>
      <pubDate>Sun, 21 May 2023 15:37:23 +0000</pubDate>
      <link>https://dev.to/fabianoflorentino/projeto-de-software-544b</link>
      <guid>https://dev.to/fabianoflorentino/projeto-de-software-544b</guid>
      <description>&lt;p&gt;O processo de projeto de software desempenha um papel crucial no desenvolvimento de sistemas eficientes e confiáveis. A seguir está uma introdução aos principais pontos envolvidos nessa fase, desde a compreensão da modelagem do sistema até a elaboração dos diagramas necessários para a implementação. Modelos de análise de software, como análise estruturada e orientação a objetos, e a importância de documentar a visão do projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entender a fase de projeto de um sistema (modelagem)
&lt;/h2&gt;

&lt;p&gt;Antes de começar a projetar um sistema de software, é essencial compreender os requisitos e as necessidades dos usuários. A fase de modelagem envolve a criação de representações abstratas do sistema, como diagramas, para ajudar a visualizar e estruturar a solução. Isso inclui identificar os principais componentes, suas interações e fluxos de dados.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ao projetar um sistema de reservas de hotéis, a modelagem envolveria a identificação dos atores principais (usuários, administradores, etc.), as funcionalidades necessárias e as informações que devem ser armazenadas (quartos, reservas, etc.).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Modelo de análise de software (Análise estruturada)
&lt;/h2&gt;

&lt;p&gt;A análise estruturada é uma abordagem que divide o sistema em componentes hierárquicos, como módulo de funções. É baseada em técnica como fluxogramas, diagramas de fluxo de dados e especificações de processo. Essa abordagem permite uma compreensão clara da lógica do sistema e dos fluxos de informação.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um diagrama de fluxo de dados seria usado para mostrar como as informações fluem em um sistema de vendas, desde o momento em que um pedido é feito até a sua entrega.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Modelo de análise de software &lt;a href="https://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objetos" rel="noopener noreferrer"&gt;(Orientação a objetos)&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;A análise orientada a objetos é uma abordagem de modelagem que enfoca a identificação de objetos e suas interações para resolver problemas. Ela envolve a criação de classes, atributos, métodos e relacionamentos entre os objetos. Essa abordagem permite a reutilização de código e facilita a compreensão e a manutenção do sistema.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Em um sistema de biblioteca, seriam identificados objetos como livros, usuários e empréstimos, e suas iterações seriam representadas por meio de relacionamentos como &lt;a href="https://pt.wikipedia.org/wiki/Associa%C3%A7%C3%A3o_(programa%C3%A7%C3%A3o)" rel="noopener noreferrer"&gt;associação&lt;/a&gt;, &lt;a href="https://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objetos#A%C3%A7%C3%A3o_nos_objetos" rel="noopener noreferrer"&gt;agregação&lt;/a&gt; e &lt;a href="https://pt.wikipedia.org/wiki/Heran%C3%A7a_(programa%C3%A7%C3%A3o_orientada_a_objetos)" rel="noopener noreferrer"&gt;herança&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Projetar a solução
&lt;/h2&gt;

&lt;p&gt;Com base na modelagem e nas técnicas de análise escolhidas, o próximo passo é projetar a solução para o sistema de software. Isso envolve tomar decisões sobre a arquitetura, a divisão em módulos e a escolha das tecnologias adequadas. O objetivo é criar uma estrutura sólida e eficiente que atenda aos requisitos do sistema.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um sistema de gerenciamento de tarefas, pode-se decidir usar uma &lt;a href="https://pt.wikipedia.org/wiki/Modelo_em_tr%C3%AAs_camadas" rel="noopener noreferrer"&gt;arquitetura de três camadas (Apresentação, lógica de negócio e persistência)&lt;/a&gt;, com a utilização de um banco de dados relacional para armazenar as informações.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Documentar a visão do projeto
&lt;/h2&gt;

&lt;p&gt;A documentação é essencial para garantir que a visão do projeto seja claramente comunicada e compreendida por todas as partes envolvidas. Isso inclui descrever os objetivos, requisitos, restrições e decisões tomadas durante a fase de projeto. A documentação também serve como uma referência útil para futuras manutenções e melhorias no sistema.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A documentação do projeto de um sistema de comércio eletrônico pode incluir a descrição dos &lt;a href="https://pt.wikipedia.org/wiki/Requisito_funcional" rel="noopener noreferrer"&gt;requisitos funcionais (como de usuários e realização de pedidos)&lt;/a&gt; e &lt;a href="https://pt.wikipedia.org/wiki/Requisito_n%C3%A3o_funcional" rel="noopener noreferrer"&gt;não funcionais (como desempenho e segurança)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Elaborar o diagrama de casos de uso
&lt;/h2&gt;

&lt;p&gt;O diagrama de casos de uso é uma representação visual das funcionalidades do sistema a partir da perspectiva dos usuários. Ele identifica os atores envolvidos e as interações entre eles, fornecendo uma visão geral dos principais recursos do fluxo do sistema.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um sistema de reservas de passagens áreas, um caso de uso seria "realizar reservas" envolvendo interações entre o usuário, o sistema de reservas e o sistema de pagamento.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Elaborar o diagrama de classes
&lt;/h2&gt;

&lt;p&gt;O diagrama de classes é usado na análise orientada a objetos para representar a estrutura e as relações entre as classes do sistema. Ele descreve as propriedades (atributos) e comportamentos (métodos) de cada classe, além dos relacionamentos entre elas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um diagrama de classes para um sistema de gerenciamento de alunos pode incluir classes como "Aluno", "Curso" e "Matrícula", com atributos como nome, idade e número de matrícula.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Elaborar o diagrama de sequência
&lt;/h2&gt;

&lt;p&gt;O diagrama de sequência mostra a interação entre os objetos do sistema ao longo do tempo, representando a ordem das mensagens trocadas entre eles. Ele ajuda a compreender como o sistema responde a determinadas ações e eventos, auxiliando no projeto detalhado da funcionalidade.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um diagrama de sequência para um sistema de pagamentos online pode mostrar a sequência de eventos desde o momento em que o usuário seleciona os itens até a confirmação do pagamento.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Por que usar projeto de software na construção de um sistema?
&lt;/h2&gt;

&lt;p&gt;O uso de software está cada vez mais presente em nossas vidas, seja no trabalho, em casa ou no lazer. A cada dia, novos softwares são desenvolvidos para atender às necessidades de diferentes usuários. Mas, como esses softwares são desenvolvidos? Como garantir que eles atendam às necessidades dos usuários? Como garantir que eles sejam confiáveis e seguros? Como garantir que eles sejam desenvolvidos dentro do prazo e do orçamento? Como garantir que eles sejam desenvolvidos de forma eficiente e eficaz?&lt;/p&gt;

&lt;p&gt;O uso de projeto de software na construção de um sistema é extremamente importante por várias razões e, por isso, é um dos principais tópicos abordados na disciplina de Engenharia de Software. Abaixo estão alguns dos principais benefícios do uso de projeto de software na construção de um sistema:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Organização e estrutura&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O projeto de software permite uma abordagem estruturada e organizada para o desenvolvimento do sistema. Ele ajuda a definir uma arquitetura clara e a dividir o trabalho em tarefas gerenciáveis. Isso facilita o entendimento e a colaboração entre os membros da equipe de desenvolvimento.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Atendimento aos requisitos&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O projeto de software garante que os requisitos do sistema seja compreendidos e atendidos adequadamente. Através da modelagem de documentação, é possível identificar os principais componentes e funcionalidades necessárias, evitando assim a omissão de requisitos importantes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Redução de erros e retrabalho&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ao projetar um sistema de software, é possível identificar possíveis problemas e antecipar soluções. Através de revisões e análises, é possível detectar error e inconsistências antes de implementação. Isso ajuda a reduzir o retrabalho e os custos associados a correções posteriores.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Comunicação eficaz&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O projeto de software fornece uma linguagem comum para todos os envolvidos no desenvolvimento. Através dos diagramas e documentação, é possível comunicar de forma clara e visual as funcionalidades e o comportamento do sistema. Isso facilita a compreensão mútua e evita mal-entendidos entre a equipe de desenvolvimento e os stakeholders.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reutilização de código&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ao projetar um sistema de software de forma modular e orientada a objetos, é possível identificar oportunidades de reutilização de código. Isso significa que partes do sistema podem ser projetadas e implementadas uma vez e posteriormente utilizadas em diferentes contextos. Isso economiza tempo e esforço, além de promover a consistência e a manutenibilidade do sistema.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Facilidade de manutenção&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um projeto de software bem estruturado facilita a manutenção do sistema ao longo do tempo. Com uma documentação clara e a compreensão da estrutura do sistema, torna-se mais fácil realizar correções, melhorias e atualizações. Isso é particularmente importante em sistemas de longa duração, nos quais a manutenção pode ser uma parte significativa do ciclo de vida do software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Então(...)
&lt;/h2&gt;

&lt;p&gt;Um projeto de software bem estruturado facilita a manutenção do sistema ao longo do tempo. Com uma documentação clara e a compreensão da estrutura do sistema, torna-se mais fácil realizar correções, melhorias e atualizações. Isso é particularmente importante em sistema de longa duração, nos quais a manutenção pode ser uma parte significativa do ciclo de vida do software.&lt;/p&gt;

&lt;p&gt;O uso de projeto de software na construção de uma sistema é essencial para garantir a organização, compreensão dos requisitos, a redução de erros, a comunicação eficaz, a reutilização de código e a facilidade de manutenção. Ele proporciona uma abordagem estruturada e colaborativa, resultando em sistemas de software mais eficientes, confiáveis e sustentáveis.&lt;/p&gt;

&lt;p&gt;Como colocado anteriormente o projeto de software é uma etapa crucial no desenvolvimento de sistemas eficientes e confiáveis. Compreender a modelagem, escolher a abordagem de análise adequada, projetar a solução e documentar a visão do projeto são elementos fundamentais para o sucesso do projeto. A elaboração de diagramas de casos de uso, classes e sequência auxilia na visualização e comunicação das funcionalidades do sistema. Ao seguir essas práticas, os desenvolvedores podem criar sistemas robustos e fáceis de manter.&lt;/p&gt;

</description>
      <category>software</category>
      <category>engineering</category>
      <category>development</category>
    </item>
  </channel>
</rss>
