{"id":844,"date":"2024-09-09T10:39:10","date_gmt":"2024-09-09T13:39:10","guid":{"rendered":"https:\/\/adrianosantostreina.com.br\/blog\/?p=844"},"modified":"2024-09-17T09:01:42","modified_gmt":"2024-09-17T12:01:42","slug":"introducao-a-programacao-orientada-a-objetos","status":"publish","type":"post","link":"https:\/\/adrianosantostreina.com.br\/blog\/introducao-a-programacao-orientada-a-objetos\/","title":{"rendered":"Introdu\u00e7\u00e3o \u00e0 Programa\u00e7\u00e3o Orientada a Objetos"},"content":{"rendered":"\n<p>A Programa\u00e7\u00e3o Orientada a Objetos (POO) \u00e9 uma abordagem fundamental para o desenvolvimento de software, que facilita a cria\u00e7\u00e3o de sistemas mais estruturados, escal\u00e1veis e f\u00e1ceis de manter. Nela, os dados e as funcionalidades s\u00e3o organizados em &#8220;objetos&#8221;, baseados em &#8220;classes&#8221;. Cada objeto \u00e9 uma inst\u00e2ncia de uma classe e possui atributos (dados) e m\u00e9todos (fun\u00e7\u00f5es).<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>O principal objetivo da POO \u00e9 aproximar a modelagem de software ao mundo real, onde objetos do dia a dia interagem entre si. Por exemplo, em um sistema de gerenciamento de pedidos, podemos ter objetos como &#8220;Cliente&#8221;, &#8220;Produto&#8221; e &#8220;Pedido&#8221;, cada um com suas caracter\u00edsticas e comportamentos pr\u00f3prios.<\/p>\n\n\n\n<p>Os quatro pilares da POO \u2013 Encapsulamento, Heran\u00e7a, Polimorfismo e Abstra\u00e7\u00e3o \u2013 garantem que possamos construir software de forma mais eficiente e adapt\u00e1vel a mudan\u00e7as. Esses pilares proporcionam benef\u00edcios como a reutiliza\u00e7\u00e3o de c\u00f3digo, modularidade e flexibilidade no desenvolvimento, resultando em um software mais limpo e organizado.<\/p>\n\n\n\n<p>Nesta s\u00e9rie de posts, vamos explorar detalhadamente cada um desses pilares, come\u00e7ando pela introdu\u00e7\u00e3o de conceitos b\u00e1sicos e, nas pr\u00f3ximas semanas, mergulhando em como cada pilar pode ser implementado na pr\u00e1tica. Seja voc\u00ea um desenvolvedor experiente ou iniciante, essa s\u00e9rie ser\u00e1 \u00fatil para entender como a POO pode melhorar a qualidade do seu c\u00f3digo e ajudar a criar sistemas mais robustos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Encapsulamento: Protegendo e Organizando o C\u00f3digo<\/h3>\n\n\n\n<p>Encapsulamento \u00e9 um dos pilares mais importantes da Programa\u00e7\u00e3o Orientada a Objetos. Ele permite proteger os dados de uma classe, expondo apenas o que \u00e9 necess\u00e1rio para o uso externo, garantindo seguran\u00e7a e facilidade de manuten\u00e7\u00e3o. A ideia \u00e9 ocultar a implementa\u00e7\u00e3o interna, mostrando apenas o necess\u00e1rio.<\/p>\n\n\n\n<p>Imagine um software de <strong>Pedido de Venda<\/strong>. Voc\u00ea tem uma classe <code>Pedido<\/code> que cont\u00e9m informa\u00e7\u00f5es sens\u00edveis, como valores e descontos. A pr\u00e1tica do encapsulamento impede que essas informa\u00e7\u00f5es sejam alteradas diretamente, garantindo que as regras de neg\u00f3cio sejam respeitadas.<\/p>\n\n\n\n<p>Veja um exemplo simples de encapsulamento em Delphi:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">type\n  TPedido = class\n  private\n    FValorTotal: Currency;\n    FDesconto: Currency;\n  public\n    procedure AplicarDesconto(ADesconto: Currency);\n    function ObterValorFinal: Currency;\n  end;\n\nprocedure TPedido.AplicarDesconto(ADesconto: Currency);\nbegin\n  if ADesconto &lt; FValorTotal then\n    FDesconto := ADesconto;\nend;\n\nfunction TPedido.ObterValorFinal: Currency;\nbegin\n  Result := FValorTotal - FDesconto;\nend;\n<\/pre><\/div>\n\n\n\n<p>Neste exemplo, o <code>FValorTotal<\/code> e <code>FDesconto<\/code> est\u00e3o encapsulados, e apenas o m\u00e9todo <code>AplicarDesconto<\/code> pode alter\u00e1-los, garantindo que o desconto nunca seja maior que o valor total. Isso evita erros e inconsist\u00eancias no sistema.<\/p>\n\n\n\n<p>No pr\u00f3ximo artigo, veremos mais exemplos de encapsulamento aplicados em cen\u00e1rios reais.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Heran\u00e7a: Reutilizando C\u00f3digo para Facilitar o Desenvolvimento<\/h3>\n\n\n\n<p>A heran\u00e7a \u00e9 uma ferramenta poderosa na POO, permitindo que uma classe herde comportamentos e atributos de outra. Isso promove a reutiliza\u00e7\u00e3o de c\u00f3digo, tornando o desenvolvimento mais \u00e1gil e menos propenso a erros. No contexto de um <strong>ERP<\/strong>, por exemplo, imagine que voc\u00ea tenha uma classe <code>Pessoa<\/code> que armazena dados comuns a clientes, fornecedores e funcion\u00e1rios.<\/p>\n\n\n\n<p>Usando heran\u00e7a, podemos criar classes espec\u00edficas para cada um deles, herdando a estrutura b\u00e1sica da classe <code>Pessoa<\/code>:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">type\n  TPessoa = class\n  protected\n    FNome: string;\n    FEndereco: string;\n  public\n    procedure ExibirDados; virtual;\n  end;\n\n  TCliente = class(TPessoa)\n  private\n    FCredito: Currency;\n  public\n    procedure ExibirDados; override;\n  end;\n\nprocedure TPessoa.ExibirDados;\nbegin\n  Writeln('Nome: ' + FNome);\n  Writeln('Endere\u00e7o: ' + FEndereco);\nend;\n\nprocedure TCliente.ExibirDados;\nbegin\n  inherited; \/\/ Exibe nome e endere\u00e7o\n  Writeln('Cr\u00e9dito: ' + CurrToStr(FCredito));\nend;\n<\/pre><\/div>\n\n\n\n<p>Aqui, a classe <code>TCliente<\/code> herda <code>TPessoa<\/code>, reutilizando os m\u00e9todos comuns e adicionando a propriedade <code>Credito<\/code>. Isso facilita a cria\u00e7\u00e3o de classes mais complexas sem duplicar c\u00f3digo. No pr\u00f3ximo post, vamos explorar a heran\u00e7a em detalhes, com exemplos pr\u00e1ticos para diferentes cen\u00e1rios.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Polimorfismo: Flexibilidade no Uso de Objetos<\/h3>\n\n\n\n<p>O polimorfismo \u00e9 o recurso que permite que objetos de diferentes classes sejam tratados de forma semelhante, mesmo que se comportem de maneiras diferentes. No desenvolvimento de software, isso garante flexibilidade e escalabilidade. Em um sistema de <strong>Cadastro de Produtos<\/strong>, por exemplo, podemos ter diferentes tipos de produtos \u2013 f\u00edsicos e digitais \u2013 que compartilham um comportamento comum, mas t\u00eam caracter\u00edsticas \u00fanicas.<\/p>\n\n\n\n<p>No Delphi, o polimorfismo \u00e9 implementado principalmente por meio de m\u00e9todos virtuais e sobrescritos. Aqui est\u00e1 um exemplo:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">type\n  TProduto = class\n  public\n    procedure ExibirDetalhes; virtual;\n  end;\n\n  TProdutoFisico = class(TProduto)\n  public\n    procedure ExibirDetalhes; override;\n  end;\n\n  TProdutoDigital = class(TProduto)\n  public\n    procedure ExibirDetalhes; override;\n  end;\n\nprocedure TProduto.ExibirDetalhes;\nbegin\n  Writeln('Produto gen\u00e9rico.');\nend;\n\nprocedure TProdutoFisico.ExibirDetalhes;\nbegin\n  Writeln('Produto f\u00edsico, com envio.');\nend;\n\nprocedure TProdutoDigital.ExibirDetalhes;\nbegin\n  Writeln('Produto digital, com download.');\nend;\n<\/pre><\/div>\n\n\n\n<p>Aqui, <code>TProdutoFisico<\/code> e <code>TProdutoDigital<\/code> herdam de <code>TProduto<\/code>, mas cada um implementa o m\u00e9todo <code>ExibirDetalhes<\/code> de forma diferente. Com o polimorfismo, voc\u00ea pode chamar o mesmo m\u00e9todo em diferentes tipos de produtos e obter resultados espec\u00edficos para cada tipo.<\/p>\n\n\n\n<p>No pr\u00f3ximo post, vamos nos aprofundar no polimorfismo e como ele pode ser aplicado em sistemas reais.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Abstra\u00e7\u00e3o: Simplificando a Complexidade<\/h3>\n\n\n\n<p>Por fim, temos a abstra\u00e7\u00e3o, que ajuda a simplificar a complexidade de um sistema, expondo apenas o essencial para o uso de uma classe ou objeto. A abstra\u00e7\u00e3o se concentra em criar interfaces que ocultem os detalhes de implementa\u00e7\u00e3o. Isso \u00e9 muito \u00fatil quando estamos lidando com sistemas grandes, como um ERP, onde diferentes m\u00f3dulos podem interagir sem precisar conhecer detalhes internos.<\/p>\n\n\n\n<p>No Delphi, a abstra\u00e7\u00e3o pode ser implementada com classes abstratas e interfaces. Veja um exemplo de uma interface para processar diferentes formas de pagamento:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">type\n  IPagamento = interface\n    ['{A1B2C3D4-E5F6-7890-1234-56789ABCDEFF}']\n    procedure ProcessarPagamento(Valor: Currency);\n  end;\n\n  TPagamentoCartao = class(TInterfacedObject, IPagamento)\n  public\n    procedure ProcessarPagamento(Valor: Currency);\n  end;\n\nprocedure TPagamentoCartao.ProcessarPagamento(Valor: Currency);\nbegin\n  Writeln('Pagamento de R$ ' + CurrToStr(Valor) + ' processado via cart\u00e3o.');\nend;\n<\/pre><\/div>\n\n\n\n<p>Aqui, <code>IPagamento<\/code> define a interface para qualquer tipo de pagamento, e <code>TPagamentoCartao<\/code> implementa essa interface para processar pagamentos via cart\u00e3o de cr\u00e9dito. Dessa forma, podemos adicionar novos tipos de pagamento no futuro sem alterar o c\u00f3digo que usa a interface <code>IPagamento<\/code>.<\/p>\n\n\n\n<p>Nos pr\u00f3ximos posts, veremos mais sobre como a abstra\u00e7\u00e3o pode tornar seu c\u00f3digo mais flex\u00edvel e escal\u00e1vel.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Esses s\u00e3o os quatro pilares da POO que vamos detalhar nas pr\u00f3ximas semanas. Cada conceito desempenha um papel importante na cria\u00e7\u00e3o de software eficiente e escal\u00e1vel. Fique atento aos pr\u00f3ximos artigos, onde abordaremos cada um desses pilares de forma mais profunda e com mais exemplos pr\u00e1ticos em Delphi.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Comunidade no <a href=\"https:\/\/t.me\/AdrianoSantosCommunity\">Telegram<\/a><\/p>\n\n\n\n<p>\ud83d\ude80Comente no campo abaixo \ud83d\udc47\ud83d\udc47\ud83d\udc47 o que achou e qual sua d\u00favida.<\/p>\n\n\n\n<p>Te vejo na pr\u00f3xima<\/p>\n\n\n\n<p>Adriano Santos<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A Programa\u00e7\u00e3o Orientada a Objetos (POO) \u00e9 uma abordagem fundamental para o desenvolvimento de software, que facilita a cria\u00e7\u00e3o de sistemas mais estruturados, escal\u00e1veis e f\u00e1ceis de manter. Nela, os dados e as funcionalidades s\u00e3o organizados em &#8220;objetos&#8221;, baseados em &#8220;classes&#8221;. Cada objeto \u00e9 uma inst\u00e2ncia de uma classe e possui atributos (dados) e m\u00e9todos [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":846,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-844","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/844","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/comments?post=844"}],"version-history":[{"count":2,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/844\/revisions"}],"predecessor-version":[{"id":848,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/844\/revisions\/848"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media\/846"}],"wp:attachment":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media?parent=844"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/categories?post=844"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/tags?post=844"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}