<?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: António Miguel</title>
    <description>The latest articles on DEV Community by António Miguel (@shivammiguel).</description>
    <link>https://dev.to/shivammiguel</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%2F1049300%2F4a743d56-93d1-4aa1-87c5-d9a00c3d5099.jpeg</url>
      <title>DEV Community: António Miguel</title>
      <link>https://dev.to/shivammiguel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shivammiguel"/>
    <language>en</language>
    <item>
      <title>Construindo APIs com Go (Golang) vs. Node.js: Uma comparação abrangente</title>
      <dc:creator>António Miguel</dc:creator>
      <pubDate>Thu, 25 May 2023 15:14:36 +0000</pubDate>
      <link>https://dev.to/shivammiguel/construindo-apis-com-go-golang-vs-nodejs-uma-comparacao-abrangente-bbl</link>
      <guid>https://dev.to/shivammiguel/construindo-apis-com-go-golang-vs-nodejs-uma-comparacao-abrangente-bbl</guid>
      <description>&lt;p&gt;As APIs (Interfaces de Programação de Aplicativos) desempenham um papel fundamental no desenvolvimento de aplicativos modernos, permitindo a comunicação e o intercâmbio de dados entre diferentes sistemas. Quando se trata de construir APIs robustas e eficientes, duas opções populares são Go (Golang) e Node.js. Neste artigo, vamos comparar essas duas tecnologias e explorar suas características e considerações importantes na construção de APIs.&lt;/p&gt;

&lt;p&gt;Desempenho e Escalabilidade&lt;/p&gt;

&lt;p&gt;Go é conhecido por seu desempenho de alto nível e eficiência. A linguagem foi projetada para ser rápida e escalável desde o início, utilizando uma execução concorrente eficiente e um sistema de gerenciamento de memória otimizado. Go é especialmente adequado para cargas de trabalho intensivas, onde a performance é uma prioridade.&lt;/p&gt;

&lt;p&gt;Node.js, por outro lado, possui um modelo de execução assíncrono baseado em eventos, permitindo que as APIs lidem com um grande número de solicitações simultâneas. Ele é construído sobre o mecanismo JavaScript V8 e possui um sistema de E/S não bloqueante que o torna adequado para aplicativos que dependem fortemente de operações de I/O.&lt;/p&gt;

&lt;p&gt;Em termos de desempenho e escalabilidade, tanto Go quanto Node.js têm seus pontos fortes. Go é mais adequado para cenários onde o desempenho é crítico, enquanto Node.js brilha em ambientes com muitas operações assíncronas.&lt;/p&gt;

&lt;p&gt;Facilidade de Desenvolvimento e Produtividade&lt;/p&gt;

&lt;p&gt;Node.js é amplamente conhecido por sua simplicidade e facilidade de uso. O JavaScript é uma linguagem popular e familiar para muitos desenvolvedores, permitindo um rápido desenvolvimento de protótipos e iterações ágeis. O vasto ecossistema de pacotes e bibliotecas do Node.js, disponíveis no npm (Node Package Manager), facilita a integração de funcionalidades adicionais às APIs.&lt;/p&gt;

&lt;p&gt;Go, por sua vez, possui uma sintaxe mais estruturada e rígida em comparação ao JavaScript. A linguagem é projetada para ser simples e legível, com uma abordagem que prioriza a clareza do código. Embora possa haver uma curva de aprendizado inicial para os desenvolvedores que não estão familiarizados com Go, sua estrutura organizada e regras de tipagem rígidas podem contribuir para a criação de código mais robusto e seguro.&lt;/p&gt;

&lt;h2&gt;
  
  
  golang API
&lt;/h2&gt;

&lt;p&gt;**package main&lt;/p&gt;

&lt;p&gt;import (&lt;br&gt;
    "encoding/json"&lt;br&gt;
    "log"&lt;br&gt;
    "net/http"&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;type User struct {&lt;br&gt;
    ID       int    &lt;code&gt;json:"id"&lt;/code&gt;&lt;br&gt;
    Username string &lt;code&gt;json:"username"&lt;/code&gt;&lt;br&gt;
    Email    string &lt;code&gt;json:"email"&lt;/code&gt;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;func main() {&lt;br&gt;
    http.HandleFunc("/users", getUsers)&lt;br&gt;
    log.Fatal(http.ListenAndServe(":8000", nil))&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;func getUsers(w http.ResponseWriter, r *http.Request) {&lt;br&gt;
    users := []User{&lt;br&gt;
        {ID: 1, Username: "user1", Email: "&lt;a href="mailto:user1@example.com"&gt;user1@example.com&lt;/a&gt;"},&lt;br&gt;
        {ID: 2, Username: "user2", Email: "&lt;a href="mailto:user2@example.com"&gt;user2@example.com&lt;/a&gt;"},&lt;br&gt;
    }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(users)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}**&lt;/p&gt;

&lt;h2&gt;
  
  
  Node js API
&lt;/h2&gt;

&lt;p&gt;**const express = require('express');&lt;/p&gt;

&lt;p&gt;const app = express();&lt;br&gt;
const port = 8000;&lt;/p&gt;

&lt;p&gt;app.get('/users', (req, res) =&amp;gt; {&lt;br&gt;
  const users = [&lt;br&gt;
    { id: 1, username: 'user1', email: '&lt;a href="mailto:user1@example.com"&gt;user1@example.com&lt;/a&gt;' },&lt;br&gt;
    { id: 2, username: 'user2', email: '&lt;a href="mailto:user2@example.com"&gt;user2@example.com&lt;/a&gt;' },&lt;br&gt;
  ];&lt;/p&gt;

&lt;p&gt;res.json(users);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;app.listen(port, () =&amp;gt; {&lt;br&gt;
  console.log(&lt;code&gt;Server running on port ${port}&lt;/code&gt;);&lt;br&gt;
});**&lt;/p&gt;

&lt;p&gt;Comparação:&lt;/p&gt;

&lt;p&gt;Sintaxe: A sintaxe de Go é mais estruturada e utiliza declarações explícitas de tipos, como podemos ver na definição da struct User. Já em Node.js, JavaScript possui uma sintaxe mais flexível e dinâmica, permitindo a definição dos objetos diretamente.&lt;/p&gt;

&lt;p&gt;Gerenciamento de Roteamento: Em Go, utilizamos o pacote net/http para criar rotas e manipular requisições HTTP. Em Node.js, podemos usar frameworks como Express.js para facilitar o gerenciamento de rotas.&lt;/p&gt;

&lt;p&gt;Serialização de JSON: Tanto Go quanto Node.js possuem suporte para a serialização de objetos para JSON. Em Go, usamos o pacote encoding/json, enquanto em Node.js, podemos usar o método res.json() do Express.js.&lt;/p&gt;

&lt;p&gt;Gerenciamento de Dependências: Em Go, o gerenciamento de dependências é nativo através do uso do módulo Go Modules, permitindo a definição e controle de dependências de forma integrada. Em Node.js, usamos o npm (Node Package Manager) para gerenciar as dependências do projeto.&lt;/p&gt;

&lt;p&gt;Ecossistema e Bibliotecas: Node.js possui um vasto ecossistema de pacotes e bibliotecas no npm, oferecendo soluções para diversas necessidades. Em Go, embora o ecossistema esteja crescendo, pode ser considerado menos abrangente em comparação ao Node.js. No entanto, Go possui uma biblioteca padrão poderosa que abrange muitas funcionalidades essenciais.&lt;/p&gt;

&lt;p&gt;Esses exemplos ilustram a construção de uma API básica em ambas as linguagens. É importante lembrar que a complexidade e os recursos necessários para uma API real podem variar e exigir abordagens mais sofisticadas. A escolha entre Go e Node.js para a construção de uma API dependerá dos requisitos do projeto.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Ainda na senda dos principios do SOLID....</title>
      <dc:creator>António Miguel</dc:creator>
      <pubDate>Thu, 11 May 2023 17:04:51 +0000</pubDate>
      <link>https://dev.to/shivammiguel/ainda-na-senda-dos-principios-do-solid-2mmk</link>
      <guid>https://dev.to/shivammiguel/ainda-na-senda-dos-principios-do-solid-2mmk</guid>
      <description>&lt;p&gt;O Princípio de Inversão de Dependência é um dos princípios fundamentais da programação orientada a objetos. Ele descreve uma técnica para reduzir o acoplamento entre os componentes de um sistema, o que torna o código mais flexível, reutilizável e fácil de manter.&lt;/p&gt;

&lt;p&gt;A ideia central do Princípio de Inversão de Dependência é que os módulos de alto nível não devem depender diretamente dos módulos de baixo nível, mas sim de abstrações. Isso significa que a lógica de negócios de um sistema não deve depender de detalhes de implementação de outros componentes do sistema.&lt;/p&gt;

&lt;p&gt;Para ilustrar o princípio, imagine um sistema de gerenciamento de pedidos de uma loja online. O módulo de alto nível seria responsável pela lógica de negócios do sistema, como processar pedidos, gerar faturas e enviar e-mails de confirmação para os clientes. O módulo de baixo nível seria responsável pela persistência dos dados, como gravar os pedidos em um banco de dados.&lt;/p&gt;

&lt;p&gt;Se o módulo de alto nível dependesse diretamente do módulo de baixo nível, teríamos um acoplamento forte entre eles. Isso significa que qualquer mudança no módulo de baixo nível poderia afetar a lógica de negócios do sistema. Além disso, tornaria mais difícil testar e reutilizar o código.&lt;/p&gt;

&lt;p&gt;Em vez disso, o Princípio de Inversão de Dependência sugere que o módulo de alto nível deva depender de uma abstração, como uma interface, em vez do módulo de baixo nível diretamente. A interface descreve o comportamento esperado do módulo de baixo nível, mas não seus detalhes de implementação. Dessa forma, o módulo de alto nível pode usar a interface sem se preocupar com a forma como o módulo de baixo nível está implementado.&lt;/p&gt;

&lt;p&gt;No exemplo do sistema de gerenciamento de pedidos, em vez de depender diretamente do módulo de persistência de dados, o módulo de alto nível poderia depender de uma interface chamada "PedidoRepository". O módulo de persistência de dados implementaria essa interface, mas o módulo de alto nível só precisaria saber que a interface existe e quais métodos ela define.&lt;/p&gt;

&lt;p&gt;Usar o Princípio de Inversão de Dependência pode tornar o código mais fácil de testar, pois permite que os módulos de baixo nível sejam substituídos por objetos simulados ou "mocks" durante os testes. Além disso, torna o código mais flexível, pois permite que diferentes implementações do mesmo comportamento sejam usadas em diferentes contextos.&lt;/p&gt;

&lt;p&gt;Em resumo, o Princípio de Inversão de Dependência é uma técnica poderosa para reduzir o acoplamento entre os componentes de um sistema. Ao usar abstrações em vez de depender diretamente de outros módulos, o código se torna mais flexível, reutilizável e fácil de manter.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gQJV-EIS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/69m4ucxvnhwzzcp135mv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gQJV-EIS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/69m4ucxvnhwzzcp135mv.png" alt="Image description" width="800" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>S.O.L.I.D</title>
      <dc:creator>António Miguel</dc:creator>
      <pubDate>Mon, 27 Mar 2023 14:47:21 +0000</pubDate>
      <link>https://dev.to/shivammiguel/solid-bh5</link>
      <guid>https://dev.to/shivammiguel/solid-bh5</guid>
      <description>&lt;p&gt;O Princípio da Responsabilidade Única (Single Responsibility Principle - SRP) é um dos princípios fundamentais do desenvolvimento de software orientado a objetos. Ele afirma que uma classe deve ter apenas uma única responsabilidade, ou seja, deve haver apenas uma razão para a sua existência.&lt;/p&gt;

&lt;p&gt;A importância do SRP reside no fato de que ele promove a coesão, ou seja, a capacidade de uma classe de manter uma única responsabilidade bem definida e executá-la de maneira eficiente. Uma classe coesa é mais fácil de entender, manter e evoluir, pois as mudanças em uma responsabilidade não afetam as outras. Além disso, a coesão também contribui para a reutilização de código, uma vez que as classes podem ser facilmente combinadas para criar novas funcionalidades.&lt;/p&gt;

&lt;p&gt;Por outro lado, quando uma classe tem múltiplas responsabilidades, ela se torna frágil e difícil de modificar, pois qualquer mudança em uma responsabilidade pode afetar outras partes do código. Isso pode levar a problemas como efeitos colaterais indesejado, dificuldade de testar o código e acoplamento excessivo entre as classes.&lt;/p&gt;

&lt;p&gt;Ao seguir o SRP, os desenvolvedores podem criar código mais modular e fácil de manter, melhorando a qualidade do software e reduzindo o tempo e os custos de desenvolvimento. Além disso, o SRP também contribui para a legibilidade do código, tornando-o mais fácil de entender para outros desenvolvedores.&lt;/p&gt;

&lt;p&gt;Em resumo, o Princípio da Responsabilidade Única é um conceito fundamental no desenvolvimento de software orientado a objetos. Ele promove a coesão, modularidade, reutilização de código e facilidade de manutenção, contribuindo para a criação de software de alta qualidade e eficiente.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
