{"meta":{"title":"Amélioration de la lisibilité du code et de la maintenance","intro":"Copilot Chat peut suggérer des façons de faciliter la compréhension et la maintenance de votre code.","product":"GitHub Copilot","breadcrumbs":[{"href":"/fr/copilot","title":"GitHub Copilot"},{"href":"/fr/copilot/tutorials","title":"Tutoriels"},{"href":"/fr/copilot/tutorials/copilot-cookbook","title":"livre de recettes GitHub Copilot"},{"href":"/fr/copilot/tutorials/copilot-cookbook/refactor-code","title":"Refactoriser le code"},{"href":"/fr/copilot/tutorials/copilot-cookbook/refactor-code/improve-code-readability","title":"Améliorer la lisibilité du code"}],"documentType":"article"},"body":"# Amélioration de la lisibilité du code et de la maintenance\n\nCopilot Chat peut suggérer des façons de faciliter la compréhension et la maintenance de votre code.\n\nLe code avec une lisibilité médiocre est difficile pour les autres développeurs de maintenir et d’étendre.\nCopilot Chat peut vous aider de plusieurs façons. Par exemple, en :\n\n* [Suggérer des améliorations apportées aux noms de variables](#improving-variable-names)\n* [Éviter les vérifications conditionnelles séquentielles](#avoiding-sequential-conditional-checks)\n* [Réduction de la logique imbriquée](#reducing-nested-logic)\n* [fractionner les grandes méthodes en méthodes plus petites et plus lisibles](#splitting-up-large-methods)\n\nLa documentation de votre code est une autre façon d’améliorer la maintenance de votre code. Pour plus d’informations sur l’utilisation de Copilot Chat pour vous aider à ajouter des commentaires utiles à votre code, consultez les exemples d’invites dans [Documentation du code](/fr/copilot/tutorials/copilot-cookbook/document-code).\n\n> \\[!NOTE] Les réponses décrites dans cet article sont des exemples.\n> Copilot Chat les réponses ne sont pas déterministes. Vous pouvez donc obtenir des réponses différentes des réponses présentées ici.\n\n## Amélioration des noms de variables\n\nLes noms de variables descriptifs et les noms de paramètres facilitent la compréhension de leur objectif.\n\n### Exemple de scénario\n\nCe code JavaScript consigne un message sur l’âge d’une personne dans la console. Les noms de paramètres abstraits rendent difficile la compréhension de l’objectif du code.\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### Exemple d’invite\n\nDans l’éditeur, sélectionnez la fonction à modifier, puis demandez Copilot Chat:\n\n```copilot copy prompt ref=log-persons-age\nImprove the variable names in this function\n```\n\n### Exemple de réponse\n\nCopilot suggère des noms de variables descriptives.\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## Éviter les contrôles conditionnels séquentiels\n\n`if...else` chaînes peuvent être difficiles à lire, en particulier lorsqu’elles sont longues.\n\n### Exemple de scénario\n\nCe code Python imprime le son que les différents animaux fabriquent, s’ils sont définis ou « Animal inconnu » si le type d’animal n’est pas reconnu. Toutefois, la chaîne d’instructions `if...else` rend le code inefficace et fastidieux.\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### Exemple d’invite\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### Exemple de réponse\n\nCopilot suggère d’utiliser un dictionnaire pour mapper les types d’animaux à leurs classes correspondantes.\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## Réduire la logique imbriquée\n\nLes structures profondément imbriquées peuvent rendre le code difficile à suivre, ce qui complique la modification ou l'extension de la logique du code à l'avenir.\n\n### Exemple de scénario\n\nCe code Ruby imprime des informations sur un compte d’utilisateur en fonction de trois paramètres. L’utilisation d’instructions `if...else` imbriquées rend le code inutilement complexe.\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### Exemple d’invite\n\n```copilot copy prompt ref=determine-access\nRewrite this code to avoid the nested if/else statements\n```\n\n### Exemple de réponse\n\nCopilot suggère d’utiliser des clauses de garde pour traiter les conditions dès le début et renvoyer les messages appropriés.\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## Fractionnement des méthodes volumineuses\n\nIl peut être difficile de saisir exactement ce qu’une méthode ou une fonction fait s’il est trop long, ce qui rend difficile à maintenir. Les méthodes ou fonctions qui effectuent plusieurs tâches peuvent ne pas être réutilisables dans d’autres contextes. Il peut également être difficile de tester chaque tâche en isolation.\n\n### Exemple de scénario\n\nCette méthode Java traite une commande client et imprime un message. Elle exécute plusieurs tâches en une seule méthode.\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### Exemple d’invite\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### Exemple de réponse\n\nCopilot suggère de décomposer cette méthode en méthodes plus petites et plus ciblées.\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## Lectures complémentaires\n\n* [Ingénierie rapide pour GitHub Copilot Chat](/fr/copilot/concepts/prompting/prompt-engineering)\n* [Meilleures pratiques pour l’utilisation de GitHub Copilot](/fr/copilot/get-started/best-practices)"}