<?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: Majulia Carvalho</title>
    <description>The latest articles on DEV Community by Majulia Carvalho (@majulia).</description>
    <link>https://dev.to/majulia</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%2F581891%2Fb5d4c737-77b1-4569-9d51-61e068d569da.png</url>
      <title>DEV Community: Majulia Carvalho</title>
      <link>https://dev.to/majulia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/majulia"/>
    <language>en</language>
    <item>
      <title>Aplicando a Orientação a Objetos: Gerenciamento de memória [4/10]🧶</title>
      <dc:creator>Majulia Carvalho</dc:creator>
      <pubDate>Sun, 03 Sep 2023 19:21:15 +0000</pubDate>
      <link>https://dev.to/majulia/aplicando-a-orientacao-a-objetos-gerenciamento-de-memoria-410-537k</link>
      <guid>https://dev.to/majulia/aplicando-a-orientacao-a-objetos-gerenciamento-de-memoria-410-537k</guid>
      <description>&lt;p&gt;&lt;code&gt;Podendo identificar classes, atributos, métodos, instância e objeto, conseguiremos entender o básico de gerenciamento de memória antes de seguir em frente.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O ecossistema .net possui ferramentas de gerenciamento como o &lt;a href="https://learn.microsoft.com/pt-br/dotnet/standard/clr" rel="noopener noreferrer"&gt;CLR&lt;/a&gt; e o &lt;a href="https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals" rel="noopener noreferrer"&gt;Garbage Collector&lt;/a&gt;, que trabalham para ajudar em um maior desempenho de desenvolvimento. Por isto, quando programamos, não há necessidade de  gerenciar memória e seus espaços manualmente já que o próprio .net cuida disso.&lt;/p&gt;

&lt;p&gt;Quando falamos de memória, nos deparamos com a &lt;strong&gt;stack&lt;/strong&gt; e &lt;strong&gt;heap&lt;/strong&gt; que estão diretamente atreladas aos tipos &lt;strong&gt;valor&lt;/strong&gt; e &lt;strong&gt;referência&lt;/strong&gt;. Primeiro vamos entender as memórias.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Stack&lt;/strong&gt; é uma memória menor que a heap e por isso fornece informações de forma mais ágil. Ela armazena dados do tipo valor que são dados que não ocupam muito espaço na memória e são passados diretamente para as variáveis (de tipos primitivos como bool, int, double, structs - considerados dados leves -) ou valores que referenciam posições da heap. &lt;/p&gt;

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

&lt;p&gt;Ao criar uma variável de tipo primitivo, ela fica presente na stack onde o compilador tem fácil acesso a ela. Se esta variável armazenar uma referência, é possível que o compilador acesse mais fácilmente a posição de um objeto na heap. &lt;/p&gt;




&lt;h2&gt;
  
  
  Heap
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Heap&lt;/strong&gt; por ser maior, possui a capacidade de armazenar dados maiores como objetos. Se lembrarmos do comando new utilizado para instanciar objetos, podemos ter uma maior clareza do que está acontecendo por baixo dos panos:&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A classe carro possui dois atributos: placa e ano&lt;br&gt;
⠀&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzswlnik7obentlmxd3v5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzswlnik7obentlmxd3v5.png" alt="carro instanciado"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A cima estamos instanciando um carro&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Quando instanciamos um objeto, ele será criado na memória heap, dessa forma:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Dados mais pesados são armazenados na heap, e eles são do tipo valor, pois as informações se encontram na heap. Para acessarmos este objeto, pegamos a referência a ele, que é justamente uma variável presente na stack. Então podemos entender que quando criamos uma variável para criar um objeto, não fazemos nada mais que criar uma referência da heap para ele🐣 Uma forma mais visual de representar isso:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frnnh6uwngm27oz8t8s1w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frnnh6uwngm27oz8t8s1w.png" alt="Valor Referência"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesta sessão, pudemos entender a diferença entre as duas memórias e os tipos de valores presentes nelas. Isto é importante porque em determinados momentos precisamos saber de onde vem o objeto que estamos manipulando.  &lt;/p&gt;

</description>
      <category>programming</category>
      <category>learning</category>
      <category>dotnet</category>
      <category>coding</category>
    </item>
    <item>
      <title>Aplicando a Orientação a Objetos: Operações dos métodos [3/10]🧶</title>
      <dc:creator>Majulia Carvalho</dc:creator>
      <pubDate>Wed, 07 Jun 2023 18:07:15 +0000</pubDate>
      <link>https://dev.to/majulia/aplicando-a-orientacao-a-objetos-operacoes-dos-metodos-310-2gk9</link>
      <guid>https://dev.to/majulia/aplicando-a-orientacao-a-objetos-operacoes-dos-metodos-310-2gk9</guid>
      <description>&lt;p&gt;&lt;code&gt;Os métodos são manipuladores de informações que executam operações importantes para o funcionamento dos nossos programas orientados a objetos. Sabemos que eles possuem dois tipos conhecidos como construtores e destrutores responsáveis pela instanciação do objeto. Nesta publicação, veremos encapsulamento e sobrecarga para concluir a introdução dos métodos.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Construtores são métodos utilizados para instanciar objetos passando valores iniciais a ele. Destrutores são métodos que destroem um objeto em determinado momento da aplicação.&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ‎
&lt;/h2&gt;

&lt;h2&gt;
  
  
  SOBRECARGA
&lt;/h2&gt;

&lt;h2&gt;
  
  
  ‎
&lt;/h2&gt;

&lt;p&gt;Quando vimos &lt;a href="https://dev.to/majuliah/aplicando-a-orientacao-a-objetos-os-metodos-2eed"&gt;construtores&lt;/a&gt;, pudemos perceber que podem haver vários desde que fossem passados parâmetros diferentes, e isso é a sobrecarga de um método. Em diversas situações nos vemos com a necessidade de atribuir a um método parâmetros diferentes para executar operações específicas em contextos distintos. A sobrecarga de método se aplica a métodos em geral, não sendo limitada apenas aos construtores. A seguir vemos um exemplo de uma classe Area. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--T1y6wwHj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8d2c1cpenzu1yc4z1mrn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T1y6wwHj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8d2c1cpenzu1yc4z1mrn.png" alt="exemplo de sobrecarga de método" width="800" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Para criar sobrecargas de métodos, devemos sempre preservar o nome em questão. No exemplo o método se chama CalculaArea;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Quando uma sobrecarga é feita, mudamos apenas os parâmetros, podendo acrescentar ou retira-los. No exemplo acima, a sobrecarga que calcula o quadrado possui apenas um parâmetro denominado altura enquanto a sobrecarga que calcula o retângulo possui dois determinados como valorBase e valorAltura. Os parâmetros podem ter diferentes tipos (int, double, etc.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Como vamos saber de qual sobrecarga de método estamos utilizando ao realizar determinada ação? As sobrecargas devem ser criadas de forma cautelosa e, basta atribuir ao objeto a mesma sequência de parâmetros presentes na sobrecarga criada. Ao calcular a área do quadrado, passaremos apenas um parâmetro que representa a altura, e área do retângulo informaremos a base e a altura.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conhecendo sobrecargas, conseguimos aplicar o conceito de reuso anteriormente citado, já que com a elas nós só alteramos a assinatura dos métodos e evitamos a geração de código repetida e desnecessária.&lt;br&gt;
‎ ‎ &lt;/p&gt;

&lt;h2&gt;
  
  
  ENCAPSULAMENTO
&lt;/h2&gt;

&lt;p&gt;‎ &lt;/p&gt;

&lt;p&gt;Em certos momentos, nós precisamos proteger atributos de  possíveis alterações que possam atingir a integridade do programa. Como antes visto, o encapsulamento é uma forma de privar membros sensíveis aos contatos externos, protegendo códigos sensíveis de manipulações indesejadas. O encapsulamento é dedicado a manter estados consistentes de nossos objetos. No C#, o ele pode ser feito manualmente, especificado a seguir, com &lt;em&gt;properties&lt;/em&gt; e &lt;em&gt;autoproperties&lt;/em&gt;, assuntos futuros. &lt;br&gt;
‎ &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LsfYTE9s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/veftcfkimb0lpj6v621t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LsfYTE9s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/veftcfkimb0lpj6v621t.png" alt="Exemplo de encapsulamento" width="800" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Na classe produto, temos três atributos privados. Isso quer dizer que apenas a classe destes atributos podem modificar seus valores. Por este motivo, existem quatro métodos. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Atributos privados não podem ser alterados e por esta razão, foram criados quatro métodos a fim de obter e atribuir valores dos atributos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Os chamados GetNome e GetPreco são membros que fornecem os valores dos objetos, já que os valores estão privados. Quando um objeto for instanciado, basta chamá-los para que a operação seja realizada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Os chamados SetNome e SetPreco são responsáveis por atribuir novos valores aos atributos. &lt;/p&gt;
&lt;h2&gt;
  
  
  ‎
&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com o encapsulamento efetuado, se tornou necessário utilizar métodos para acessar os valores. O encapsulamento manual é utilizado geralmente quando existem condições e verificações que precisam ser atendidas para que o valor possa ser alterado, aumentando o nível de segurança e respeitando a regra de negócio. &lt;/p&gt;

&lt;p&gt;Um exemplo disso é se colocássemos uma condição de integridade para validar o SetNome. &lt;/p&gt;

&lt;p&gt;Como este método altera o nome do produto, poderíamos inserir uma verificação de quantidade de caracteres. A alteração só poderia ser feita se o novo nome que está sendo atribuído tivesse mais de 5 caracteres ou não fosse nulo, por exemplo. &lt;br&gt;
‎ &lt;br&gt;
Você pode ler mais sobre níveis de acessibilidade no C# &lt;a href="https://learn.microsoft.com/pt-br/dotnet/csharp/language-reference/keywords/accessibility-levels"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Agora conseguimos realmente entender como os métodos são ferramentas poderosas quando bem utilizadas, capazes de otimizar, definir e proteger nossas aplicações. Com esta perspectiva poderemos prosseguir em outros pilares da orientação a objetos.  &lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Aplicando a Orientação a Objetos: Os métodos[2/10]🧶</title>
      <dc:creator>Majulia Carvalho</dc:creator>
      <pubDate>Mon, 29 May 2023 11:42:04 +0000</pubDate>
      <link>https://dev.to/majulia/aplicando-a-orientacao-a-objetos-os-metodos-2eed</link>
      <guid>https://dev.to/majulia/aplicando-a-orientacao-a-objetos-os-metodos-2eed</guid>
      <description>&lt;p&gt;&lt;em&gt;Com o propósito de processar informações e realizar operações, os métodos são de extrema importância na orientação a objetos além de oferecerem uma gama de benefícios para a codificação, tais como reaproveitamento e limpeza de código. Antes de implementá-los, é de suma importância entender os seus tipos.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As classes, independente do conceito a qual elas representam, podem implementar quantos métodos forem necessários para a execução do programa. Eles podem trabalhar em conjunto ou individualmente, isto é, um método pode ser utilizado dentro de outro método e por aí vai. Mas além dos métodos mostrados anteriormente, temos outros dois tipos, os construtores e os destrutores. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;CONSTRUTORES&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Um método construtor é o principal responsável pela criação de um objeto, conceito que será visto posteriormente. Sempre que um objeto for criado, o método construtor agirá antes de qualquer coisa e instanciará a classe com os atributos criados. Com o construtor acionado, a instância de uma classe será realizada e o resultado disso será a criação do objeto. &lt;/p&gt;

&lt;p&gt;A utilização de um construtor não se dá apenas à parte de criação de objetos, mas também de fornecer valores iniciais para o objeto. Um método construtor tem exatamente o mesmo nome que a sua classe, podendo ou não ter parâmetros.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RXTsJ2Z---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/173v8gtpt4y613bs5gd5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RXTsJ2Z---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/173v8gtpt4y613bs5gd5.png" alt="ICodificação de um método construtor" width="800" height="608"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Acima temos a classe Livro que possui 3 atributos, NomeLivro, QuantidadeDePaginas e ISBN.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O primeiro método construtor, Livro(){} é o construtor vazio. Quando um objeto for instanciado a partir dele, todos os atributos serão nulos, ou vazios.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O segundo método construtor possui 3 parâmetros com os mesmos nomes dos atributos. Isso se dá porque no momento em que o objeto for instanciado, os valores passados no parâmetro serão os valores iniciais dos atributos do objeto. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O nome da classe recebe o parâmetro nome do construtor, é assim que a associação é feita.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como visto acima, um construtor deve ter o mesmo nome da classe e não necessita de um parâmetro de retorno (int, double, void, …) pois o retorno de um construtor já é o próprio tipo da classe. Na linguagem c#, os construtores são implícitos, isso significa que não é necessário a criação manual do construtor para que um objeto seja instanciado. Somente quando precisamos definir quais os parâmetros iniciais de um objeto é que os construtores são realmente necessários. Um exemplo é, se quiséssemos criar um objeto Livro fornecendo apenas o Nome e o ISBN, (sem o número de páginas) seria necessário a criação de um construtor fornecendo apenas estes dois parâmetros. Outro fator importante dos construtores é a necessidade de inicializar objetos com valores diferentes de nulo, isto é, quando criamos apenas &lt;strong&gt;um&lt;/strong&gt; construtor atribuindo parâmetros, isso &lt;strong&gt;obriga&lt;/strong&gt; que o objeto &lt;strong&gt;só seja instanciado se os valores especificados no corpo do construtor forem fornecidos na criação do objeto.&lt;/strong&gt; Quer dizer que o objeto só será criado se os parâmetros do método forem fornecidos. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;DESTRUTORES&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Se os construtores constroem os objetos, os destrutores desfazem. Eles são pouco usados e geralmente tem o objetivo de limpar a carga de objetos que não são mais necessários para a execução do programa. Assim como construtores, eles não precisam de um tipo de retorno. Sua sintaxe é muito simples, só necessita de um ~ antes do método. No ecossistema .NET possuímos o garbage collector que faz o gerenciamento de memória e descarta o que não está sendo utilizado, tornando o destrutor uma ferramenta muito específica para uma necessidades isoladas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZsprLKfo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mft0z166h5gr6it1j1q7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZsprLKfo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mft0z166h5gr6it1j1q7.png" alt="Codificação de um método destrutor" width="800" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A construção e destruição dos métodos são codificações simples que em grande parte do tempo são facilitadoras na hora de instanciar objetos, tornando o código mais legível. Além deles, existem ainda outras operações que são realizadas com os métodos e serão vistas no próximo tópico.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Aplicando a Orientação a Objetos: Classes, atributos e métodos [1/10]🧶</title>
      <dc:creator>Majulia Carvalho</dc:creator>
      <pubDate>Tue, 16 May 2023 19:47:48 +0000</pubDate>
      <link>https://dev.to/majulia/aplicando-a-orientacao-a-objetos-classes-atributos-e-metodos-l1d</link>
      <guid>https://dev.to/majulia/aplicando-a-orientacao-a-objetos-classes-atributos-e-metodos-l1d</guid>
      <description>&lt;p&gt;&lt;em&gt;A programação Orientada a Objetos é um paradigma geralmente utilizado em linguagens compiladas ou interpretadas. Comumente é aplicada em linguagens como Java, JavaScript, Python, C#, etc. Os exemplos práticos aplicados aqui serão em C#&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Classes
&lt;/h2&gt;

&lt;p&gt;Que o paradigma é orientado a objetos e que quando programamos tentamos trazer objetos do mundo real para os códigos &lt;a href="https://dev.to/majuliah/orientacao-a-objetos-amigavel12-16m5"&gt;nós já sabemos&lt;/a&gt;. Mas antes de haver qualquer objeto que representa aspectos do nosso cotidiano, tem de haver classes e elas são o pilar número um deste paradigma.&lt;/p&gt;

&lt;p&gt;Ao analisar um átomo, sabemos que ele é a unidade básica de construção da matéria e nele encontramos núcleo, prótons, neutros e elétrons. Tudo é formado por átomos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NR5W4G9b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/44k7hhoasn77fbnqodfs.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NR5W4G9b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/44k7hhoasn77fbnqodfs.jpg" alt="Um átomo e um relógio da apple" width="800" height="596"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um relógio, formado por átomos, possui componentes que o formam como um todo, tal como a pulseira, a tela, os componentes internos como fios, bateria etc. Todas esses componentes o fazem efetuar ações que só é possível pelo conjunto de peças que o forma. Ele é capaz de mostrar hora, previsão do tempo, quantidade de quilômetros percorrido e batimentos cardíacos do usuário e por aí vai. Mas por que isso?&lt;/p&gt;

&lt;p&gt;Representando o conceito de abstração &lt;a href="https://dev.to/majuliah/orientacao-a-objetos-amigavel12-16m5"&gt;antes visto&lt;/a&gt;, a classe pode ser descrita como um molde que serve para a criação de objetos. Ela é a unidade primária quando vamos codificar e é a partir dela que construímos os nossos sistemas. Ao compararmos classes com átomos, podemos dizer que são a base para a formação de objetos. Aproximando os conceitos, se assimilarmos as classes com o relógio, as peças seriam os atributos e as funcionalidades seriam os métodos. Classes devem ser coesas tanto ao serem nomeadas quanto a ter atributos que a representem fielmente, além de executar ações que aquele objeto se propõe a fazer. Não faria sentido um relógio conter ovos e nem fazer o seu café da manhã, porque basicamente ele se propõe a te mostrar as horas. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s1YFdMVh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nmyu1fj5rr5i89323hgn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s1YFdMVh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nmyu1fj5rr5i89323hgn.png" alt="Exemplo de atributos" width="248" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Atributos
&lt;/h2&gt;

&lt;p&gt;Depois de identificar uma classe e a nomear, precisamos montá-las com seus detalhes. Ela precisa de informações e essas informações precisam ser manipuladas. Os atributos são as características, os componentes, são os atributos da classe. Eles definem seus dados e as caracterizam, e com eles nós cumprimos a proposta de montá-las. Um famoso exemplo é a classe Pessoa. Uma pessoa possui atributos diversos como olhos, nariz, boca, pernas, braços, etc. Mais uma vez trazemos o conceito de coesão, pois os atributos de uma classe devem ser definidos de acordo com a proposta dela, uma classe pessoa deve ter os atributos que uma pessoa contém.&lt;/p&gt;

&lt;p&gt;Quando criamos classes, queremos armazenar informações. Os atributos são características da classe que armazenam as informações que precisamos. Essas informações possuem valores, representados por tipos. Ainda na classe Pessoa, se representarmos atributo como QuantidadeDeOlhos ou QuantidadeDePernas, veremos que são do tipo inteiro porque uma pessoa pode ter 0, 1 ou 2 pernas/olhos: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KprBVV9Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5v89t2yf5zwbh1ei6nhj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KprBVV9Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5v89t2yf5zwbh1ei6nhj.png" alt="Exemplo de uma classe com atributos" width="270" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Métodos
&lt;/h2&gt;

&lt;p&gt;Se atributos são substantivos, os métodos são verbos porque eles executam ações ao manipular os atributos das classes e são responsáveis por processar essas informações. Eles possuem uma nomenclatura, retornam ou não um tipo de valor, recebem parâmetros e devem, assim como as classes e atributos, ser coesos. Um exemplo de método em uma classe pessoa seria CalcularIdade, como a seguir:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ekbxwAI0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ylx5dpgu8jjv3bdx7zbv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ekbxwAI0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ylx5dpgu8jjv3bdx7zbv.png" alt="Exemplo de um método" width="377" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;O método acima retorna um tipo inteiro, isso é especificado antes do nome CalcularIdade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ele recebe um parâmetro, que está entre parênteses, também do tipo inteiro que representa o ano em que a pessoa nasceu. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No corpo do método temos um cálculo básico de idade, onde subtraindo do ano atual o ano de nascimento, temos a idade da pessoa.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Por fim ele retorna a idade da pessoa, o return idade; ,que é uma variável inteira (do tipo int) como especificado no início do método.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O retorno de um método pode ser qualquer um dos tipos primitivos (string, double, int, float, etc) ou nenhum (void). Métodos de retorno void não retornam valor algum e geralmente são utilizados para atualizar os valores de atributos. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yMhz79jd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cmziypwxr3ms4x1470r7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yMhz79jd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cmziypwxr3ms4x1470r7.png" alt="Exemplo de uma classe com atributos e métodos" width="600" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com isso, pudemos conhecer as unidades básicas da orientação a objetos. As classes são os moldes, conceitos da abstração que representam os objetos. Nelas temos atributos que armazenam valores de suas características e os métodos que são as operações dos atributos que retornam ou não valores. No próximo texto vamos ver melhor sobre métodos. &lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Orientação a Objetos Amigável 🧶[2/2]</title>
      <dc:creator>Majulia Carvalho</dc:creator>
      <pubDate>Mon, 08 May 2023 21:44:40 +0000</pubDate>
      <link>https://dev.to/majulia/programacao-orientada-a-objetos-amigavel-22-4f5f</link>
      <guid>https://dev.to/majulia/programacao-orientada-a-objetos-amigavel-22-4f5f</guid>
      <description>&lt;p&gt;&lt;code&gt;Na publicação Programação Orientada a Objetos amigável [1/2], pudemos entender a proposta do paradigma e conhecer uma breve história sobre ele. Além disso, foi possível compreender como ele se comporta e um simples exemplo de usabilidade no contexto do desenvolvimento de software. Agora apresentarei os fundamentos da Orientação a Objetos.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Antes de apresentar os conceitos que compõem a Orientação a Objetos, é importante discutir sobre os pilares porque são com eles que conseguimos compreender de forma clara todos os assuntos que formam o paradigma. Compreender os conceitos facilita a aplicabilidades na hora de programar. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Abstração:&lt;/strong&gt; Em resumo, a abstração consiste em focar no que é essencial, deixando de lado o que não é. No mundo real, frequentemente utilizamos abstração sem perceber e um exemplo disso pode ser o seu smartphone quando estraga; você leva para o concerto e o recebe funcionando novamente. Isso é abstração, você não precisa saber o que foi feito para que ele voltasse a funcionar, o que importa é que o problema fora resolvido. Voltando ao ponto de vista do software, quando programamos, buscamos automatizar processos do nosso dia a dia através de programas, e na orientação a objetos utilizamos abstração para automatizar a forma de resolver os problemas. A abstração é incompleta, pois só foca no resultado final e é assim que ela deve ser. A vantagem disso é que com um ponto de partida conseguimos moldá-las conforme nossas necessidades. Já que na orientação a objetos programamos com o intuito de representar coisas do mundo real em forma de código, vamos pegar um exemplo de uma fábrica de caixas. Podemos imaginar uma caixa de forma super básica (de forma mais abstrata possível). A partir disso, caixas personalizadas de diferentes cores e tipos seriam criadas e em cada modelo algo seria acrescentado ou modificado. Dessa forma pudemos perceber que a partir de um ponto inicial pudemos adaptar outros tipos personalizados. Abstrações de baixo nível são mais específicas e apresentam mais detalhes enquanto abstrações de alto nível são as mais simples possível. Por fim, não importa o molde em que a caixa foi feita, mas sim a variedade de caixas prontas para serem vendidas. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reuso:&lt;/strong&gt;  Uma má prática de programação é o ato de repetir códigos diversas vezes. Isso leva  múltiplas falhas e vulnerabilidades a um sistema, além de dificultar a manutenção e deixar tudo uma bagunça. Codificar pensando em reaproveitamento exige que a própria pessoa que está programando pense nisso e não espere que a orientação a objetos faça isso milagrosamente. Dentro do reuso temos outros conceitos como herança e polimorfismo que serão explicados em outra ocasião. Um exemplo de reuso seria uma fórmula matemática, que pode ser utilizada para realizar a mesma operação diversas vezes com números diferentes. Não seria necessário escrever toda uma fórmula a cada vez que os valores atribuídos a ela fossem alterados. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Encapsulamento:&lt;/strong&gt; Quando tomamos um remédio para melhorar algo que não está bem, geralmente não nos preocupamos com a complexidade da fórmula do medicamento. Essa ideia aplicada a orientação a objetos é a mesma. Quando temos trechos de código muito importantes e críticos ao sistema, esperamos que eles estejam protegidos e incapazes de serem manipulados por qualquer pessoa, então escondemos a lógica de alguma forma. Essa forma é o encapsulamento, que traz vantagens de ocultação de informações sensíveis, proteção dessas informações e a transparência de mudanças. Ele protege o objeto do mundo exterior. Se pegarmos o exemplo de um videogame, podemos assumir que você não precisa abrir e deixar exposto os componentes internos dele, como fios e peças. Essas partes críticas vem encapsuladas justamente por proteção e e a única coisa que nos interessa são os jogos rodando em nossa tela. Isso é o encapsulamento.  &lt;/p&gt;

&lt;p&gt;Saber estes assuntos facilita a programação e torna mais claro quais as melhores alternativas na hora de resolver um problema. Com isso, conseguimos assimilar melhor os pilares da orientação a objetos e compreender a devida importância desses conceitos.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>oop</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Orientação a Objetos amigável🧶[1/2]</title>
      <dc:creator>Majulia Carvalho</dc:creator>
      <pubDate>Fri, 05 May 2023 19:12:45 +0000</pubDate>
      <link>https://dev.to/majulia/orientacao-a-objetos-amigavel12-16m5</link>
      <guid>https://dev.to/majulia/orientacao-a-objetos-amigavel12-16m5</guid>
      <description>&lt;p&gt;Programação Orientada a Objetos é um paradigma que visa representar objetos do mundo real através de códigos. Desta maneira, programamos representando acontecimentos do nosso cotidiano da forma mais fiel possível.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Paradigma de programação: é uma forma, estilo ou convenção de se programar. Existem 4 muito utilizados e orientação a objetos é um deles.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Para entendermos melhor o ecossistema da POO, precisamos voltar na década de 1960, onde a Orientação a Objetos era concebida na Noruega por dois pesquisadores que decidiram utilizar o conceito de simulação para criar uma linguagem de programação.&lt;/p&gt;

&lt;p&gt;A proposta deles era criar uma linguagem de Simulação de Eventos Discretos, isto é, uma forma de utilizar modelos lógicos e matemáticos para representar alterações de estado e os relacionamentos que levaram essas mudanças. O principal foco era criar uma maneira de programar onde a expressividade fosse ampla e os conceitos bem representados, tanto em características quanto em comportamento. Uma década depois, em 1970, tínhamos a consolidação e o reconhecimento da Orientação a Objetos.&lt;/p&gt;

&lt;p&gt;Analisando do ponto de vista do desenvolvimento de softwares, a Orientação a objetos permite a criação de sistemas em uma forma amigável e produtiva ao representar os problemas do dia a dia através de objetos que possuem atributos e ações.&lt;/p&gt;

&lt;p&gt;Além de manipular elementos, a orientação a objetos possui duas características importantíssimas conhecidas como o reuso e coesão. O reuso diz respeito ao reaproveitamento de informações, dados, comportamentos e objetos; isso automatiza significativamente a codificação e a aplicação como um todo, em como isso tudo se relaciona. Já a coesão diz respeito a como cada objeto deve se portar do ponto de vista do que ele se compromete a fazer. Isto quer dizer que um objeto só deve fazer o que se propõe, de forma coesa. Se pegarmos um exemplo de um objeto ventilador, não faria sentido atribuir a ele operações de um ar condicionado, o objeto não seria coeso.&lt;/p&gt;

&lt;p&gt;Em um sistema de vendas possuímos clientes, funcionários e produtos que são objetos do programa e representam coisas que realmente existem. Eles possuem características, executam ações, se relacionam entre si, praticam coesão e reuso. Dessa forma conseguimos finalmente atribuir conceitos da orientação a objetos em um exemplo prático, e entender melhor sobre este paradigma de programação.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>oop</category>
    </item>
  </channel>
</rss>
