<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="http://ricardovsilva.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="http://ricardovsilva.github.io/" rel="alternate" type="text/html" /><updated>2026-10-28T22:47:45+00:00</updated><id>http://ricardovsilva.github.io/feed.xml</id><title type="html">Ricardo da Verdade Silva</title><subtitle>.Net Pro | Ruby Enthusiast | Python Lover. Lazy programmer. I&apos;m always learning more to write less. Also dad of two gorgeous dog (all dogs are gorgeous at all)</subtitle><entry xml:lang="pt-BR"><title type="html">Artigos que todos os devs devem ler</title><link href="http://ricardovsilva.github.io/blog/2020/01/14/artigos-que-todos-os-devs-devem-ler/" rel="alternate" type="text/html" title="Artigos que todos os devs devem ler" /><published>2020-01-14T00:00:00+00:00</published><updated>2020-01-14T00:00:00+00:00</updated><id>http://ricardovsilva.github.io/blog/2020/01/14/artigos-que-todos-os-devs-devem-ler</id><content type="html" xml:base="http://ricardovsilva.github.io/blog/2020/01/14/artigos-que-todos-os-devs-devem-ler/"><![CDATA[<p>Este post é um post vivo, com o tempo irei altera-lo para adicionar mais artigos.
Muitos dos artigos abaixo estão em inglês. A maior parte do conteúdo que eu leio é em inglês.<br />
Porém, sempre que os artigos estiverem em outro idioma eu irei sinalizar no link deles.</p>

<h2 id="sobre-testes">Sobre Testes</h2>

<ul>
  <li><a href="https://ronjeffries.com/articles/020-01ff/what-tdd-is-like/">O que o TDD é e o que não é (Inglês)</a> - Adicionado em 14/01/2019</li>
  <li><a href="https://ronjeffries.com/articles/020-01ff/tdd-in-lua/">Uma demonstração de TDD (Inglês)</a> - Adicionado em 14/01/2019</li>
</ul>]]></content><author><name>Ricardo da Verdade Silva</name></author><category term="[&quot;blog&quot;]" /><category term="artigos" /><category term="tdd" /><summary type="html"><![CDATA[Este post é um post vivo, com o tempo irei altera-lo para adicionar mais artigos. Muitos dos artigos abaixo estão em inglês. A maior parte do conteúdo que eu leio é em inglês. Porém, sempre que os artigos estiverem em outro idioma eu irei sinalizar no link deles.]]></summary></entry><entry xml:lang="pt-BR"><title type="html">Por que não mudar o mundo?</title><link href="http://ricardovsilva.github.io/blog/2016/02/16/por-que-nao-mudar-o-mundo/" rel="alternate" type="text/html" title="Por que não mudar o mundo?" /><published>2016-02-16T00:00:00+00:00</published><updated>2016-02-16T00:00:00+00:00</updated><id>http://ricardovsilva.github.io/blog/2016/02/16/por-que-nao-mudar-o-mundo</id><content type="html" xml:base="http://ricardovsilva.github.io/blog/2016/02/16/por-que-nao-mudar-o-mundo/"><![CDATA[<blockquote>
  <p>“Eu sempre me interessei por ciência, tecnologia e (acima de tudo) computadores. Essas são coisas que eu sempre amei, apesar de serem difíceis as vezes. Eu amei matemática e ciências na escola. Eu li histórias de ficção ciêntifica e aventuras fantasiosas durante todo tempo livre que eu tinha. Eu fui o garoto nerd da escola que sofria bullying e era zoado. Teria sido bem mais fácil desistir do meu jeito e ser ‘como qualquer outro’. Eu poderia ter parado de ler. Eu poderia ter praticado mais esportes.</p>
</blockquote>

<blockquote>
  <p>Mas eu não fiz isso. Eu sabia o que eu amava. Eu sabia que o que eu queria era mais importante do que o que eles queriam. Acima de tudo, eu queria mudar o mundo.</p>
</blockquote>

<blockquote>
  <p>Ninguém na história já mudou o mundo sendo o que os outros queriam que fosse. Eles mudaram o mundo pela ousadia de rir do que é senso comum e tentar algo novo. Eles mudaram o mundo ao se manterem de pé e desafiando que “contra a força não há resistência” ou “ser maria vai com as outras” é o caminho certo.</p>
</blockquote>

<blockquote>
  <p>Este é o sentimento que me dirigiu a minha carreira Open Source*. Eu escolhi este caminho em minha vida porque eu vi este como uma forma de fazer alguma diferença real no mundo. Esta foi uma mudança real em minha vida, e continua sendo. E isso vai de encontro a toda a cultura e história dos negócios corporativos.</p>
</blockquote>

<blockquote>
  <p>No seu coração, o movimento Open Source é uma extensão da ciência. O senhor Isaac Newton escreveu: ‘Se vi mais longe foi por estar de pé sobre ombros de gigantes.’. Uma das mais brilhantes mentes da história reconheceu que sua contribuição para a nossa maior compreensão não veio somente de sua mente ou visão, mas sim do fato de que milhares de mentes, maiores e menores, trabalharam juntas para criar um mundo onde sua faísca em particular pudesse inflamar a mudança.</p>
</blockquote>

<blockquote>
  <p>A filosofia do Open Source é a mesma. É um mecanismo para permitir que milhares de pessoas trabalhem juntas por um objetivo comum. O desenvolvimento clássico de software sempre ocorreu em ambientes fechados que sempre protegeram seus segredos a punhos de aço. Essencialmente, este pensamento (fechado) também se refletiu em invenções e na indústria por anos (e ainda reflete). É um hábito difícil de quebrar, especialmente quando parece que você está abrindo mão de algo.</p>
</blockquote>

<blockquote>
  <p>Na minha opinião, este é o ponto central que faz com que as pessoas tem problemas em aprender. Quando você abre mão do controle exclusivo, você está ganhando algo muito mais valioso: você está expandindo o nível base. Você está alimentando esses gigantes para que você, e outros, possam ficar de pé sobre e ver mais além. Onde antes você era um inventor de pé sobre os ombros de um gigante, agora você olha para baixo e pode ver a verdade que isso significa: que este gigante está de pé sobre outros gigantes maiores. E por ai vai, por toda a história.</p>
</blockquote>

<blockquote>
  <p>Uma vez que você se envolve, as coisas começam a ficar mais claras. Quando você ficar mais alto e puder ver mais além, você perceberá que os seus esforços podem ter o impacto maior do que um dia você jamais imaginou. Ao invés de deter um conhecimento irrisório, você pode compartilha-lo com o mundo e ver o que eles irão fazer com este conhecimento também. Isso nem sempre será o bastante e nem sempre irá atender aos seus objetivos originais, mas isso será sempre melhor do que a soma de suas partes. E, de uma forma pequena, você terá mudado o mundo.</p>
</blockquote>

<blockquote>
  <p>Uma coisa que fica bastante esquecida quando as pessoas falam sobre mudar o mundo é que eles falam sobre deslocamentos massivos de direção. Eles falam sobre esses momentos na história em que você pode olhar pra trás e dizer: “Aqui! Foi neste momento que tudo mudou!”. Esses momentos sempre haverão a cada poucos séculos, mas a verdade é que a maioria das mudanças acontece de forma glacial.</p>
</blockquote>

<blockquote>
  <p>Open source é uma dessas mudanças glaciais. Eu não uso este termo para sugerir que esta mudança acontece muito devagar. Pelo contrário, eu escolho este termo para invocar a imensidão, inevitabilidade e o quão incrível é o abalo a que isso leva. Uma geleira pode levar décadas, séculos ou mesmo milênios para se mover pela terra, mas nada pode realmente se manter contra sua maré. Este é o legado do Open Source: a maré do progresso.</p>
</blockquote>

<blockquote>
  <p>Ao longo dos últimos 25 anos de Linux, temos visto um grande número de avanços feitos na marcha do progresso. Quando as pessoas perguntam com o que eu trabalho e eu digo ‘Linux’ ou ‘Open Source’, elas frequentemente me devolvem um olhar vazio. Eu normalmente sigo com a seguinte sequência: ‘Você tem algum dispositivo com um interruptor que não começa com a letra I? É provável que ele esteja rodando Linux ou, ao menos, algum código Open Source’. Toda vez eu digo isso, e me surpreendo com a grandiosidade disso. Todos esses anos de trabalho duro, de tantos indivíduos talentosos, mudou as coisas a tal ponto que agora código open source é padrão, eles estão em todo lugar, é o protagonista ao invés do coadjuvante. Além disso, se tornou tão onipresente, que qualquer um pode usa-los sem sequer saber de sua existência.</p>
</blockquote>

<blockquote>
  <p>De uma maneira bem real, a comunidade Open Source mudou o mundo. E continua mudando dia após dia. Eu comecei a fazer parte disso, e eu não vou mentir que a idéia não me deixa um pouco atordoado.</p>
</blockquote>

<blockquote>
  <p>Eu comecei este blog (https://sgallagh.wordpress.com) com a questão ‘Por que não mudar o mundo?’, mas este foi um pequeno mal entendido. Nós já mudamos o mundo. A questão real deveria ser ‘Como você vai muda-lo depois?’.”</p>
</blockquote>

<p>Este texto representa bastante do meu sentimento e carinho pela comunidade Open Source. O post original pode ser encontrado em: https://sgallagh.wordpress.com/2013/08/26/why-not-change-the-world/</p>]]></content><author><name>Ricardo da Verdade Silva</name></author><category term="[&quot;blog&quot;]" /><category term="opinião" /><category term="tradução" /><summary type="html"><![CDATA[“Eu sempre me interessei por ciência, tecnologia e (acima de tudo) computadores. Essas são coisas que eu sempre amei, apesar de serem difíceis as vezes. Eu amei matemática e ciências na escola. Eu li histórias de ficção ciêntifica e aventuras fantasiosas durante todo tempo livre que eu tinha. Eu fui o garoto nerd da escola que sofria bullying e era zoado. Teria sido bem mais fácil desistir do meu jeito e ser ‘como qualquer outro’. Eu poderia ter parado de ler. Eu poderia ter praticado mais esportes.]]></summary></entry><entry xml:lang="pt-BR"><title type="html">Aprendendo Um Pouco Todos os Dias</title><link href="http://ricardovsilva.github.io/blog/2015/12/10/aprendendo-um-pouco-todos-os-dias/" rel="alternate" type="text/html" title="Aprendendo Um Pouco Todos os Dias" /><published>2015-12-10T00:00:00+00:00</published><updated>2015-12-10T00:00:00+00:00</updated><id>http://ricardovsilva.github.io/blog/2015/12/10/aprendendo-um-pouco-todos-os-dias</id><content type="html" xml:base="http://ricardovsilva.github.io/blog/2015/12/10/aprendendo-um-pouco-todos-os-dias/"><![CDATA[<p>Programar, muito além de uma ciência exata, é uma arte, uma arte que demanda muita habilidade e conhecimento (combinação conhecida também como competência).</p>

<p>Existem muitas formas de adquirir tais habilidades, e é importante ter em mente que sempre haverá algo novo a aprender (e é este desafio constante que me leva a ficar acordado até as 2 da manhã quase diariamente, estudando.
Portanto, tenha em mente, para poder se denominar “competente” é preciso <strong>desenvolver</strong> habilidades e adquirir conhecimento.</p>

<h2 id="conhecimento">Conhecimento</h2>
<p>Vivemos em pleno século XXI, quase tudo a nossa volta é fonte de informação, e os nossos celulares são fontes de informação praticamente infinita. Isto é ótimo, e ao mesmo tempo muito ruim.
Podemos gastar o nosso tempo em conversas levianas no whatsapp, ou vendo fotos no Facebook, ou mesmo rolando infinitamente o scroll do 9gag. Quer se tornar um ótimo programador? Então tome cuidado com isso.</p>

<p>Utilize o seu tempo melhor, forme a sua rede de pessoas, sites e blogs que tenham conteúdos relevantes, e leia-os diariamente. Esta no metrô, ônibus ou na fila de um banco? Este é um ótimo momento para ler um artigo (use seu celular a seu favor).
Eu considero a obtenção diária e constante de conhecimento muito mais enriquecedor do que pagar para fazer algum curso (um curso pode ser um ótimo ponto de partida, mas curso nenhum vai te deixar apto ao mercado de trabalho).</p>

<blockquote>
  <p>Para organizar o que eu vou ler e sempre receber novidades que são do <strong>meu</strong> interesse, eu uso o Feedly. Um bom leitor de RSS é essencial.</p>
</blockquote>

<p>Abaixo, uma lista de alguns dos principais sites e nomes que eu leio diariamente:</p>

<ul>
  <li>
    <p><a href="http://eduardopires.net.br">Eduardo Pires</a> - Arquiteto de Software e professor, seu Blog tem ótimos artigos sobre arquitetura e engenharia de software, além de ótimos tutoriais gratuitos (e treinamentos pagos).</p>
  </li>
  <li>
    <p><a href="https://www.troyhunt.com">Troy Hunt (em inglês)</a> - Profissional norte-americano especialista em segurança de software. Seu blog tem uma linguagem super simples e os artigos são sempre muito esclarecedores. Parada obrigatória para qualquer desenvolvedor.</p>
  </li>
  <li>
    <p><a href="https://mva.microsoft.com/">Microsoft Virtual Academy (inglês/português)</a>  - A academia da Microsoft possui muito conteúdo e vídeos muito bons. Eu aprendi MVC aqui. Recomendo muito os Jumpstarts (te levam do 0 ao fazendo algo útil em poucas horas). E se você acha que a MVA tem apenas conteúdo sobre tecnologias Microsoft, a cerca de 6 meses atrás foi publicado um Jumpstart de <a href="https://mva.microsoft.com/en-us/training-courses/developing-websites-using-python-and-django-11415?l=AQdTENEJB_4004300477">Python Django</a>.</p>
  </li>
  <li>
    <p><a href="https://www.adtmag.com">ADT Magazine (em inglês)</a> - Conteúdos diversos, todos relacionados a TI. Segurança, banco de dados, cloud computing, infraestrutura, nova linguagem do Google, e outras coisas.</p>
  </li>
  <li>
    <p><a href="https://allankelly.blogspot.co.uk">Allan Kelly (em inglês)</a> - Engenheiro de software britânico. É um dos meus profissionais favoritos. Posta bastante conteúdo sobre agile, engenharia e arquitetura de software. Seu blog é obrigatório para quem quer entender todas as etapas relacionadas ao desenvolvimento de software além da escrita do código.</p>
  </li>
  <li>
    <p><a href="https://uxmag.com">UX Magazine (em inglês)</a> - Não sou especialista em user experience, mas é sempre bom ver alguma coisa sobre, ter noção de alguns conceitos e ver como o mercado (internacional) está convergindo neste sentido.</p>
  </li>
  <li>
    <p><a href="https://medium.com/@andrebaltieri">André Baltieri</a> - Microposts sobre engenharia e arquitetura de software.</p>
  </li>
</ul>

<h2 id="habilidade">Habilidade</h2>

<p>Conheço somente uma forma de desenvolver habilidade: praticando. Então, como se tornar proeficiente com uma linguagem ou tecnologia com a qual não trabalha no dia-a-dia?</p>

<h3 id="tutoriais">Tutoriais</h3>
<p>Existem inúmeros tutoriais espalhados pela Internet, muitos deles, inclusive, podem ser feitos online.</p>

<ul>
  <li>
    <p><a href="https://easydatawarehousing.github.io/TryRuby/">TryRuby</a> - Ótimo tutorial online para quem quer dar os primeiros passos com Ruby. Este tutorial foi completamente traduzido para o português brasileiro por mim.</p>
  </li>
  <li>
    <p><a href="https://www.railstutorial.org/book">Rails Book (em inglês)</a>  - Já aprendeu Ruby e agora quer aprender o seu principal framework para desenvolvimento web? O Rails Book é o tutorial em forma de livro mais completo que eu já vi, ele ensina desde comandos básicos de Linux, passando Github, Heroku e, claro, muito Rails. Tutorial muito recomendado, dependendo da sua fome, dá para devora-lo em um final de semana.</p>
  </li>
</ul>

<h3 id="jogos">Jogos</h3>

<ul>
  <li>
    <p><a href="https://codecombat.com">Code Combat (em inglês)</a> - Exercite Javascript jogando. É um tipo de RPG no qual a única forma de passar de fase é escrevendo código. Sempre recebe fases e desafios novos.</p>
  </li>
  <li>
    <p><a href="https://robotgame.net/">Robot Game (em inglês)</a> - Jogo multi-player competitivo no qual você possui um robô de combate que deve vencer os robôs de outros jogadores. E onde está a programação? Você não controla o seu robô, você programa sua inteligência artificial em Python.</p>
  </li>
</ul>

<h3 id="opensource">OpenSource</h3>
<p>É fato indiscutível que a todo instante nós estamos utilizando software OpenSource (este blog que você está lendo usa <a href="https://jekyllrb.com">Jekyll</a>, que é OpenSource). Portanto, teve uma ótima idéia que vai ajudar um monte de gente? Nada mais justo do que contribuir um pouquinho com o mundo e participar da comunidade OpenSource. Você também pode contribuir ajudando a melhorar projetos que já existem.</p>

<ul>
  <li><a href="https://www.github.com">Github</a> - Maior rede social e de desenvolvedores e projetos OpenSource do mundo. É possível contribuir com projetos já existentes ou criar os seus próprios. Se você ainda não tem sua conta no Github, pare tudo o que está fazendo e vá criar sua conta agora.</li>
</ul>

<h2 id="concluindo">Concluindo</h2>

<p>Existe muito conteúdo bom e gratuito na Internet, basta estudar. Você deve ter reparado que a maioria do conteúdo é em inglês, se inglês ainda é o seu fraco, já passou da hora de aprender. Não dá para crescer neste mercado sem saber inglês, portanto, dedique um tempo dos seus estudos a isso.</p>

<p>Na minha opinião, cursos são ótimos pontos de partida mas não irão lhe tornar profissional. O processo de profissionalização acontece a todo instante, a toda hora. É preciso dormir, comer e respirar programação. E, principalmente, gostar de programar.</p>

<p>Gostou deste post? Tem dúvidas ou sugestões? Algum tema específico que gostaria que fosse abordado neste ou em tópicos futuros? Deixe o seu comentário, compartilhe, me ajude a propagar este blog para que eu possa compartilhar meu conhecimento e experiências com cada vez mais gente.</p>]]></content><author><name>Ricardo da Verdade Silva</name></author><category term="[&quot;blog&quot;]" /><category term="Conhecimento" /><category term="Blogs" /><category term="Inspirações" /><summary type="html"><![CDATA[Programar, muito além de uma ciência exata, é uma arte, uma arte que demanda muita habilidade e conhecimento (combinação conhecida também como competência).]]></summary></entry><entry xml:lang="pt-BR"><title type="html">Programacao Realmente Orientada A Objetos Parte 1 Conceitos Basicos</title><link href="http://ricardovsilva.github.io/blog/2015/12/07/programacao-realmente-orientada-a-objetos-parte-1-conceitos-basicos/" rel="alternate" type="text/html" title="Programacao Realmente Orientada A Objetos Parte 1 Conceitos Basicos" /><published>2015-12-07T00:00:00+00:00</published><updated>2015-12-07T00:00:00+00:00</updated><id>http://ricardovsilva.github.io/blog/2015/12/07/programacao-realmente-orientada-a-objetos-parte-1-conceitos-basicos</id><content type="html" xml:base="http://ricardovsilva.github.io/blog/2015/12/07/programacao-realmente-orientada-a-objetos-parte-1-conceitos-basicos/"><![CDATA[<p>Sou programador profissional a pouco mais de 3 anos. Apesar de parecer pouco tempo, já vi muita coisa deste mercado. Já vi muitos profissionais com 15 anos de experiência, diversos títulos, e que até hoje não sabem programar de forma REALMENTE orientada a objetos.</p>

<p>Olhe a sua volta, veja os seus colegas de universidade ou de trabalho, olhe para si mesmo e questione-se: eu estou fazendo da melhor forma possível?</p>

<p>Convido-lhe, a junto comigo, aprender um pouquinho mais e adicionar a sua bagagem intelectual um diferencial de mercado. Vamos aprender algo que não depende de uma linguagem de programação eslecificade REALMENTE programar de forma orientada a objetos. Este é um conhecimento que pode ser levado para qualquer linguagem de programação.</p>

<p>Neste primeiro post eu abordo:</p>

<ul>
  <li>O que é orientação a objetos?</li>
  <li>Classes</li>
  <li>Métodos</li>
  <li>Propriedades/Atributos</li>
  <li>Instâncias (objetos)</li>
  <li>Os pilares da Orientação a Objetos</li>
  <li>Herança</li>
  <li>Polimorfismo</li>
  <li>Encapsulamento</li>
</ul>

<p>Faça um ótimo proveito e, principalmente, divirta-se !</p>

<h2 id="o-que-é-orientação-a-objetos-oo">O que é Orientação a Objetos (O.O.)?</h2>
<p>Orientação a objetos é uma forma de programar que, praticamente, independe de linguagem (uma vez que a maioria das linguagens de programação suportam a orientação a objetos).</p>

<p>Consiste em programar de forma que, cada trecho do seu código tente ser um espelho de algo que existe no mundo real.</p>

<p>A O.O. nos permite reaproveitar o nosso código sem precisar copiar e colar, além de organizar o código de forma que ele seja expansível. Graças a O.O. temos softwares de tal complexidade que, seria praticamente impossível fazer de forma estruturada (programação convencional, linha atrás de linha).</p>

<p>Toda linguagem de programação que suporta a orientação a objetos possuem, elementarmente, suporte a criação de quatro elementos de programação. São eles: Classes, Métodos, Propriedades e Instâncias.</p>

<h3 id="métodos">Métodos</h3>
<p>Os métodos são funções, algoritmos, que executam uma determinada ação. O que diferencia um método de uma simples função, é que um método, normalmente, altera o estado (PROPRIEDADES) de um determinado objeto.
Métodos SEMPRE, fundamentalmente, são ações. Sempre descreva um método com um verbo de AÇÃO.</p>

<p>Se pensarmos em um carro, ele teria métodos como: acelerar, freiar, ligar, dentre outras.</p>

<p>Outro exemplo, mais voltado a sistemas, um <strong>cliente de banco</strong> pode <strong>sacar dinheiro</strong>, <strong>depositar</strong>, <strong>solicitar empréstimo</strong>, <strong>comprar produtos</strong>.</p>

<blockquote>
  <p><em>Caso esteja confuso para você, pense em um método como sendo uma função ou um algoritmo qualquer (na prática não há muita diferença).
Mas não esqueça, métodos são sempre VERBOS DE AÇÃO.</em></p>
</blockquote>

<h3 id="propriedades-ou-atributos">Propriedades (ou atributos)</h3>
<p>São <strong>características</strong>, qualidades, daquilo que estamos tentando representar.</p>

<p>Se pensarmos em um carro, temos propriedades como: material, potência, velocidade máxima, velocidade atual, capacidade de combustivel.</p>

<p>Já utilizando o exemplo do cliente do banco, teremos propriedades como: nome, endereço, saldo bancário, limite de empréstimo, etc.</p>

<h3 id="classe">Classe</h3>
<p>Uma classe, nada mais é do que um mapeamento de um objeto do mundo real, porém a classe NÃO é o objeto. A classe é como se fosse um molde, uma receita.</p>

<p>Toda classe possui <strong>métodos</strong> (ações) e <strong>propriedades</strong> (qualidades).</p>

<p>Toda classe também possui um, ou mais, método especial que é invocado quando criamos uma <strong>instância</strong> desta classe (não se preocupe, explicarei mais a frente o que é uma instância). Este método especial é chamado de <strong>construtor</strong>. O construtor é o único método que não é um verbo de ação, mas sim o nome da própria classe.</p>

<p>Ao criarmos uma classe de um carro, nós estamos descrevendo o que um carro TEM (propriedades) e o que um carro pode FAZER (métodos). Vejamos um exemplo:</p>

<code-block csharp="" ruby="">
<div>

<figure class="highlight"><pre><code class="language-csharp" data-lang="csharp"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code"><pre><span class="k">public</span> <span class="k">class</span> <span class="nc">Carro</span>
<span class="p">{</span>
  <span class="c1">//Essas são as nossas propriedades</span>
  <span class="k">public</span> <span class="kt">int</span> <span class="n">VelocidadeAtual</span><span class="p">;</span>
  <span class="k">public</span> <span class="kt">int</span> <span class="n">VelocidadeMaxima</span><span class="p">;</span>
  <span class="k">public</span> <span class="kt">int</span> <span class="n">TaxaDeAceleracao</span><span class="p">;</span>
  <span class="k">public</span> <span class="kt">string</span> <span class="n">Modelo</span><span class="p">;</span>
  <span class="k">public</span> <span class="kt">string</span> <span class="n">NomeFabricante</span><span class="p">;</span>

  <span class="k">public</span> <span class="nf">Carro</span><span class="p">()</span>
  <span class="p">{</span>
    <span class="c1">//Podemos definir algumas coisas aqui quando</span>
    <span class="c1">//cada carro for criado. Este é o nosso construtor.</span>
  <span class="p">}</span>

  <span class="c1">//Este é o nosso método, repare que ele aumenta</span>
  <span class="c1">//a velocidade atual com a taxa de aceleração.</span>
  <span class="k">public</span> <span class="k">void</span> <span class="nf">Acelerar</span><span class="p">()</span>
  <span class="p">{</span>
    <span class="n">VelocidadeAtual</span> <span class="p">+=</span> <span class="n">TaxaDeAceleracao</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

</div>
<div>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre><span class="k">class</span> <span class="nc">Carro</span>
  <span class="c1">#definimos os atributos</span>
  <span class="nb">attr_accessor</span> <span class="ss">:velocidadeAtual</span><span class="p">,</span>
                <span class="ss">:velocidadeMaxima</span><span class="p">,</span> 
                <span class="ss">:taxaDeAceleracao</span><span class="p">,</span> 
                <span class="ss">:modelo</span><span class="p">,</span>
                <span class="ss">:nomeFabricante</span>

  <span class="k">def</span> <span class="nf">initialize</span><span class="p">()</span>
    <span class="c1">#inicializamos os atributos</span>
    <span class="vi">@velocidadeAtual</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="vi">@velocidadeMaxima</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="vi">@taxaDeAceleracao</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="vi">@modelo</span> <span class="o">=</span> <span class="s2">""</span>
    <span class="vi">@nomeFabricante</span> <span class="o">=</span> <span class="s2">""</span>
  <span class="k">end</span>
 
 <span class="k">def</span> <span class="nf">acelerar</span><span class="p">()</span>
   <span class="vi">@velocidadeAtual</span> <span class="o">+=</span> <span class="vi">@taxaDeAceleracao</span>
 <span class="k">end</span>
<span class="k">end</span>
</pre></td></tr></tbody></table></code></pre></figure>

</div>
</code-block>

<h3 id="instância">Instância</h3>
<p>A instância é o objeto propriamente dito. Pegamos a nossa “receita” (<strong>classe</strong>) do carro, e a partir dela criamos vários carros. Cada carro criado é uma instância.</p>

<blockquote>
  <p>É importante ressaltar que cada instância possui suas próprias propriedades, com valores independentes.</p>
</blockquote>

<p>Por exemplo:</p>

<code-block csharp="" ruby="">
<div>

<figure class="highlight"><pre><code class="language-csharp" data-lang="csharp"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="code"><pre><span class="c1">//Este método é o nosso programa principal.</span>
<span class="k">public</span> <span class="k">void</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
  <span class="kt">var</span> <span class="n">carro1</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Carro</span><span class="p">();</span> <span class="c1">//criamos uma instância de Carro</span>
  <span class="kt">var</span> <span class="n">carro2</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Carro</span><span class="p">();</span>

  <span class="n">carro1</span><span class="p">.</span><span class="n">Modelo</span> <span class="p">=</span> <span class="s">"Celta 1.0"</span><span class="p">;</span>
  <span class="n">carro1</span><span class="p">.</span><span class="n">Fabricante</span> <span class="p">=</span> <span class="s">"Chevrolet"</span><span class="p">;</span>
  <span class="n">carro1</span><span class="p">.</span><span class="n">VelocidadeMaxima</span> <span class="p">=</span> <span class="m">120</span><span class="p">;</span>
  <span class="n">carro1</span><span class="p">.</span><span class="n">TaxaDeAceleracao</span> <span class="p">=</span> <span class="m">20</span><span class="p">;</span>
  <span class="n">carro1</span><span class="p">.</span><span class="n">VelocidadeAtual</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>

  <span class="n">carro2</span><span class="p">.</span><span class="n">Modelo</span> <span class="p">=</span> <span class="s">"Eclipse"</span><span class="p">;</span>
  <span class="n">carro2</span><span class="p">.</span><span class="n">Fabricante</span> <span class="p">=</span> <span class="s">"Mitsubishi"</span><span class="p">;</span>
  <span class="n">carro2</span><span class="p">.</span><span class="n">VelocidadeMaxima</span> <span class="p">=</span> <span class="m">220</span><span class="p">;</span>
  <span class="n">carro2</span><span class="p">.</span><span class="n">TaxaDeAceleracao</span> <span class="p">=</span> <span class="m">40</span><span class="p">;</span>
  <span class="n">carro2</span><span class="p">.</span><span class="n">VelocidadeAtual</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>

  <span class="n">carro1</span><span class="p">.</span><span class="nf">Acelerar</span><span class="p">();</span>
  <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">carro1</span><span class="p">.</span><span class="n">VelocidadeAtual</span><span class="p">);</span> <span class="c1">//Será impresso 20</span>

  <span class="n">carro2</span><span class="p">.</span><span class="nf">Acelerar</span><span class="p">();</span>
  <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">carro2</span><span class="p">.</span><span class="n">VelocidadeAtual</span><span class="p">);</span> <span class="c1">//Será impresso 40</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

</div>
<div>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre><span class="c1">#Este é o nosso programa principal.</span>
<span class="n">carro1</span> <span class="o">=</span> <span class="no">Carro</span><span class="p">.</span><span class="nf">new</span> <span class="c1">#criamos uma instância de Carro</span>
<span class="n">carro2</span> <span class="o">=</span> <span class="no">Carro</span><span class="p">.</span><span class="nf">new</span>

<span class="n">carro1</span><span class="p">.</span><span class="nf">modelo</span> <span class="o">=</span> <span class="s2">"Celta 1.0"</span>
<span class="n">carro1</span><span class="p">.</span><span class="nf">nomeFabricante</span> <span class="o">=</span> <span class="s2">"Chevrolet"</span>
<span class="n">carro1</span><span class="p">.</span><span class="nf">velocidadeMaxima</span> <span class="o">=</span> <span class="mi">120</span>
<span class="n">carro1</span><span class="p">.</span><span class="nf">taxaDeAceleracao</span> <span class="o">=</span> <span class="mi">20</span>
<span class="n">carro1</span><span class="p">.</span><span class="nf">velocidadeAtual</span> <span class="o">=</span> <span class="mi">0</span>

<span class="n">carro2</span><span class="p">.</span><span class="nf">modelo</span> <span class="o">=</span> <span class="s2">"Eclipse"</span>
<span class="n">carro2</span><span class="p">.</span><span class="nf">nomeFabricante</span> <span class="o">=</span> <span class="s2">"Mitsubishi"</span>
<span class="n">carro2</span><span class="p">.</span><span class="nf">velocidadeMaxima</span> <span class="o">=</span> <span class="mi">220</span>
<span class="n">carro2</span><span class="p">.</span><span class="nf">taxaDeAceleracao</span> <span class="o">=</span> <span class="mi">40</span>
<span class="n">carro2</span><span class="p">.</span><span class="nf">velocidadeAtual</span> <span class="o">=</span> <span class="mi">0</span>

<span class="n">carro1</span><span class="p">.</span><span class="nf">acelerar</span>
<span class="nb">puts</span> <span class="n">carro1</span><span class="p">.</span><span class="nf">velocidadeAtual</span> <span class="c1">#Será impresso 20</span>

<span class="n">carro2</span><span class="p">.</span><span class="nf">acelerar</span><span class="p">();</span>
<span class="nb">puts</span> <span class="n">carro2</span><span class="p">.</span><span class="nf">velocidadeAtual</span> <span class="c1">#Será impresso 40</span>
</pre></td></tr></tbody></table></code></pre></figure>

</div>
</code-block>

<h2 id="os-pilares-da-orientação-a-objetos">Os pilares da orientação a objetos</h2>
<p>A orientação a objetos tem três pilares básicos: herança, polimorfismo e encapsulamento. Não é correto afirmar que programamos de forma orientada a objetos só porque criamos meia dúzia de classes para separar nossa lógica. É importantiíssimo respeitar esses três pilares.</p>

<blockquote>
  <p><em>Não se preocupe se não entende-los agora. O importante é saber que eles existem e ter uma breve noção do que é cada um. Nos próximos posts veremos na prática cada um deles acontecendo.</em></p>
</blockquote>

<h3 id="herança">Herança</h3>
<p>A herança é a capacidade que uma classe tem de “aprender”, ou “absorver” capacidades de outras classes. A herança nos poupa muita escrita de código.
Imagine a seguinte situação, uma <strong>pessoa</strong> pode ser representada pela seguinte classe:</p>

<code-block csharp="" ruby="">
<div>

<figure class="highlight"><pre><code class="language-csharp" data-lang="csharp"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="code"><pre><span class="k">public</span> <span class="k">class</span> <span class="nc">Pessoa</span>
<span class="p">{</span>
  <span class="k">public</span> <span class="kt">int</span> <span class="n">Idade</span><span class="p">;</span>
  <span class="k">public</span> <span class="kt">string</span> <span class="n">Nome</span><span class="p">;</span>
  <span class="k">public</span> <span class="kt">string</span> <span class="n">CPF</span><span class="p">;</span>
  <span class="k">public</span> <span class="kt">string</span> <span class="n">RG</span><span class="p">;</span>

  <span class="c1">//Este é o nosso construtor.</span>
  <span class="k">public</span> <span class="nf">Pessoa</span><span class="p">()</span>
  <span class="p">{</span>
    <span class="c1">//Lógica de inicialização da pessoa aqui.</span>
  <span class="p">}</span>

  <span class="k">public</span> <span class="k">void</span> <span class="nf">Caminhar</span><span class="p">()</span>
  <span class="p">{</span>
    <span class="c1">//Lógica para fazer a pessoa caminhar.</span>
  <span class="p">}</span>

  <span class="k">public</span> <span class="k">void</span> <span class="nf">Comer</span><span class="p">()</span>
  <span class="p">{</span>
    <span class="c1">//Lógica para comer.</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

</div>
<div>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="code"><pre><span class="k">class</span> <span class="nc">Pessoa</span>
    <span class="c1">#definimos os atributos</span>
  <span class="nb">attr_accessor</span> <span class="ss">:idade</span><span class="p">,</span>
                <span class="ss">:nome</span><span class="p">,</span>
                <span class="ss">:CPF</span><span class="p">,</span>
                <span class="ss">:RG</span>

  <span class="c1">#Este é o nosso construtor</span>
  <span class="k">def</span> <span class="nf">initialize</span><span class="p">()</span>
    <span class="vi">@idade</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="vi">@nome</span> <span class="o">=</span> <span class="s2">""</span>
    <span class="vi">@CPF</span> <span class="o">=</span> <span class="s2">""</span>
    <span class="vi">@RG</span> <span class="o">=</span> <span class="s2">""</span>
  <span class="k">end</span>
  
  <span class="k">def</span> <span class="nf">caminhar</span><span class="p">()</span>
    <span class="c1">#Lógica para fazer a pessoa caminhar.</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">comer</span><span class="p">()</span>
    <span class="c1">#Lógica para comer.</span>
  <span class="k">end</span>
<span class="k">end</span>
</pre></td></tr></tbody></table></code></pre></figure>

</div>
</code-block>

<p>Podemos ver que cada pessoa possui suas propriedades (idade, nome, cpf e rg) e ações (caminhar e comer).
Retomando o exemplo do cliente de banco, podemos dizer que todo cliente de banco É uma pessoa. Logo, cliente de banco pode HERDAR de pessoa.</p>

<code-block csharp="" ruby="">
<div>

<figure class="highlight"><pre><code class="language-csharp" data-lang="csharp"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre><span class="k">public</span> <span class="k">class</span> <span class="nc">ClienteDeBanco</span> <span class="p">:</span> <span class="n">Pessoa</span>
<span class="p">{</span>
  <span class="k">public</span> <span class="kt">string</span> <span class="n">Agencia</span><span class="p">;</span>
  <span class="k">public</span> <span class="kt">string</span> <span class="n">ContaCorrente</span><span class="p">;</span>

  <span class="k">public</span> <span class="nf">ClienteDeBanco</span><span class="p">()</span>
  <span class="p">{</span>
    <span class="c1">//Aqui vai nossa lógica de inicialização</span>
  <span class="p">}</span>

  <span class="k">public</span> <span class="kt">int</span> <span class="nf">EfetuarSaque</span><span class="p">()</span>
  <span class="p">{</span>
    <span class="c1">//Lógica para efetuar saque.</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

</div>
<div>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre><span class="k">class</span> <span class="nc">ClienteDeBanco</span> <span class="o">&lt;</span> <span class="no">Pessoa</span>
  <span class="nb">attr_accessor</span> <span class="ss">:agencia</span><span class="p">,</span>
                <span class="ss">:contaCorrente</span>

  <span class="k">def</span> <span class="nf">initialize</span>
    <span class="vi">@agencia</span> <span class="o">=</span> <span class="s2">""</span>
    <span class="vi">@contaCorrente</span> <span class="o">=</span> <span class="s2">""</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">efetuarSaque</span>
    <span class="c1">#Lógica para efetuar saque.</span>
  <span class="k">end</span>
<span class="k">end</span>
</pre></td></tr></tbody></table></code></pre></figure>

</div>
</code-block>

<p>O que exatamente o código acima significa? Significa que, toda instância de ClienteDeBanco que criarmos, poderá fazer tudo o que uma Pessoa faz (caminhar e comer), terá as mesmas propriedades que uma Pessoa tem (idade, cpf, rg, nome), e além disso ele também terá uma Agência e uma Conta Corrente, além de poder efetuar saques.</p>

<h3 id="polimorfismo">Polimorfismo</h3>
<p>Polimorfismo, basicamente falando, é a capacidade que um objeto, de um determinado tipo, tem de se transformar em outro, ou se passar por outro.</p>

<p>É importante saber que é possível o Polimorfismo acontecer, e que toda linguagem O.O. lhe permite fazer isso.</p>

<blockquote>
  <p>Não se preocupe sobre COMO ou QUANDO você irá usar o polimorfismo. Veremos isso mais a frente.</p>
</blockquote>

<h3 id="encapsulamento">Encapsulamento</h3>
<p>Encapsulamento é a capacidade do objeto (ou de um sistema) de “esconder” dos outros objetos tudo aquilo que não é relevante a eles.</p>

<p>Você deve ter reparado que nos códigos de exemplo deste post, a palavra <strong>public</strong> apareceu bastante. Esta palavra é o atributo de visibilidade de uma propriedade ou método.</p>

<blockquote>
  <p>Dizer que algo, em um sistema O.O. é público, significa dizer que qualquer classe pode acessar aquilo.</p>
</blockquote>

<p>Além do <strong>public</strong> poderíamos usar o <strong>private</strong>. Mas quando usar o private? Quando vamos escrever algum método (ou propriedade) que “ninguém” mais do seu sistema precisa conhecer.</p>

<p>Voltemos a falar do carro, quando você entra no carro e vira a chave, você está dando para ele o comando de “Ligar”, para ligar, é necessário energizar o motor, dar a partida, injetar gasolina, dentre outras coisas que o carro faz para você. O que o carro faz é <strong>encapsular</strong> todas essas funções. Você não precisa saber que elas acontecem e muito menos como acontecem (a menos que você seja um apaixonado por mecânica), você só precisa saber que ao virar a chave o carro ligará.</p>

<p>Como isso ficaria em termos de código?</p>

<code-block csharp="" ruby="">
<div>

<figure class="highlight"><pre><code class="language-csharp" data-lang="csharp"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
</pre></td><td class="code"><pre> 
<span class="k">public</span> <span class="k">class</span> <span class="nc">Carro</span>
<span class="p">{</span>
  <span class="c1">//Essas são as nossas propriedades</span>
  <span class="k">public</span> <span class="kt">int</span> <span class="n">VelocidadeAtual</span><span class="p">;</span>
  <span class="k">public</span> <span class="kt">int</span> <span class="n">VelocidadeMaxima</span><span class="p">;</span>
  <span class="k">public</span> <span class="kt">int</span> <span class="n">TaxaDeAceleracao</span><span class="p">;</span>
  <span class="k">public</span> <span class="kt">string</span> <span class="n">Modelo</span><span class="p">;</span>
  <span class="k">public</span> <span class="kt">string</span> <span class="n">NomeFabricante</span><span class="p">;</span>

  <span class="k">public</span> <span class="nf">Carro</span><span class="p">()</span>
  <span class="p">{</span>
  <span class="p">}</span>

  <span class="k">public</span> <span class="k">void</span> <span class="nf">Acelerar</span><span class="p">()</span>
  <span class="p">{</span>
    <span class="n">VelocidadeAtual</span> <span class="p">+=</span> <span class="n">TaxaDeAceleracao</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="k">public</span> <span class="k">void</span> <span class="nf">Ligar</span><span class="p">()</span> 
  <span class="p">{</span>
    <span class="nf">DarPartida</span><span class="p">();</span>
    <span class="nf">LigarOMotor</span><span class="p">();</span>
    <span class="nf">LigarPainel</span><span class="p">();</span>
  <span class="p">}</span> 

  <span class="k">private</span> <span class="k">void</span> <span class="nf">DarPartida</span><span class="p">()</span> 
  <span class="p">{</span>
    <span class="c1">//Lógica para dar a partida</span>
  <span class="p">}</span> 

  <span class="k">private</span> <span class="k">void</span> <span class="nf">LigarOMotor</span><span class="p">()</span> 
  <span class="p">{</span>
    <span class="c1">//Lógica para ligar o motor</span>
  <span class="p">}</span> 

  <span class="k">private</span> <span class="k">void</span> <span class="nf">LigarPainel</span><span class="p">()</span> 
  <span class="p">{</span>
    <span class="c1">//Lógica para liga o painel</span>
  <span class="p">}</span> 
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>
 
</div>
<div>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
</pre></td><td class="code"><pre> 
<span class="k">class</span> <span class="nc">Carro</span>
  <span class="nb">attr_accessor</span> <span class="ss">:velocidadeAtual</span><span class="p">,</span>
                <span class="ss">:velocidadeMaxima</span><span class="p">,</span>
                <span class="ss">:taxaDeAceleracao</span><span class="p">,</span>
                <span class="ss">:modelo</span><span class="p">,</span>
                <span class="ss">:nomeFabricante</span>

  <span class="k">def</span> <span class="nf">initialize</span><span class="p">()</span>
    <span class="vi">@velocidadeAtual</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="vi">@velocidadeMaxima</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="vi">@taxaDeAceleracao</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="vi">@modelo</span> <span class="o">=</span> <span class="s2">""</span>
    <span class="vi">@nomeFabricante</span> <span class="o">=</span> <span class="s2">""</span>
  <span class="k">end</span>
  
  <span class="k">def</span> <span class="nf">acelerar</span><span class="p">()</span>
    <span class="vi">@velocidadeAtual</span> <span class="o">+=</span> <span class="vi">@taxaDeAceleracao</span>
  <span class="k">end</span>
  
  <span class="k">def</span> <span class="nf">ligar</span><span class="p">()</span>
    <span class="n">darPartida</span>
    <span class="n">ligarOMotor</span>
    <span class="n">ligarPainel</span>
  <span class="k">end</span>
  
  <span class="k">def</span> <span class="nf">darPartida</span><span class="p">()</span>
    <span class="c1">#Lógica para dar a partida</span>
  <span class="k">end</span>
  
  <span class="k">def</span> <span class="nf">ligarOMotor</span><span class="p">()</span>
    <span class="c1">#Lógica para ligar o motor</span>
  <span class="k">end</span>
  
  <span class="k">def</span> <span class="nf">ligarPainel</span><span class="p">()</span>
    <span class="c1">#Lógica para ligar o painel</span>
  <span class="k">end</span>
  
  <span class="c1">#Aqui tornamos nossos métodos privados</span>
  <span class="kp">private</span> <span class="ss">:darPartida</span><span class="p">,</span> <span class="ss">:ligarOMotor</span><span class="p">,</span> <span class="ss">:ligarPainel</span>
<span class="k">end</span>
</pre></td></tr></tbody></table></code></pre></figure>
 
</div>
</code-block>

<h2 id="conclusão">Conclusão</h2>
<p>Neste artigo eu tentei explicar e exemplificar a base da orientação a objetos. Mas programar de forma realmente orientada a objetos é bem mais do que separar funções em classes e ter alguma estrutura de herança. 
Nos próximos artigos dessa série eu abordarei os princípios do S.O.L.I.D e ao final, a cereja do nosso bolo serão as metodologias de teste T.D.D. e B.D.D., portanto, não perca!</p>

<p>Dúvidas, sugestões? Deixe o seu comentário.</p>]]></content><author><name>Ricardo da Verdade Silva</name></author><category term="[&quot;blog&quot;]" /><category term="Orientação a Objetos" /><category term="Profissionalizando" /><category term="P.O.O." /><category term="Programação" /><summary type="html"><![CDATA[Sou programador profissional a pouco mais de 3 anos. Apesar de parecer pouco tempo, já vi muita coisa deste mercado. Já vi muitos profissionais com 15 anos de experiência, diversos títulos, e que até hoje não sabem programar de forma REALMENTE orientada a objetos.]]></summary></entry><entry xml:lang="pt-BR"><title type="html">Aprendendo Mais Facilmente a Programar</title><link href="http://ricardovsilva.github.io/blog/2015/08/19/como-diminuir-a-dificuldade-no-aprendizado-de-logica-de-programacao/" rel="alternate" type="text/html" title="Aprendendo Mais Facilmente a Programar" /><published>2015-08-19T00:00:00+00:00</published><updated>2015-08-19T00:00:00+00:00</updated><id>http://ricardovsilva.github.io/blog/2015/08/19/como-diminuir-a-dificuldade-no-aprendizado-de-logica-de-programacao</id><content type="html" xml:base="http://ricardovsilva.github.io/blog/2015/08/19/como-diminuir-a-dificuldade-no-aprendizado-de-logica-de-programacao/"><![CDATA[<p>Tenho visto a dificuldade que muitos iniciantes no estudo de algoritmos e linguagens de programação tem.
Estou na minha segunda faculdade, primeiro cursei Desenvolvimento de Jogos na FATEC Carapicuíba (e infelizmente não conclui, mas isso fica para outro post),
e agora estou fazendo Análise e Desenvolvimento de Sistemas na FATEC São Paulo.
No terceiro semestre do curso de análise de sistemas, eu constatei exatamente a mesma situação que presenciei no terceiro semestre do curso de desenvolvimento de jogos:
após dois semestres tendo lógica e linguagens de programação, muita gente ainda tem muita dificuldade para desenvolver o raciocínio e escrever algoritmos simples.
Quero deixar claro que eu não tenho nenhum estudo científico para referênciar e embasar a minha afirmação, ela se dá unicamente pela minha experiência pessoal.
Então, a que se deve toda esta dificuldade? Programar é extremamente difícil? Os professores são muito ruins? Os alunos são muito ruins? Em minha opinião, a resposta para
todas as perguntas é não. O que eleva a dificuldade no aprendizado e no desenvolvimento da lógica de programação, é justamente a falta de atenção que é dada aos elementos mais simples
do desenvolvimento e que estão presentes em praticamente todas as linguagens de programação (eu desconheço alguma que não os tenha, se você conhecer, por favor, poste nos comentários).</p>

<h2 id="elementos-básicos">Elementos Básicos</h2>
<p>Todo algoritmo que eu conheço, desenvolvido em qualquer linguagem de programação que eu conheço, são básicamente e fundamentalmente constituidos de:</p>

<ul>
  <li>
    <p>Operadores Aritméticos</p>
  </li>
  <li>
    <p>Operadores Lógicos</p>
  </li>
  <li>
    <p>Controladores de Fluxo</p>
  </li>
  <li>
    <p>Estruturas de Repetição</p>
  </li>
</ul>

<h3 id="operadores-aritméticos">Operadores Aritméticos</h3>
<p>Operadores aritméticos são os tão conhecidos operadores matemáticos, que já utilizamos no nosso dia-a-dia e aprendemos desde o primeiro dia
em que colocamos os pés na escola.</p>

<p>Os quatro operadores básicos que toda linguagem tem são: + (soma), - (subtração), * (multiplicação), / (divisão).</p>

<p>Além dos operadores básicos, existem outros operadores que são extremamente úteis, por exemplo o operador mod, ou resto de divisão
(representado pelo símbolo % na maioria das linguagens). Por exemplo, podemos utilizar este operador para saber se um número é par:</p>

<ul>
  <li>se numero % 2 for igual a 0, significa que esse número tem divisão exata por 2, logo ele é par.</li>
</ul>

<p>Algumas linguagens possuem operadores matemáticos implementados. Por exemplo, em python podemos utilizar o símbolo ** para representar potência:</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="n">a</span> <span class="o">=</span> <span class="mi">2</span><span class="o">**</span><span class="mi">2</span>
<span class="n">b</span> <span class="o">=</span> <span class="mi">2</span><span class="o">**</span><span class="mi">3</span>
<span class="n">c</span> <span class="o">=</span> <span class="mi">10</span><span class="o">**</span><span class="mi">2</span>

<span class="k">print</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="p">))</span> <span class="c1">#4
</span><span class="k">print</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">b</span><span class="p">))</span> <span class="c1">#8
</span><span class="k">print</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">c</span><span class="p">))</span> <span class="c1">#100</span></code></pre></figure>

<p>Minha recomendação é: procure a documentação básica da línguagem que você quer aprender e verifique quais operadores aritméticos eles possuem. 
A disponibilidade, ou não, de um determinado operador vai impactar diretamente a forma como você irá desenvolver o seu algoritmo.</p>

<h3 id="controladores-de-fluxo">Controladores de Fluxo</h3>
<p>O que são os controladores de fluxo? Para que servem? Quem são eles?</p>

<p>Como o próprio nome sugere, eles servem para controlar o fluxo de uma aplicação.</p>

<p>É através deles que o seu programa terá a inteligência para tomar decisões. São os controladores de fluxo que permitirão ao seu programa
fazer algo, ou não. Os controladores de fluxo são:</p>

<ul>
  <li>
    <p>if - Sempre que uma determinada condição for verdadeira, ou não falsa (veremos isso nos exemplos), tudo que está especificado dentro do bloco do if será executado.</p>
  </li>
  <li>
    <p>else - O else é a situação contrária ao if. Um if não precisa de um else para existir, mas o else precisa do if. O else não executa nenhuma verificação lógica, sempre que a condição do if
    for falsa, o else (se existir) será executado.</p>
  </li>
</ul>

<p>Vejamos o seguinte problema:</p>

<blockquote>
  <p><em>Um colégio precisa de um programa para verificar se os seus alunos foram aprovados em determinada disciplina. De acordo com as regras desse colégio:</em></p>

  <ul>
    <li>
      <p><em>Cada aluno é avaliado semestralmente, ou seja, possui 2 notas.</em></p>
    </li>
    <li>
      <p><em>A média do aluno é a média aritmética das notas. Ou seja, as duas notas somadas e o resultado dividido por dois.</em></p>
    </li>
    <li>
      <p><em>Todas as notas são números inteiros (a fim de simplificar o nosso exemplo)</em></p>
    </li>
    <li>
      <p><em><strong>SE</strong> o aluno tiver nota <strong>maior ou igual</strong> a 6, ele será aprovado, <strong>senão</strong> será reprovado.</em></p>
    </li>
  </ul>
</blockquote>

<p>Sempre, eu digo sempre, que você for tentar desenvolver um algoritmo, preste atenção ao problema a ser resolvido. Tente escrever um texto dos requisitos, do cenário, a partir dele já é possível extrair
dados importantes ao funcionamento do nosso algoritmo.</p>

<p>Como iremos resolver o problema acima? Recomendo que você, leitor, tente descrever o passo a passo deste algoritmo antes de continuar lendo o passo a passo abaixo:</p>

<ol>
  <li>
    <p>Definiremos a <strong>quantidade de notas</strong> como sendo 2</p>
  </li>
  <li>
    <p>Obteremos a <strong>soma</strong> entre a <strong>nota1</strong> e a <strong>nota2</strong></p>
  </li>
  <li>
    <p>Obteremos a <strong>média</strong> através da divisão da <strong>soma</strong> pela <strong>quantidade de notas</strong></p>
  </li>
  <li>
    <p><strong>Se</strong> a <strong>média</strong> for <strong>maior ou igual</strong> a 6, então o aluno foi aprovado</p>
  </li>
  <li>
    <p><strong>Senão</strong>, o aluno foi reprovado</p>
  </li>
</ol>

<p>Esta é a estrutura básica do nosso algoritmo. Como traduzimos isso para linguagens de programação?</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre><span class="c1">#ruby</span>
<span class="k">def</span> <span class="nf">verificar_aluno_aprovado</span><span class="p">(</span><span class="n">nota1</span><span class="p">,</span> <span class="n">nota2</span><span class="p">)</span>
   <span class="n">quantidade_de_notas</span> <span class="o">=</span> <span class="mi">2</span>
   <span class="n">soma</span> <span class="o">=</span> <span class="n">nota1</span> <span class="o">+</span> <span class="n">nota2</span>
   <span class="n">media</span> <span class="o">=</span> <span class="n">soma</span><span class="o">/</span><span class="n">quantidade_de_notas</span>
   <span class="k">if</span> <span class="n">media</span> <span class="o">&gt;=</span> <span class="mi">6</span>
      <span class="k">return</span> <span class="kp">true</span>
   <span class="k">else</span>
      <span class="k">return</span> <span class="kp">false</span>
   <span class="k">end</span>
<span class="k">end</span>
</pre></td></tr></tbody></table></code></pre></figure>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre><span class="c1">#python
</span><span class="k">def</span> <span class="nf">verificar_aluno_aprovado</span><span class="p">(</span><span class="n">nota1</span><span class="p">,</span> <span class="n">nota2</span><span class="p">)</span>
   <span class="n">quantidade_de_notas</span> <span class="o">=</span> <span class="mi">2</span>
   <span class="n">soma</span> <span class="o">=</span> <span class="n">nota1</span> <span class="o">+</span> <span class="n">nota2</span>
   <span class="n">media</span> <span class="o">=</span> <span class="n">soma</span><span class="o">/</span><span class="n">quantidade_de_notas</span>
   <span class="k">if</span> <span class="n">media</span> <span class="o">&gt;=</span> <span class="mi">6</span>
      <span class="k">return</span> <span class="n">true</span>
   <span class="k">else</span>
      <span class="k">return</span> <span class="n">false</span>
</pre></td></tr></tbody></table></code></pre></figure>

<figure class="highlight"><pre><code class="language-csharp" data-lang="csharp"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre><span class="c1">//c#</span>
<span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="nf">VerificarAlunoAprovado</span><span class="p">(</span><span class="kt">int</span> <span class="n">nota1</span><span class="p">,</span> <span class="kt">int</span> <span class="n">nota2</span><span class="p">)</span>
<span class="p">{</span>
   <span class="kt">int</span> <span class="n">quantidadeDeNotas</span> <span class="p">=</span> <span class="m">2</span>
   <span class="kt">int</span> <span class="n">soma</span> <span class="p">=</span> <span class="n">nota1</span> <span class="p">+</span> <span class="n">nota2</span><span class="p">;</span>
   <span class="kt">int</span> <span class="n">media</span> <span class="p">=</span> <span class="n">soma</span><span class="p">/</span><span class="n">quantidadeDeNotas</span><span class="p">;</span>
                                        
   <span class="k">if</span><span class="p">(</span><span class="n">media</span> <span class="p">&gt;=</span> <span class="m">6</span><span class="p">)</span>
   <span class="p">{</span>                                    
	  <span class="k">return</span> <span class="k">true</span><span class="p">;</span>
   <span class="p">}</span>
   <span class="k">else</span>
   <span class="p">{</span>
      <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
   <span class="p">}</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>

<p>Continua na parte 2…</p>]]></content><author><name>Ricardo da Verdade Silva</name></author><category term="[&quot;blog&quot;]" /><category term="desenvolvimento básico" /><category term="algoritmos" /><category term="lógica de programação" /><category term="nível júnior" /><category term="passos de bebê" /><summary type="html"><![CDATA[Tenho visto a dificuldade que muitos iniciantes no estudo de algoritmos e linguagens de programação tem. Estou na minha segunda faculdade, primeiro cursei Desenvolvimento de Jogos na FATEC Carapicuíba (e infelizmente não conclui, mas isso fica para outro post), e agora estou fazendo Análise e Desenvolvimento de Sistemas na FATEC São Paulo. No terceiro semestre do curso de análise de sistemas, eu constatei exatamente a mesma situação que presenciei no terceiro semestre do curso de desenvolvimento de jogos: após dois semestres tendo lógica e linguagens de programação, muita gente ainda tem muita dificuldade para desenvolver o raciocínio e escrever algoritmos simples. Quero deixar claro que eu não tenho nenhum estudo científico para referênciar e embasar a minha afirmação, ela se dá unicamente pela minha experiência pessoal. Então, a que se deve toda esta dificuldade? Programar é extremamente difícil? Os professores são muito ruins? Os alunos são muito ruins? Em minha opinião, a resposta para todas as perguntas é não. O que eleva a dificuldade no aprendizado e no desenvolvimento da lógica de programação, é justamente a falta de atenção que é dada aos elementos mais simples do desenvolvimento e que estão presentes em praticamente todas as linguagens de programação (eu desconheço alguma que não os tenha, se você conhecer, por favor, poste nos comentários).]]></summary></entry><entry xml:lang="pt-BR"><title type="html">A Importância dos Requisitos</title><link href="http://ricardovsilva.github.io/blog/2015/08/14/a-importancia-dos-requisitos/" rel="alternate" type="text/html" title="A Importância dos Requisitos" /><published>2015-08-14T00:00:00+00:00</published><updated>2015-08-14T00:00:00+00:00</updated><id>http://ricardovsilva.github.io/blog/2015/08/14/a-importancia-dos-requisitos</id><content type="html" xml:base="http://ricardovsilva.github.io/blog/2015/08/14/a-importancia-dos-requisitos/"><![CDATA[<p>Este post é uma tradução livre que eu fiz do livro Code
Complete, Second Edition, Capitulo 3.1 (Importance of Prerequisites), páginas 27 - 31.
No momento estou lendo-o, este trecho eu achei extremamente válido para o dia-a-dia de
qualquer desenvolvedor e resolvi compartilha-lo aqui.</p>

<h2 id="argumento-totalmente-convincente-e-infalível-para-levantar-pré-requisitos-antes-da-construção">Argumento totalmente convincente e infalível para levantar pré-requisitos antes da construção</h2>

<p>“Suponha que você já foi para a montanha da definição de problemas, caminhou uma 
milha com o homem dos requisitos, lavou suas roupas na fonte da arquitetura, e, por 
fim, banhou-se nas puras águas da preparação. Então, você soube que, antes de 
implementar um sistema, você precisa entender o que esse sistema deverá fazer e como 
irá fazer.”</p>

<p><em>‘Ponto chave: Parte do seu trabalho como desenvolvedor é educar as pessoas a sua 
volta que não são desenvolvedoras sobre o processo de desenvolvimento. Este texto o 
ajudará a lidar com gerentes e chefes que ainda não viram a luz. Este texto é um 
argumento extendido para fazer o levantamento de requisitos e arquitetura - 
coletando, de forma correta, os aspectos críticos - antes de você começar a escrevar 
código, testar e debugar. Aprenda o argumento, então sente-se com o seu chefe e 
tenha uma conversa, de coração para coração, sobre o processo de desenvolvimento.’</em></p>

<h3 id="apele-para-a-lógica">Apele para a lógica</h3>
<p>Uma das idéias chave na programação eficiente é que preparação é importante. Faz 
todo sentido do mundo, antes de você começar a trabalhar em um projeto, você 
planejar o projeto. Grandes projetos demandam mais planejamento, pequenos projetos 
demandam menos planejamento (mas demandam algum planejamento). Do ponto de vista de 
um gerente, planejar significa determinar a quantidade de tempo, numero de pessoas, 
numero de computadores e outros recursos que o projeto precisa. Do ponto de vista de 
desenvolvimento, planejar significa entender o que você quer construir, assim você 
não precisa gastar dinheiro construindo a coisa errada.
Muitas vezes (quase sempre) os usuários não tem certeza imediata sobre o que eles 
querem, outras vezes tem certeza do que querem e não do que precisam. Esses casos 
demandarão mais esforço do que parece ideal para descobrir o que os usuários do seu 
sistema realmente precisam. Porém, ainda assim, é mais barato do que construir o 
software errado, jogar tudo fora, e ter que refazer.
Também é importante pensar em como construir o sistema antes de começar a construir 
o sistema. Você não quer gastar um monte de tempo e dinheiro entrando em becos sem 
saída, especialmente quando isto eleva os seus custos.</p>

<h3 id="apele-para-analogia">Apele para Analogia</h3>
<p>Construir um sistema é como qualquer outro projeto que demanda pessoas e dinheiro. 
Se você vai construir uma casa, você faz desenhos da arquitetura e da planta antes 
sair martelando pregos. Você terá sua planta revisada e aprovada antes de começar a 
misturar e derramar concreto. Ter um plano técnico para o desenvolvimento de 
software é tão importante quanto para construir uma casa.
Você não começa decorando a árvore de natal enquanto você não a tiver montado. Você 
não começa um churrasco sem ascender a churrasqueira. Você não faz uma viagem longa 
de tanque vazio. Você não se veste antes de tomar banho, e não coloca as meias após 
colocar o tênis. Quando se trata de desenvolvimento de software, as coisas devem ser 
feitas na ordem certa também, não há porque ser diferente.
Programadores estão no topo da cadeia alimentar do desenvolvimento de software. O 
arquiteto consome os requisitos, o designer de software (não o designer de tela) 
consome a arquitetura, e o desenvolvedor consome o design.
Compare a cadeia alimentar do desenvolvimento de software com uma cadeia alimentar 
real. No mundo real, gaivotas comem salmão fresco. É nutritivo para elas porque 
salmão come outros peixes menores, e esses comem insetos do mar. O resultado é uma 
cadeia alimentar saudável. Em programação, se você tiver comida saudável em cada 
estágio da cadeia, o resultado é código saudável sendo produzido por programadores 
felizes.
Em um ambiente poluido, os insetos do mar nadaram em lixo nuclear, os peixes menores 
foram contaminados por metais pesados, e os salmões que comeram esses peixes nadaram 
em águas poulidas por vazamentos de petroleo. As gaivotas são, para o azar delas, o 
fim da cadeia alimentar, então elas não só comem o petroleo dos salmões. Elas também 
consomem os metais pesados dos peixes menores e o lixo nuclear dos insetos marinhos. 
Em programação, se os requisitos estão contaminados, eles contaminam a arquitetura, 
a arquitetura por sua vez contamina a construção. Isso leva a programadores mal-
humorados e desnutridos e um software radioativo crivado com defeitos.
Se você está planejando um projeto com requisitos que provavelmente mudarão, você 
precisará identificar, antes de começar a desenvolver, os requísitos e elementos de 
arquitetura críticos que influenciarão em cada elemento do software. Um construtor 
que está desenvolvendo um projeto de casa não precisa saber cada detalhe da casa 
antes de começar a construir a primeira casa. Mas o construtor irá olhar o terreno, 
mapear a elétrica e a hidráulica da csa, dentre outras coisas criticas. Se o 
construtor não se preparar bem, a construção provavelmente atrasará quando o 
encanamento de esgoto precisar passar por baixo da casa que já foi construida.</p>

<h3 id="apele-para-dados">Apele para dados</h3>
<p>Estudiosos, nos ultimos 25 anos, provaran conclusivamente que vale a pena pagar para 
fazer as coisas da forma certa na primeira vez. Alterações desnecessárias são caras.
Pesquisadores da Hewlett-Packard, IBM, Hughes Aircraft, TRW, e outras organizações 
concluiram que eliminar um erro no inicio da construção permite que o retrabalho 
seja feito de 10 a 100 vezes mais barato do que quando o problema é encontrado na 
ultima parte do processo durante os testes ou após a release. Fontes: Fagan 1976; 
Humphrey, Synder, and Willis 1991; Leffingwell 1997; Willis et al. 1998; Grady 1999; 
Shull et al. 2002; Boehm and Turner 2004).
Em geral, o principio é encontrar o erro o mais próximo possível do momento em que 
ele foi introduzido. Quanto mais o defeito estiver na cadeia alimentar do software, 
mais dano ele causará em toda a cadeia. Uma vez que os requisitos são o primeiro elo 
da cadeia, defeitos de requisitos tem potencial para estar por mais tempo no sistema 
e para serem mais caros. Quanto mais no inicio da cadeia o problema for inserido, 
mais este defeito tende a se propagar pelo restante da cadeia. Isso também torna 
defeitos inseridos antes mais caros.
A maioria dos projetos tentam fazer a detecção de problemas somente no final do 
projeto, isso significa que debugar, identificar e fazer retrabalho para corrigir 
tomam mais de 50% do tempo gasto em um projeto saudável de desenvolvimento de 
software. Fontes: (Mills 1983; Boehm 1987; Cooper and Mullen 1993; Fishman 1996; 
Haley 1996; Wheeler, Brykczynski, e Meeson 1996; Jones 1998; Shull et al. 2002; 
Wiegers 2002).
Várias empresas concluiram que simplesmente focar na correção de defeitos mais cedo, 
e de forma continua no decorrer do projeto, ao invés de apenas efetuar testes ao fim 
pode cortar os custos de desenvolvimento e reuniões pela metade ou mais (fonte: 
McConnell 2004). Isto é um incentivo saudável para encontrar e consertar os 
problemas o mais cedo que você puder.</p>

<h3 id="teste-o-seu-chefe">Teste o seu chefe</h3>
<p>Quando você pensar que seu chefe entende a importância de trabalhar com pré-
requisitos antes de ir para a etapa de desenvolvimento, tente o teste abaixo para 
ter certeza.
Quais desses pontos são profecias auto realizáveis?</p>

<ul>
  <li>
    <p>É melhor começarmos a escrever o código imediatamente porque nós teremos um monte 
de debug e correções a fazer.</p>
  </li>
  <li>
    <p>Nós não planejamos muito tempo para testar porque não iremos encontrar muitos 
defeitos.</p>
  </li>
  <li>
    <p>Nós investigamos os requisitos e o design tão exaustivamente que eu não consigo 
pensar em maiores problemas que teremos durante a escrita de código ou debug.</p>
  </li>
</ul>]]></content><author><name>Ricardo da Verdade Silva</name></author><category term="[&quot;blog&quot;]" /><category term="análise de requisitos" /><category term="engenharia de software" /><category term="tradução" /><summary type="html"><![CDATA[Este post é uma tradução livre que eu fiz do livro Code Complete, Second Edition, Capitulo 3.1 (Importance of Prerequisites), páginas 27 - 31. No momento estou lendo-o, este trecho eu achei extremamente válido para o dia-a-dia de qualquer desenvolvedor e resolvi compartilha-lo aqui.]]></summary></entry></feed>