{"id":849,"date":"2024-09-17T09:57:52","date_gmt":"2024-09-17T12:57:52","guid":{"rendered":"https:\/\/adrianosantostreina.com.br\/blog\/?p=849"},"modified":"2024-09-23T10:24:38","modified_gmt":"2024-09-23T13:24:38","slug":"poo-1o-pilar-encapsulamento","status":"publish","type":"post","link":"https:\/\/adrianosantostreina.com.br\/blog\/poo-1o-pilar-encapsulamento\/","title":{"rendered":"POO 1o. Pilar &#8211; Encapsulamento"},"content":{"rendered":"\n<p>Encapsulamento \u00e9 um dos conceitos centrais da Programa\u00e7\u00e3o Orientada a Objetos (POO). Ele se baseia na ideia de que os dados de um objeto devem ser protegidos contra acesso direto e modifica\u00e7\u00f5es indevidas. Em sistemas complexos, como ERPs ou aplicativos de gest\u00e3o de pedidos, a falta de encapsulamento pode levar a inconsist\u00eancias e comportamentos inesperados. Ao encapsular dados, controlamos exatamente como esses dados s\u00e3o manipulados, garantindo que as regras de neg\u00f3cio sejam seguidas e que o sistema se mantenha robusto e seguro.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Quando utilizamos encapsulamento, estamos escondendo os detalhes internos de uma classe e expondo apenas o necess\u00e1rio por meio de m\u00e9todos p\u00fablicos. Dessa forma, outras partes do sistema interagem com os objetos de maneira controlada, respeitando a l\u00f3gica definida na classe. Por exemplo, em um sistema de vendas, um pedido pode ter v\u00e1rias regras relacionadas a descontos. Ao encapsular os atributos de um pedido, asseguramos que qualquer aplica\u00e7\u00e3o de desconto siga as regras previamente estabelecidas.<\/p>\n\n\n\n<p>Esse pilar da POO n\u00e3o s\u00f3 refor\u00e7a a seguran\u00e7a do sistema, mas tamb\u00e9m melhora a manuten\u00e7\u00e3o do c\u00f3digo. Com uma estrutura bem definida, futuras altera\u00e7\u00f5es na l\u00f3gica interna da classe podem ser feitas sem impactar outras partes do sistema que dependem dela.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Por que o Encapsulamento \u00e9 Importante?<\/h3>\n\n\n\n<p>O encapsulamento \u00e9 crucial porque ele estabelece barreiras claras entre diferentes partes do sistema, protegendo os dados de altera\u00e7\u00f5es indevidas e acessos diretos. Em projetos de software, especialmente os mais complexos, como ERPs ou sistemas de gerenciamento de pedidos, \u00e9 essencial garantir que os dados s\u00f3 sejam manipulados de forma controlada. Isso evita erros como atribuir valores inv\u00e1lidos a um objeto ou violar regras de neg\u00f3cio.<\/p>\n\n\n\n<p>Imagine um sistema de vendas em que o desconto em um pedido pode ser aplicado livremente. Sem encapsulamento, qualquer parte do c\u00f3digo poderia alterar o valor do desconto, ignorando regras importantes, como limites de desconto m\u00e1ximo. Isso pode levar a inconsist\u00eancias e bugs dif\u00edceis de rastrear.<\/p>\n\n\n\n<p>Com o encapsulamento, voc\u00ea pode controlar como os atributos de uma classe s\u00e3o modificados, permitindo que a l\u00f3gica de valida\u00e7\u00e3o e verifica\u00e7\u00e3o seja aplicada em um \u00fanico lugar. Assim, se a regra de neg\u00f3cio para aplicar descontos mudar, voc\u00ea s\u00f3 precisa atualizar a l\u00f3gica dentro da classe, sem se preocupar com o impacto em outras partes do sistema. Isso n\u00e3o s\u00f3 aumenta a seguran\u00e7a do seu software, mas tamb\u00e9m torna a manuten\u00e7\u00e3o mais f\u00e1cil e menos propensa a erros.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exemplo Pr\u00e1tico: Pedido de Venda com encapsulamento<\/h3>\n\n\n\n<p>Para ilustrar a import\u00e2ncia do encapsulamento na pr\u00e1tica, vamos criar uma classe <code>TPedido<\/code> que representa um pedido de venda em um sistema de gest\u00e3o. Este exemplo abrange situa\u00e7\u00f5es comuns em um sistema de pedidos, como adicionar itens, aplicar descontos e gerenciar o status do pedido.<\/p>\n\n\n\n<p>Vamos encapsular atributos essenciais, como valor total, desconto e status, fornecendo m\u00e9todos p\u00fablicos para interagir com esses dados. Isso garante que as regras de neg\u00f3cio sejam seguidas e os dados sejam manipulados de forma controlada e segura.<\/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    FNumero: Integer;\n    FCliente: string;\n    FValorTotal: Currency;\n    FDesconto: Currency;\n    FItens: TStringList;\n    FStatus: string;\n  public\n    constructor Create;\n    destructor Destroy; override;\n    procedure AdicionarItem(Item: string; Valor: Currency);\n    procedure RemoverItem(Item: string);\n    procedure AplicarDesconto(ADesconto: Currency);\n    procedure AtualizarStatus(NovoStatus: string);\n    function ObterValorFinal: Currency;\n  end;\n\nconstructor TPedido.Create;\nbegin\n  FItens := TStringList.Create;\n  FStatus := 'Aberto';\nend;\n\ndestructor TPedido.Destroy;\nbegin\n  FItens.Free;\n  inherited;\nend;\n\nprocedure TPedido.AdicionarItem(Item: string; Valor: Currency);\nbegin\n  FItens.Add(Item);\n  FValorTotal := FValorTotal + Valor;\nend;\n\nprocedure TPedido.RemoverItem(Item: string);\nvar\n  Index: Integer;\nbegin\n  Index := FItens.IndexOf(Item);\n  if Index &lt;&gt; -1 then\n  begin\n    \/\/ Supomos que cada item adiciona um valor fixo de exemplo\n    FValorTotal := FValorTotal - 10; \/\/ Para simplifica\u00e7\u00e3o, removendo um valor fixo\n    FItens.Delete(Index);\n  end;\nend;\n\nprocedure TPedido.AplicarDesconto(ADesconto: Currency);\nbegin\n  if (ADesconto &gt;= 0) and (ADesconto &lt;= FValorTotal) then\n    FDesconto := ADesconto;\nend;\n\nprocedure TPedido.AtualizarStatus(NovoStatus: string);\nbegin\n  if (NovoStatus = 'Aberto') or (NovoStatus = 'Fechado') or (NovoStatus = 'Cancelado') then\n    FStatus := NovoStatus;\nend;\n\nfunction TPedido.ObterValorFinal: Currency;\nbegin\n  Result := FValorTotal - FDesconto;\nend;\n<\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Explica\u00e7\u00e3o Detalhada da Classe <code>TPedido<\/code><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Atributos Privados:<\/strong>\n<ul class=\"wp-block-list\">\n<li><code>FNumero<\/code>: N\u00famero do pedido, identificador \u00fanico.<\/li>\n\n\n\n<li><code>FCliente<\/code>: Nome do cliente associado ao pedido.<\/li>\n\n\n\n<li><code>FValorTotal<\/code>: Valor total dos itens adicionados ao pedido.<\/li>\n\n\n\n<li><code>FDesconto<\/code>: Valor do desconto aplicado ao pedido.<\/li>\n\n\n\n<li><code>FItens<\/code>: Lista de itens no pedido.<\/li>\n\n\n\n<li><code>FStatus<\/code>: Estado atual do pedido (Aberto, Fechado, Cancelado).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>M\u00e9todos P\u00fablicos:<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Construtor e Destrutor:<\/strong> Iniciam e liberam os recursos da classe, como a lista de itens.<\/li>\n\n\n\n<li><strong>AdicionarItem:<\/strong> Adiciona um item ao pedido e atualiza o valor total. Os itens s\u00e3o armazenados em uma lista.<\/li>\n\n\n\n<li><strong>RemoverItem:<\/strong> Remove um item espec\u00edfico do pedido e ajusta o valor total. Neste exemplo, cada item remove um valor fixo como simplifica\u00e7\u00e3o.<\/li>\n\n\n\n<li><strong>AplicarDesconto:<\/strong> Aplica um desconto ao pedido, garantindo que o desconto n\u00e3o exceda o valor total.<\/li>\n\n\n\n<li><strong>AtualizarStatus:<\/strong> Permite alterar o status do pedido, restringindo os valores poss\u00edveis (Aberto, Fechado, Cancelado).<\/li>\n\n\n\n<li><strong>ObterValorFinal:<\/strong> Calcula o valor final do pedido, subtraindo o desconto.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Como o Encapsulamento Ajuda?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Integridade dos Dados:<\/strong> Os atributos privados (<code>FNumero<\/code>, <code>FValorTotal<\/code>, etc.) n\u00e3o podem ser alterados diretamente de fora da classe. Por exemplo, o valor total s\u00f3 pode ser modificado atrav\u00e9s dos m\u00e9todos <code>AdicionarItem<\/code> e <code>RemoverItem<\/code>, garantindo que a l\u00f3gica de c\u00e1lculo seja sempre respeitada.<\/li>\n\n\n\n<li><strong>Regras de Neg\u00f3cio Centralizadas:<\/strong> A l\u00f3gica para aplicar descontos e atualizar o status do pedido est\u00e1 encapsulada nos m\u00e9todos <code>AplicarDesconto<\/code> e <code>AtualizarStatus<\/code>. Isso garante que, mesmo que a regra de neg\u00f3cio mude, ela ser\u00e1 atualizada em um \u00fanico lugar.<\/li>\n\n\n\n<li><strong>Manuten\u00e7\u00e3o Facilitada:<\/strong> Se precisar mudar como os itens s\u00e3o gerenciados ou calcular o valor total, a altera\u00e7\u00e3o \u00e9 feita apenas dentro da classe, sem impactar outras partes do sistema.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Uso Pr\u00e1tico<\/h3>\n\n\n\n<p>A classe <code>TPedido<\/code> simula um cen\u00e1rio real em que um pedido pode conter v\u00e1rios itens, descontos e diferentes estados. Ao encapsular essas funcionalidades, garantimos que o pedido seja manipulado de forma segura, seguindo as regras definidas. Essa abordagem evita erros comuns, como aplicar um desconto inv\u00e1lido ou tentar acessar um item que n\u00e3o existe.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exemplo de Uso da Classe <code>TPedido<\/code><\/h3>\n\n\n\n<p>Vamos simular um cen\u00e1rio onde criamos um pedido, adicionamos itens, aplicamos um desconto, e atualizamos o status do pedido em um sistema de vendas:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">var\n  Pedido: TPedido;\nbegin\n  \/\/ Criando um novo pedido\n  Pedido := TPedido.Create;\n  try\n    \/\/ Adicionando itens ao pedido\n    Pedido.AdicionarItem('Produto 1', 100.0);\n    Pedido.AdicionarItem('Produto 2', 50.0);\n    \n    \/\/ Aplicando um desconto\n    Pedido.AplicarDesconto(20.0);\n\n    \/\/ Atualizando o status do pedido\n    Pedido.AtualizarStatus('Fechado');\n\n    \/\/ Exibindo o valor final\n    Writeln('Valor final do pedido: R$ ', FormatFloat('0.00', Pedido.ObterValorFinal));\n    Writeln('Status do pedido: ', Pedido.FStatus);\n\n    \/\/ Removendo um item do pedido\n    Pedido.RemoverItem('Produto 1');\n    Writeln('Valor final ap\u00f3s remo\u00e7\u00e3o: R$ ', FormatFloat('0.00', Pedido.ObterValorFinal));\n  finally\n    Pedido.Free;\n  end;\nend;\n<\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Explica\u00e7\u00e3o do Exemplo<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Criando e Inicializando:<\/strong> Criamos uma inst\u00e2ncia de <code>TPedido<\/code> e inicializamos seus atributos.<\/li>\n\n\n\n<li><strong>Adicionando Itens:<\/strong> Adicionamos dois itens ao pedido com os valores de <code>100.0<\/code> e <code>50.0<\/code>, totalizando <code>150.0<\/code>.<\/li>\n\n\n\n<li><strong>Aplicando Desconto:<\/strong> Aplicamos um desconto de <code>20.0<\/code>. O m\u00e9todo <code>AplicarDesconto<\/code> garante que o desconto n\u00e3o seja superior ao valor total.<\/li>\n\n\n\n<li><strong>Atualizando o Status:<\/strong> Atualizamos o status do pedido para &#8220;Fechado&#8221;, garantindo que s\u00f3 aceitamos valores v\u00e1lidos para o status.<\/li>\n\n\n\n<li><strong>Exibindo o Valor Final:<\/strong> Chamamos <code>ObterValorFinal<\/code> para exibir o valor final do pedido, j\u00e1 com o desconto aplicado.<\/li>\n\n\n\n<li><strong>Removendo um Item:<\/strong> Removemos um item do pedido e atualizamos o valor total.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Benef\u00edcios Demonstrados<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Seguran\u00e7a:<\/strong> Somente m\u00e9todos p\u00fablicos podem alterar os dados sens\u00edveis.<\/li>\n\n\n\n<li><strong>Organiza\u00e7\u00e3o:<\/strong> Regras de neg\u00f3cio centralizadas garantem consist\u00eancia em toda a aplica\u00e7\u00e3o.<\/li>\n\n\n\n<li><strong>Manuten\u00e7\u00e3o Simplificada:<\/strong> Altera\u00e7\u00f5es futuras s\u00e3o feitas na classe <code>TPedido<\/code>, sem necessidade de modificar outras partes do c\u00f3digo.<\/li>\n<\/ul>\n\n\n\n<p>No pr\u00f3ximo artigo, vamos explorar o segundo pilar da POO: <strong>Heran\u00e7a<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Resumo<\/h3>\n\n\n\n<p>Neste artigo, exploramos o primeiro pilar da Programa\u00e7\u00e3o Orientada a Objetos (POO): o Encapsulamento. Vimos como ele protege e organiza o c\u00f3digo, controlando o acesso e a modifica\u00e7\u00e3o de dados sens\u00edveis em um sistema. Usamos um exemplo pr\u00e1tico com a classe <code>TPedido<\/code> para mostrar como encapsular atributos como valor total, desconto e status, garantindo que as regras de neg\u00f3cio sejam respeitadas. Atrav\u00e9s de m\u00e9todos p\u00fablicos, como <code>AdicionarItem<\/code> e <code>AplicarDesconto<\/code>, conseguimos manipular um pedido de forma segura e eficiente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">O que veremos a seguir?<\/h3>\n\n\n\n<p>No pr\u00f3ximo artigo, exploraremos <strong>Heran\u00e7a<\/strong>, o segundo pilar da POO. Veremos como criar classes especializadas a partir de classes gen\u00e9ricas, promovendo a reutiliza\u00e7\u00e3o de c\u00f3digo e facilitando a extens\u00e3o das funcionalidades em sistemas complexos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Participe da Comunidade no Telegram<\/h3>\n\n\n\n<p>\ud83d\ude80 Quer continuar essa discuss\u00e3o e trocar ideias com outros desenvolvedores? Junte-se \u00e0 nossa comunidade no Telegram! L\u00e1, voc\u00ea pode comentar sobre o que achou deste artigo, tirar suas d\u00favidas e compartilhar suas experi\u00eancias com POO e Delphi, e ainda discutir ou tirar suas d\u00favidas sobre os mais variados temas em uma comunidade com mais de 1.000 desenvolvedores.<\/p>\n\n\n\n<p>\ud83d\udd17 <a href=\"https:\/\/t.me\/AdrianoSantosCommunity\" target=\"_blank\" rel=\"noreferrer noopener\">Clique aqui para entrar na comunidade<\/a><\/p>\n\n\n\n<p>Te vejo l\u00e1!<\/p>\n\n\n\n<p>Adriano Santos<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Encapsulamento \u00e9 um dos conceitos centrais da Programa\u00e7\u00e3o Orientada a Objetos (POO). Ele se baseia na ideia de que os dados de um objeto devem ser protegidos contra acesso direto e modifica\u00e7\u00f5es indevidas. Em sistemas complexos, como ERPs ou aplicativos de gest\u00e3o de pedidos, a falta de encapsulamento pode levar a inconsist\u00eancias e comportamentos inesperados. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":852,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-849","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\/849","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=849"}],"version-history":[{"count":2,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/849\/revisions"}],"predecessor-version":[{"id":853,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/849\/revisions\/853"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media\/852"}],"wp:attachment":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media?parent=849"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/categories?post=849"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/tags?post=849"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}