{"meta":{"title":"Aprimorando a legibilidade e a capacidade de manutenção do código","intro":"Copilot Chat pode sugerir maneiras de tornar seu código mais fácil de entender e manter.","product":"GitHub Copilot","breadcrumbs":[{"href":"/pt/copilot","title":"GitHub Copilot"},{"href":"/pt/copilot/tutorials","title":"Tutoriais"},{"href":"/pt/copilot/tutorials/copilot-cookbook","title":"Livro de receitas do GitHub Copilot"},{"href":"/pt/copilot/tutorials/copilot-cookbook/refactor-code","title":"Refatorar o código"},{"href":"/pt/copilot/tutorials/copilot-cookbook/refactor-code/improve-code-readability","title":"Aprimorar a legibilidade do código"}],"documentType":"article"},"body":"# Aprimorando a legibilidade e a capacidade de manutenção do código\n\nCopilot Chat pode sugerir maneiras de tornar seu código mais fácil de entender e manter.\n\nÉ difícil para outros desenvolvedores manterem e estenderem código com legibilidade ruim.\nCopilot Chat pode ajudar de várias maneiras. Por exemplo, por:\n\n* [Sugerindo melhorias em nomes de variáveis](#improving-variable-names)\n* [Evitando verificações condicionais sequenciais](#avoiding-sequential-conditional-checks)\n* [Reduzindo a lógica aninhada](#reducing-nested-logic)\n* [Dividindo métodos grandes em métodos menores e mais legíveis](#splitting-up-large-methods)\n\nDocumentar o código é outra maneira de melhorar a capacidade de manutenção dele. Para obter informações sobre como usar Copilot Chat para ajudá-lo a adicionar comentários úteis ao seu código, consulte os prompts de exemplo no [código de documentação](/pt/copilot/tutorials/copilot-cookbook/document-code).\n\n> \\[!NOTE] As respostas mostradas neste artigo são exemplos.\n> Copilot Chat as respostas são não determinísticas, portanto, você pode obter respostas diferentes das mostradas aqui.\n\n## Aprimorando nomes de variável\n\nNomes de variável e de parâmetro descritivos facilitam a compreensão da finalidade deles.\n\n### Cenário de exemplo\n\nEsse código JavaScript registra em log uma mensagem sobre a idade de uma pessoa no console. Nomes de parâmetro abstratos dificultam a compreensão da finalidade do código.\n\n```javascript id=log-persons-age\nfunction logPersonsAge(a, b, c) {\n  if (c) {\n    console.log(a + \" is \" + b + \" years old.\");\n  } else {\n    console.log(a + \" does not want to reveal their age.\");\n  }\n}\n```\n\n### Prompt de exemplo\n\nNo editor, selecione a função que você deseja alterar e, em seguida, pergunte Copilot Chat:\n\n```copilot copy prompt ref=log-persons-age\nImprove the variable names in this function\n```\n\n### Resposta de exemplo\n\nCopilot sugere nomes de variáveis descritivas.\n\n```javascript\nfunction logPersonAge(name, age, revealAge) {\n  if (revealAge) {\n    console.log(name + \" is \" + age + \" years old.\");\n  } else {\n    console.log(name + \" does not want to reveal their age.\");\n  }\n}\n```\n\n## Evitando verificações condicionais sequenciais\n\nCadeias `if...else` podem se tornar difíceis de compreender, principalmente quando extensas.\n\n### Cenário de exemplo\n\nEste código Python imprime o som que vários animais fazem, se estiverem definidos, ou \"Animal desconhecido\", se o tipo de animal não for reconhecido. No entanto, a cadeia de instruções `if...else` torna o código ineficiente e complicado.\n\n```python id=animal-sound\nclass Animal:\n    def speak(self):\n        pass\n\nclass Dog(Animal):\n    def speak(self):\n        return \"Woof!\"\n\nclass Cat(Animal):\n    def speak(self):\n        return \"Meow!\"\n\nclass Bird(Animal):\n    def speak(self):\n        return \"Tweet!\"\n\ndef animal_sound(animal_type):\n    if animal_type == \"dog\":\n        return Dog().speak()\n    elif animal_type == \"cat\":\n        return Cat().speak()\n    elif animal_type == \"bird\":\n        return Bird().speak()\n    else:\n        return \"Unknown animal\"\n\nprint(animal_sound(\"dog\"))\nprint(animal_sound(\"cat\"))\nprint(animal_sound(\"bird\"))\nprint(animal_sound(\"fish\"))\n```\n\n### Prompt de exemplo\n\n```copilot copy prompt ref=animal-sound\nSimplify this code. Avoid using if/else chains but retain all function return values.\n```\n\n### Resposta de exemplo\n\nCopilot sugere o uso de um dicionário para mapear os tipos de animais para suas classes correspondentes.\n\n```python\nclass Animal:\n    def speak(self):\n        pass\n\nclass Dog(Animal):\n    def speak(self):\n        return \"Woof!\"\n\nclass Cat(Animal):\n    def speak(self):\n        return \"Meow!\"\n\nclass Bird(Animal):\n    def speak(self):\n        return \"Tweet!\"\n\ndef animal_sound(animal_type):\n    animals = {\n        \"dog\": Dog,\n        \"cat\": Cat,\n        \"bird\": Bird\n    }\n    animal_class = animals.get(animal_type, Animal)\n    return animal_class().speak() if animal_class != Animal else \"Unknown animal\"\n\nprint(animal_sound(\"dog\"))\nprint(animal_sound(\"cat\"))\nprint(animal_sound(\"bird\"))\nprint(animal_sound(\"fish\"))\n```\n\n## Reduzindo a lógica aninhada\n\nEstruturas profundamente aninhadas podem tornar o código difícil de acompanhar, dificultando a modificação ou a extensão da lógica do código no futuro.\n\n### Cenário de exemplo\n\nEste código Ruby imprime informações sobre uma conta de usuário com base em três parâmetros. O uso de instruções `if...else` aninhadas torna o código desnecessariamente complexo.\n\n```ruby id=determine-access\ndef determine_access(user_role, has_permission, is_active)\n  if user_role == \"admin\"\n    if has_permission\n      if is_active\n        \"Active admin account with full access.\"\n      else\n        \"Inactive admin account.\"\n      end\n    else\n      \"Admin account lacks necessary permissions.\"\n    end\n  else\n    \"Access denied.\"\n  end\nend\n\nputs determine_access(\"admin\", true, true)\nputs determine_access(\"admin\", true, false)\nputs determine_access(\"admin\", false, true)\nputs determine_access(\"user\", true, true)\n```\n\n### Prompt de exemplo\n\n```copilot copy prompt ref=determine-access\nRewrite this code to avoid the nested if/else statements\n```\n\n### Resposta de exemplo\n\nCopilot sugere o uso de cláusulas de proteção para lidar com as condições antecipadamente e retornar as mensagens apropriadas.\n\n```ruby\ndef determine_access(user_role, has_permission, is_active)\n  return \"Access denied.\" unless user_role == \"admin\"\n  return \"Admin account lacks necessary permissions.\" unless has_permission\n  return \"Inactive admin account.\" unless is_active\n\n  \"Active admin account with full access.\"\nend\n\nputs determine_access(\"admin\", true, true)\nputs determine_access(\"admin\", true, false)\nputs determine_access(\"admin\", false, true)\nputs determine_access(\"user\", true, true)\n```\n\n## Dividindo métodos grandes\n\nPode ser difícil entender exatamente o que um método ou uma função faz quando ela é muito longa, dificultando a manutenção. Métodos ou funções que executam várias tarefas podem não ser reutilizáveis em outros contextos. Também pode ser difícil testar cada tarefa isoladamente.\n\n### Cenário de exemplo\n\nEsse método Java processa um pedido de cliente e imprime uma mensagem. Ele executa várias tarefas em um só método.\n\n```java id=process-order\npublic void processOrder(Order order) {\n  if (order == null || order.getItems().isEmpty()) {\n    throw new IllegalArgumentException(\"Order is invalid.\");\n  }\n\n  double totalPrice = 0.0;\n  for (Item item : order.getItems()) {\n    totalPrice += item.getPrice() * item.getQuantity();\n  }\n  order.setTotalPrice(totalPrice);\n\n  if (totalPrice > 0) {\n    order.setStatus(\"Processed\");\n  } else {\n    order.setStatus(\"Pending\");\n  }\n\n  System.out.println(\"Order for customer \" + order.getCustomerName() + \" has been processed. Total price: \" + totalPrice);\n}\n```\n\n### Prompt de exemplo\n\n```copilot copy prompt ref=process-order\nHow could the processOrder method be refactored to be more useful and easier to maintain\n```\n\n### Resposta de exemplo\n\nCopilot sugere dividir esse método em métodos menores e mais focados.\n\n```java\npublic void processOrder(Order order) {\n    validateOrder(order);\n    double totalPrice = calculateTotalPrice(order);\n    updateOrderStatus(order, totalPrice);\n    printOrderSummary(order, totalPrice);\n}\n\nprivate void validateOrder(Order order) {\n    if (order == null || order.getItems().isEmpty()) {\n        throw new IllegalArgumentException(\"Order is invalid.\");\n    }\n}\n\nprivate double calculateTotalPrice(Order order) {\n    double totalPrice = 0.0;\n    for (Item item : order.getItems()) {\n        totalPrice += item.getPrice() * item.getQuantity();\n    }\n    order.setTotalPrice(totalPrice);\n    return totalPrice;\n}\n\nprivate void updateOrderStatus(Order order, double totalPrice) {\n    if (totalPrice > 0) {\n        order.setStatus(\"Processed\");\n    } else {\n        order.setStatus(\"Pending\");\n    }\n}\n\nprivate void printOrderSummary(Order order, double totalPrice) {\n    System.out.println(\"Order for customer \" + order.getCustomerName() + \" has been processed. Total price: \" + totalPrice);\n}\n```\n\n## Leitura adicional\n\n* [Engenharia de prompts para o GitHub Copilot Chat](/pt/copilot/concepts/prompting/prompt-engineering)\n* [Práticas recomendadas para usar GitHub Copilot](/pt/copilot/get-started/best-practices)"}