{"id":1607,"date":"2022-07-11T19:10:44","date_gmt":"2022-07-11T22:10:44","guid":{"rendered":"https:\/\/gladiston.net.br\/?page_id=1607"},"modified":"2022-07-13T16:05:35","modified_gmt":"2022-07-13T19:05:35","slug":"refatoracao-de-codigo","status":"publish","type":"page","link":"https:\/\/gladiston.net.br\/en\/programacao\/lazarus-ide\/refatoracao-de-codigo\/","title":{"rendered":"Refatora\u00e7\u00e3o de c\u00f3digo usando a IDE"},"content":{"rendered":"<p>Um dos aspectos mais valorizados num c\u00f3digo \u00e9 ele n\u00e3o ter trechos repetidos sem necessidade, se h\u00e1 c\u00f3digo repetido, provavelmente pode ser refatorado. Refatorar significa manter a funcionalidade quebrando um trecho grande de c\u00f3digo em peda\u00e7os menores, onde os peda\u00e7os menores poder\u00e3o ser reutilizados por serem transformados em procedimentos ou fun\u00e7\u00f5es e no caso do pascal, um subprocedimento.<\/p>\n\n\n\n<p>Imagine um bot\u00e3o cujo c\u00f3digo seja:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var\n  ACaption:String;\n  ATitle:String;\n  AText:String;\n  AButtonText1:String;\n  AButtonText2:String;\n  AResult:TModalResult;\nbegin\n  AResult:=mrNone;\n  ACaption:='Ser ou n\u00e3o ser';\n  ATitle:='Eis a quest\u00e3o:';\n  AButtonText1:='Sim';\n  AButtonText2:='N\u00e3o';\n  AText:='Escolha sim ou n\u00e3o';\n  with TTaskDialog.Create(self) do\n  try\n    Caption := ACaption;\n    Title := ATitle;\n    Text := AText;\n    CommonButtons := &#91;];\n    with TTaskDialogButtonItem(Buttons.Add) do\n    begin\n      Caption := AButtonText1;\n      ModalResult := mrYes;\n    end;\n    with TTaskDialogButtonItem(Buttons.Add) do\n    begin\n      Caption := AButtonText2;\n      ModalResult := mrNo;\n    end;\n    MainIcon := tdiQuestion;\n    if Execute then\n    begin\n      AResult:=ModalResult;\n    end;\n  finally\n    Free;\n  end; <\/code><\/pre>\n\n\n\n<p>O Objetivo do c\u00f3digo \u00e9 simplesmente mostrar uma mensagem ao usu\u00e1rio:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"751\" height=\"255\" src=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar1.png\" alt=\"\" class=\"wp-image-1608\" srcset=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar1.png 751w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar1-300x102.png 300w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar1-18x6.png 18w\" sizes=\"auto, (max-width: 751px) 100vw, 751px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Refatorando para um m\u00e9todo ou fun\u00e7\u00e3o<\/h2>\n\n\n\n<p>Da\u00ed voc\u00ea decide criar um segundo bot\u00e3o com uma funcionalidade diferente, por\u00e9m reutilizar\u00e1 uma mensagem de confirma\u00e7\u00e3o similar ao utilizado no primeiro bot\u00e3o, e decide dar um Ctrl+C\/Ctrl+V e apenas modifica as vari\u00e1veis que representam o texto a ser exibido:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var\n  ACaption:String;\n  ATitle:String;\n  AText:String;\n  AButtonText1:String;\n  AButtonText2:String;\n  AResult:TModalResult;\nbegin\n  AResult:=mrNone;\n  ACaption:='Tem certeza?';\n  ATitle:='Vai apagar tudo?';\n  AButtonText1:='Sim';\n  AButtonText2:='N\u00e3o';\n  AText:='Isso eliminar\u00e1 todos os dados!';  \n  with TTaskDialog.Create(self) do\n  try\n    Caption := ACaption;\n    Title := ATitle;\n    Text := AText;\n    CommonButtons := &#91;];\n    with TTaskDialogButtonItem(Buttons.Add) do\n    begin\n      Caption := AButtonText1;\n      ModalResult := mrYes;\n    end;\n    with TTaskDialogButtonItem(Buttons.Add) do\n    begin\n      Caption := AButtonText2;\n      ModalResult := mrNo;\n    end;\n    MainIcon := tdiQuestion;\n    if Execute then\n    begin\n      AResult:=ModalResult;\n    end;\n  finally\n    Free;\n  end;\n(...) <\/code><\/pre>\n\n\n\n<p>Provavelmente voc\u1ebd fez isso porque est\u00e1 com pressa, e verdadeiramente \u00e9 isso que acontece com prazos apertados. Mas depois de um exaustivo trabalho, voc\u00ea concluiu as funcionalidades do programa e agora vem a parte chamada de &#8220;melhorias&#8221;, onde removeremos coment\u00e1rios desnecess\u00e1rios e &#8230;. refatora\u00e7\u00e3o. Para refatorar observamos em nosso c\u00f3digo, as repeti\u00e7\u00f5es e da\u00ed percebemos que isso aqui:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  with TTaskDialog.Create(self) do\n  try\n    Caption := ACaption;\n    Title := ATitle;\n    Text := AText;\n    CommonButtons := &#91;];\n    with TTaskDialogButtonItem(Buttons.Add) do\n    begin\n      Caption := AButtonText1;\n      ModalResult := mrYes;\n    end;\n    with TTaskDialogButtonItem(Buttons.Add) do\n    begin\n      Caption := AButtonText2;\n      ModalResult := mrNo;\n    end;\n    MainIcon := tdiQuestion;\n    if Execute then\n    begin\n      AResult:=ModalResult;\n    end;\n  finally\n    Free;\n  end;<\/code><\/pre>\n\n\n\n<p>Esta sendo repetido nos dois bot\u00f5es. Da\u00ed voc\u00ea sabe e tem no\u00e7\u00e3o que \u00e9 possivel criar uma fun\u00e7\u00e3o com ela e trocar o trecho acima por uma fun\u00e7\u00e3o. Claro que dependendo de sua experi\u00eancia isso ser\u00e1 f\u00e1cil fazer, mas porque n\u00e3o usar a IDE do Lazarus para isso. Fa\u00e7a assim:<\/p>\n\n\n\n<p>1. Marque o trecho repetido:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"721\" height=\"723\" src=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar2.png\" alt=\"\" class=\"wp-image-1609\" srcset=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar2.png 721w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar2-300x300.png 300w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar2-150x150.png 150w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar2-12x12.png 12w\" sizes=\"auto, (max-width: 721px) 100vw, 721px\" \/><figcaption>Marcando o trecho que se repete em v\u00e1rias partes de nosso c\u00f3digo<\/figcaption><\/figure>\n\n\n\n<p>2. V\u00e1 em Source|Refactoring|Extract Procedure&#8230;<\/p>\n\n\n\n<p>3. Selecione o que a extra\u00e7\u00e3o dever\u00e1 fazer, geralmente transformando-a m\u00e9todo privado quando o trecho ser\u00e1 reutilizado no pr\u00f3prio form ou publico quando o mesmo ser\u00e1 reutilizado em unidades\/formul\u00e1rios diferentes. H\u00e1 um checkbox quando a IDE detecta que pode ser transformando em uma fun\u00e7\u00e3o, neste caso voc\u00ea pode determinar o tipo de retorno e o nome do m\u00e9todo(name of new procedure):<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"430\" height=\"382\" src=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar3b.png\" alt=\"\" class=\"wp-image-1612\" srcset=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar3b.png 430w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar3b-300x267.png 300w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar3b-14x12.png 14w\" sizes=\"auto, (max-width: 430px) 100vw, 430px\" \/><\/figure>\n\n\n\n<p>E ao clicar extract&#8230;.O sistema ent\u00e3o criar\u00e1 um c\u00f3digo:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"870\" height=\"440\" src=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar4b.png\" alt=\"\" class=\"wp-image-1613\" srcset=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar4b.png 870w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar4b-300x152.png 300w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar4b-768x388.png 768w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar4b-18x9.png 18w\" sizes=\"auto, (max-width: 870px) 100vw, 870px\" \/><figcaption>O trecho selecionado tornar-se-\u00e1 um m\u00e9todo.<\/figcaption><\/figure>\n\n\n\n<p>4. A ordem importa?<\/p>\n\n\n\n<p>Em nosso exemplo foi criado o m\u00e9todo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PerguntarDlg( AButtonText2, AButtonText1, AText, ATitle, ACaption);<\/code><\/pre>\n\n\n\n<p>Mas note que a ordem dos par\u00e2metros n\u00e3o foi decidida por mim, assim, caso n\u00e3o goste v\u00e1 at\u00e9 o m\u00e9todo gerado e acerte a ordem do jeito que planeja us\u00e1-los, eu inclusive coloco minhas personaliza\u00e7\u00f5es:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"687\" height=\"833\" src=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar5.png\" alt=\"\" class=\"wp-image-1614\" srcset=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar5.png 687w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar5-247x300.png 247w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar5-10x12.png 10w\" sizes=\"auto, (max-width: 687px) 100vw, 687px\" \/><figcaption>Personalizando o refactoring autom\u00e1tico<\/figcaption><\/figure>\n\n\n\n<p>Quando voc\u00ea modifica a assinatura do m\u00e9todo, use Ctrl+Shift+C para que a IDE fa\u00e7a o ajuste tamb\u00e9m na declara\u00e7\u00e3o.<\/p>\n\n\n\n<p>Agora voc\u00ea tem um m\u00e9todo que pode ser usado em dois OnClicks de bot\u00f5es sem duplica\u00e7\u00f5es de linhas, apenas modificando os par\u00e2metros usado no m\u00e9todo PerguntarDlg.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Refatorar para subprocedimento(sub procedure)<\/h2>\n\n\n\n<p>Veja o que h\u00e1 de errado neste c\u00f3digo:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"919\" height=\"828\" src=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar6.png\" alt=\"\" class=\"wp-image-1615\" srcset=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar6.png 919w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar6-300x270.png 300w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar6-768x692.png 768w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar6-13x12.png 13w\" sizes=\"auto, (max-width: 919px) 100vw, 919px\" \/><figcaption>Trechos repetidos no mesmo trecho de c\u00f3digo<\/figcaption><\/figure>\n\n\n\n<p>H\u00e1 trecho de c\u00f3digo repetido, nele o programador se preocupou em destruir um objeto chamado &#8220;q1&#8221; quando o usu\u00e1rio desistisse de executar uma query, mas a\u00ed houve repeti\u00e7\u00e3o do mesmo c\u00f3digo, ser\u00e1 que h\u00e1 como refatorar j\u00e1 que se trata de objetos locais? <\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Sim, novamente vamos marcar apenas as linhas repetidas:<\/li><\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"857\" height=\"655\" src=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar7.png\" alt=\"\" class=\"wp-image-1616\" srcset=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar7.png 857w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar7-300x229.png 300w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar7-768x587.png 768w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar7-16x12.png 16w\" sizes=\"auto, (max-width: 857px) 100vw, 857px\" \/><figcaption>Marcamos as linhas a serem refatoradas<\/figcaption><\/figure>\n\n\n\n<p>2. Selecionamos Source|Refactoring|Extract Procedure&#8230;<\/p>\n\n\n\n<p>3. Selecione o que a extra\u00e7\u00e3o dever\u00e1 fazer, mas dessa vez marcaremos a op\u00e7\u00e3o Sub Procedure e daremos um nome adequado de LiberarMemoria j\u00e1 que o objetivo do trecho de c\u00f3digo \u00e9 destruir objetos:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"419\" height=\"383\" src=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar8.png\" alt=\"\" class=\"wp-image-1617\" srcset=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar8.png 419w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar8-300x274.png 300w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar8-13x12.png 13w\" sizes=\"auto, (max-width: 419px) 100vw, 419px\" \/><figcaption>Usamos sub Procedure quando desejamos refatorar um trecho de um c\u00f3digo local<\/figcaption><\/figure>\n\n\n\n<p>4. Note agora como ficou o c\u00f3digo:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"889\" height=\"679\" src=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar9.png\" alt=\"\" class=\"wp-image-1618\" srcset=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar9.png 889w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar9-300x229.png 300w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar9-768x587.png 768w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/07\/refatorar9-16x12.png 16w\" sizes=\"auto, (max-width: 889px) 100vw, 889px\" \/><figcaption>A fun\u00e7\u00e3o LiberarMemoria \u00e9 um subprocedimento para nosso usufruto<\/figcaption><\/figure>\n\n\n\n<p>Um procedimento LiberarMemoria tornou-se um subprocedimento para que possamos reutiliz\u00e1-lo em todos os trechos que antes tinham:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>q1.close;\nq1.free;<\/code><\/pre>\n\n\n\n<p>Assim nosso c\u00f3digo tornou-se menor, mais eficiente e muito melhor de entender.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>\u00c9 sempre prefer\u00edvel come\u00e7ar um projeto tomando a iniciativa em refator\u00e1-lo desde o inicio, mas sabemos como \u00e0s vezes \u00e9 necess\u00e1rio correr contra o tempo para entregar as coisas dentro do prazo e deixamos de tomar essa iniciativa desde o principio. No final do projeto \u00e9 bom saber que podemos usar a IDE do Lazarus para nos ajudar a refatorar nossas repeti\u00e7\u00f5es de c\u00f3digo.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Um dos aspectos mais valorizados num c\u00f3digo \u00e9 ele n\u00e3o ter trechos repetidos sem necessidade, se h\u00e1 c\u00f3digo repetido, provavelmente pode ser refatorado. Refatorar significa manter a funcionalidade quebrando um trecho grande de c\u00f3digo em peda\u00e7os menores, onde os peda\u00e7os menores poder\u00e3o ser reutilizados por serem transformados em procedimentos ou fun\u00e7\u00f5es e no caso do [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"parent":159,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"templates\/template-full-width.php","meta":{"footnotes":""},"class_list":["post-1607","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/1607","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/comments?post=1607"}],"version-history":[{"count":6,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/1607\/revisions"}],"predecessor-version":[{"id":1626,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/1607\/revisions\/1626"}],"up":[{"embeddable":true,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/159"}],"wp:attachment":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/media?parent=1607"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}