{"id":9909,"date":"2023-11-29T14:49:36","date_gmt":"2023-11-29T17:49:36","guid":{"rendered":"https:\/\/elemarjr.com\/clube-de-estudos\/?post_type=artigos&#038;p=9909"},"modified":"2023-12-26T15:53:32","modified_gmt":"2023-12-26T18:53:32","slug":"qual-e-o-momento-certo-para-refatoracao","status":"publish","type":"artigos","link":"https:\/\/elemarjr.com\/clube-de-estudos\/artigos\/qual-e-o-momento-certo-para-refatoracao\/","title":{"rendered":"Qual \u00e9 o Momento Certo para Refatora\u00e7\u00e3o?"},"content":{"rendered":"\n<p>Refatorar c\u00f3digo \u00e9 uma necessidade comum no ciclo de vida do desenvolvimento de software. No entanto, voc\u00ea j\u00e1 se perguntou qual seria o momento mais apropriado para efetuar essa tarefa? Muitos desenvolvedores enfrentam essa d\u00favida e, \u00e0s vezes, podem adiar demais ou antecipar desnecessariamente a refatora\u00e7\u00e3o. Vamos explorar os momentos-chave, agregando exemplos espec\u00edficos e abordando ferramentas que podem auxiliar no processo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Identificando o Momento Ideal para Refatora\u00e7\u00e3o<\/h2>\n\n\n\n<p>Todo desenvolvedor sabe que a refatora\u00e7\u00e3o tem o intuito de melhorar a estrutura interna do c\u00f3digo, sem alterar seu comportamento externo. Essa atividade, embora crucial, muitas vezes n\u00e3o agrega valor imediato ao cliente. Ent\u00e3o, como justificar a necessidade de refatorar?<\/p>\n\n\n\n<p>O primeiro momento ideal \u00e9 quando voc\u00ea est\u00e1 implementando uma nova funcionalidade e percebe a dificuldade de entender o c\u00f3digo existente. Por exemplo, imagine um trecho de c\u00f3digo que deveria ser simples, mas est\u00e1 cheio de condicionais aninhadas. A aplica\u00e7\u00e3o do padr\u00e3o <em>Strategy<\/em> poderia ajudar a separar a l\u00f3gica de sele\u00e7\u00e3o de comportamentos em diferentes estrat\u00e9gias, tornando o c\u00f3digo mais limpo.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" style=\"font-size:.875rem;line-height:1.25rem\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"public interface ISortingStrategy\n{\n    void Sort(List<int&gt; dataset);\n}\n\npublic class QuickSortStrategy : ISortingStrategy\n{\n    public void Sort(List<int&gt; dataset)\n    {\n        \/\/ Implementa\u00e7\u00e3o do algoritmo QuickSort\n    }\n}\n\npublic class Sorter\n{\n    private readonly ISortingStrategy _strategy;\n\n    public Sorter(ISortingStrategy strategy)\n    {\n        _strategy = strategy;\n    }\n\n    public void Sort(List<int&gt; dataset)\n    {\n        _strategy.Sort(dataset);\n    }\n}\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\"><code><span class=\"line\"><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">interface<\/span><span style=\"color: #D8DEE9FF\"> ISortingStrategy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Sort<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">List<\/span><span style=\"color: #ECEFF4\">&lt;<\/span><span style=\"color: #81A1C1\">int<\/span><span style=\"color: #ECEFF4\">&gt;<\/span><span style=\"color: #D8DEE9FF\"> dataset<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">QuickSortStrategy<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> ISortingStrategy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Sort<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">List<\/span><span style=\"color: #ECEFF4\">&lt;<\/span><span style=\"color: #81A1C1\">int<\/span><span style=\"color: #ECEFF4\">&gt;<\/span><span style=\"color: #D8DEE9FF\"> dataset<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">        <\/span><span style=\"color: #616E88\">\/\/ Implementa\u00e7\u00e3o do algoritmo QuickSort<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Sorter<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">private<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">readonly<\/span><span style=\"color: #D8DEE9FF\"> ISortingStrategy _strategy<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Sorter<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">ISortingStrategy strategy<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">_strategy<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">strategy<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Sort<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">List<\/span><span style=\"color: #ECEFF4\">&lt;<\/span><span style=\"color: #81A1C1\">int<\/span><span style=\"color: #ECEFF4\">&gt;<\/span><span style=\"color: #D8DEE9FF\"> dataset<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">_strategy<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">Sort<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">dataset<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>O segundo momento apropriado surge ap\u00f3s a implementa\u00e7\u00e3o de uma funcionalidade. \u00c0s vezes, ap\u00f3s implementar e ver a funcionalidade em a\u00e7\u00e3o \u00e9 que reconhecemos as imperfei\u00e7\u00f5es no design. Refatorar neste ponto permite consolidar o aprendizado e melhorar a base de c\u00f3digo.<\/p>\n\n\n\n<p>Finalmente, encontramos o terceiro momento certo durante a resolu\u00e7\u00e3o de bugs. Se o c\u00f3digo est\u00e1 confuso e dificulta a corre\u00e7\u00e3o de erros, \u00e9 uma oportunidade de refatorar. Melhorar a clareza e a manutenibilidade do c\u00f3digo pode ser justificado como uma necessidade em longo prazo para estabilidade do software.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Evitando Trampas na Refatora\u00e7\u00e3o<\/h2>\n\n\n\n<p>Refatorar n\u00e3o deve ser uma tarefa agendada por si s\u00f3, deve ocorrer de forma natural e integrada ao processo de desenvolvimento. Devemos evitar a mentalidade de grandes refatora\u00e7\u00f5es isoladas que desviam o foco da entrega cont\u00ednua de valor.<\/p>\n\n\n\n<p>Al\u00e9m disso, corremos o risco de otimizar algo que n\u00e3o afeta o desempenho percebido pelo usu\u00e1rio. Ferramentas de an\u00e1lise de c\u00f3digo, como SonarQube, podem ajudar a identificar quest\u00f5es cr\u00edticas que requerem refatora\u00e7\u00e3o, sem gastar esfor\u00e7os em melhorias de baixo impacto.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ajuste Fino no Desenvolvimento de Software<\/h2>\n\n\n\n<p>A refatora\u00e7\u00e3o permite aplicar padr\u00f5es de projeto e manter a arquitetura de software alinhada com bons princ\u00edpios de design. Ao tratar a refatora\u00e7\u00e3o como uma melhoria cont\u00ednua, integramos este processo de forma mais eficaz no nosso fluxo de trabalho.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>A refatora\u00e7\u00e3o \u00e9 uma pr\u00e1tica que, inserida nos momentos corretos, eleva a qualidade do software. Identificar esses momentos e usar ferramentas para guiar o processo \u00e9 crucial para um desenvolvimento eficiente. Devemos manter o foco na entrega de valor ao cliente, equilibrando a busca pela qualidade com a necessidade de progresso cont\u00ednuo.<\/p>\n\n\n\n<p>Discutimos essas estrat\u00e9gias e ferramentas em detalhes nos meus grupos de estudos e mentorias, sempre buscando alinhar teoria e pr\u00e1tica para fortalecer a manutenibilidade e expansibilidade dos sistemas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TL;DR<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Refatora\u00e7\u00e3o deve ser aplicada quando dificuldade de compreens\u00e3o do c\u00f3digo afeta implementa\u00e7\u00e3o de funcionalidades ou corre\u00e7\u00e3o de bugs.<\/li>\n\n\n\n<li>Refatora\u00e7\u00e3o deve ser parte natural do desenvolvimento; grandes tarefas isoladas de refatora\u00e7\u00e3o devem ser evitadas.<\/li>\n\n\n\n<li>\u00c9 importante usar ferramentas de an\u00e1lise de c\u00f3digo para guiar refatora\u00e7\u00f5es, mantendo o foco em melhorias que trazem valor real ao usu\u00e1rio.<\/li>\n<\/ol>\n","protected":false},"featured_media":9907,"parent":0,"template":"","cursos":[7],"class_list":["post-9909","artigos","type-artigos","status-publish","has-post-thumbnail","hentry","cursos-gof"],"acf":[],"_links":{"self":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos\/9909","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos"}],"about":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/types\/artigos"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media\/9907"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media?parent=9909"}],"wp:term":[{"taxonomy":"cursos","embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/cursos?post=9909"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}