{"meta":{"title":"Улучшение удобочитаемости кода и удобства обслуживания","intro":"Копилот Чат может предложить способы упрощения понимания и обслуживания кода.","product":"GitHub Copilot","breadcrumbs":[{"href":"/ru/copilot","title":"GitHub Copilot"},{"href":"/ru/copilot/tutorials","title":"Учебники"},{"href":"/ru/copilot/tutorials/copilot-chat-cookbook","title":"Кулинарная книга чата GitHub Copilot"},{"href":"/ru/copilot/tutorials/copilot-chat-cookbook/refactor-code","title":"Рефакторинг кода"},{"href":"/ru/copilot/tutorials/copilot-chat-cookbook/refactor-code/improve-code-readability","title":"Улучшение удобочитаемости кода"}],"documentType":"article"},"body":"# Улучшение удобочитаемости кода и удобства обслуживания\n\nКопилот Чат может предложить способы упрощения понимания и обслуживания кода.\n\nКод с низкой удобочитаемостью сложно для других разработчиков поддерживать и расширять их. Копилот Чат может помочь в ряде способов. Например, по:\n\n* [Предложение улучшений имен переменных](#improving-variable-names)\n* [Избегайте последовательных условных проверок](#avoiding-sequential-conditional-checks)\n* [Сокращение вложенной логики](#reducing-nested-logic)\n* [Разделение больших методов на меньшие, более читаемые](#splitting-up-large-methods)\n\nДокументирование кода — это еще один способ повысить удобство обслуживания кода. Сведения об использовании Копилот Чат для добавления полезных комментариев в код см. в примерах запросов в [коде](/ru/copilot/copilot-chat-cookbook/documenting-code) документирования.\n\n> \\[!NOTE] Ответы, показанные в этой статье, являются примерами. Ответы Копилот Чат являются недетерминированными, поэтому вы можете получить различные ответы, показанные здесь.\n\n## Улучшение имен переменных\n\nОписательные имена переменных и имена параметров упрощают понимание их назначения.\n\n### Пример сценария\n\nЭтот код JavaScript записывает сообщение о возрасте человека в консоль. Абстрактные имена параметров затрудняют понимание цели кода.\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### Пример запроса\n\nВ редакторе выберите функцию, которую нужно изменить, а затем попросите Копилот Чат:\n\n```copilot copy prompt ref=log-persons-age\nImprove the variable names in this function\n```\n\n### Пример отклика\n\nCopilot предлагает описательные имена переменных.\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## Избегайте последовательных условных проверок\n\n```\n          `if...else` цепочки могут быть трудными для чтения, особенно если они длинные.\n```\n\n### Пример сценария\n\nЭтот код Python печатает звук, который делают различные животные, если определено, или \"Неизвестное животное\", если тип животного не распознается. Однако цепочка `if...else` операторов делает код неэффективным и громоздким.\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### Пример запроса\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### Пример отклика\n\nCopilot предлагает использовать словарь для сопоставления типов животных с соответствующими классами.\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## Сокращение вложенной логики\n\nГлубоко вложенные структуры могут сделать код сложным для выполнения, что затрудняет изменение или расширение логики кода в будущем.\n\n### Пример сценария\n\nЭтот код Ruby выводит сведения о учетной записи пользователя на основе трех параметров. Использование вложенных `if...else` инструкций делает код ненужным сложным.\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### Пример запроса\n\n```copilot copy prompt ref=determine-access\nRewrite this code to avoid the nested if/else statements\n```\n\n### Пример отклика\n\nCopilot предлагает использовать предложения guard для раннего обработки условий и возврата соответствующих сообщений.\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## Разделение больших методов\n\nЭто может быть трудно понять, какой метод или функция делает, если он слишком длинный, что делает его трудным для поддержания. Методы или функции, выполняющие несколько задач, могут не использоваться повторно в других контекстах. Также может быть трудно протестировать каждую задачу в изоляции.\n\n### Пример сценария\n\nЭтот метод Java обрабатывает заказ клиента и выводит сообщение. Он выполняет несколько задач в одном методе.\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### Пример запроса\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### Пример отклика\n\nCopilot предлагает разбить этот метод на меньшие, более ориентированные методы.\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## Дополнительные материалы\n\n* [Инженерия подсказок для GitHub Copilot Chat](/ru/copilot/using-github-copilot/prompt-engineering-for-github-copilot)\n* [Лучшие практики использования GitHub Copilot](/ru/copilot/using-github-copilot/best-practices-for-using-github-copilot)"}