{"meta":{"title":"Lidar com preocupações paralelas","intro":"Copilot Chat pode ajudá-lo a evitar o código relacionado a uma preocupação diferente da principal preocupação do método ou função na qual o código está localizado.","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/handle-cross-cutting","title":"Manipular funcionalidades transversais"}],"documentType":"article"},"body":"# Lidar com preocupações paralelas\n\nCopilot Chat pode ajudá-lo a evitar o código relacionado a uma preocupação diferente da principal preocupação do método ou função na qual o código está localizado.\n\nPreocupações transversais são aspectos de um programa que afetam várias partes do sistema, como registro em log, segurança, validação de dados e tratamento de erros. Elas podem se espalhar por uma base de código, levando a desafios de duplicação e manutenção de código.\n\nCopilot Chat pode ajudar a refatorar interesses transversais, sugerindo a implementação de práticas de Programação Orientada a Aspectos (AOP) ou o uso de decoradores e padrões de middleware para centralizar esses interesses de forma modular e de fácil manutenção.\n\n## Cenário de exemplo\n\nImagine que você tem um projeto de Python que contém vários arquivos de serviço nos quais ocorre o registro em log. As informações que são registradas são definidas em cada um dos arquivos de serviço individuais. Se o aplicativo for modificado ou estendido no futuro, esse design poderá levar a inconsistência no conteúdo e no estilo das entradas de log. Você pode consolidar e centralizar o comportamento de registro de log para evitar sua distribuição em seu projeto.\n\nAqui estão três arquivos do nosso exemplo de projeto: o arquivo de ponto de entrada (`main.py`), o arquivo de configuração de mensagem de log (`logging_config.py`) e um dos arquivos de serviço (`order_service.py`). O arquivo de serviço de exemplo mostra como as informações de log são definidas em conjunto com a lógica de negócios de uma parte específica do aplicativo.\n\n### main.py\n\n```python\nimport logging\nfrom logging_config import setup_logging\nfrom payment_service import PaymentService\nfrom order_service import OrderService\nfrom shipping_service import ShippingService\nfrom inventory_service import InventoryService\nfrom notification_service import NotificationService\n\ndef main():\n    setup_logging()\n    payment_service = PaymentService()\n    order_service = OrderService()\n    shipping_service = ShippingService()\n    inventory_service = InventoryService()\n    notification_service = NotificationService()\n\n    # Example usage\n    payment_service.process_payment({\"amount\": 100, \"currency\": \"USD\"})\n    order_service.place_order({\"item\": \"Book\", \"quantity\": 1})\n    shipping_service.ship_order({\"item\": \"Book\", \"quantity\": 1})\n    inventory_service.update_inventory(\"Book\", -1)\n    notification_service.send_notification(\"Order has been placed and shipped.\")\n\nif __name__ == \"__main__\":\n    main()\n```\n\n### logging\\_config.py\n\n```python\nimport logging\n\ndef setup_logging():\n    logging.basicConfig(level=logging.INFO,\n                  format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')\n```\n\n### order\\_service.py\n\n```python\nimport logging\n\nclass OrderService:\n    def __init__(self):\n        self.logger = logging.getLogger(__name__)\n\n    def place_order(self, order):\n        self.logger.info(\"Entering place_order method.\")\n        try:\n            # In here would be the business logic for placing an order\n            # ...\n            self.logger.info(\"Order placed successfully.\")\n        except Exception as e:\n            self.logger.error(f\"Error in place_order method: {e}\")\n            raise\n        finally:\n            self.logger.info(\"Exiting place_order method.\")\n```\n\n## Prompt de exemplo\n\nAbra o espaço de trabalho do projeto em VS Code ou Visual Studio e insira o prompt a seguir na visualização Copilot Chat.\n\n```copilot copy\n@workspace Refactor this project by using AOP to avoid logging that has cross-cutting concerns\n```\n\n> \\[!NOTE]\n> O participante do chat em `@workspace` e VS Code fornece a Visual Studio o contexto sobre todo o código em seu workspace. Você pode usar `@workspace` quando quiser Copilot considerar a estrutura do seu projeto e como diferentes partes do código interagem. Se você estiver usando um IDE do JetBrains, use `@project` em vez de `@workspace`.\n\n## Resposta de exemplo\n\nCopilot responde da seguinte maneira.\n\n> \\[!NOTE] A resposta a seguir é um exemplo. Respostas do Copilot Chat são não determinísticas, portanto, você pode obter uma resposta diferente da mostrada aqui.\n\n> Para refatorar esse projeto usando Programação Orientada a Aspectos (AOP) para lidar com o registro em log como uma preocupação transversal, você pode usar uma biblioteca como `aspectlib`. Veja como fazer isso:\n>\n> 1. Instale `aspectlib`:\n>\n>    `pip install aspectlib`\n>\n> 2. Crie um aspecto para registrar em log em um novo arquivo chamado `logging_aspect.py`:\n>\n>    ```python\n>    import aspectlib\n>    import logging\n>\n>    @aspectlib.Aspect(bind=True)\n>    def log_method_call(cutpoint, *args, **kwargs):\n>        logger = logging.getLogger()\n>        method_name = cutpoint.__name__\n>        logger.info(f\"Entering method: {method_name}\")\n>        try:\n>            result = yield aspectlib.Proceed\n>            logger.info(f\"Method {method_name} executed successfully.\")\n>            return result\n>        except Exception as e:\n>            logger.error(f\"Error in method {method_name}: {e}\")\n>            raise\n>        finally:\n>            logger.info(f\"Exiting method: {method_name}\")\n>    ```\n>\n> 3. Aplique o aspecto aos métodos de serviço em `main.py`:\n>\n>    ```python\n>    import logging\n>    from logging_config import setup_logging\n>    from payment_service import PaymentService\n>    from order_service import OrderService\n>    from shipping_service import ShippingService\n>    from inventory_service import InventoryService\n>    from notification_service import NotificationService\n>    from logging_aspect import log_method_call\n>    import aspectlib\n>\n>    def main():\n>        setup_logging()\n>\n>        # Apply logging aspect to service methods\n>        aspectlib.weave(PaymentService.process_payment, log_method_call)\n>        aspectlib.weave(OrderService.place_order, log_method_call)\n>        aspectlib.weave(ShippingService.ship_order, log_method_call)\n>        aspectlib.weave(InventoryService.update_inventory, log_method_call)\n>        aspectlib.weave(NotificationService.send_notification, log_method_call)\n>\n>        payment_service = PaymentService()\n>        order_service = OrderService()\n>        shipping_service = ShippingService()\n>        inventory_service = InventoryService()\n>        notification_service = NotificationService()\n>\n>        # Example usage\n>        payment_service.process_payment({\"amount\": 100, \"currency\": \"USD\"})\n>        order_service.place_order({\"item\": \"Book\", \"quantity\": 1})\n>        shipping_service.ship_order({\"item\": \"Book\", \"quantity\": 1})\n>        inventory_service.update_inventory(\"Book\", -1)\n>        notification_service.send_notification(\"Order has been placed and shipped.\")\n>\n>    if __name__ == \"__main__\":\n>        main()\n>    ```\n\nCopilot em seguida, orienta você a remover o código de log de todas as classes de serviço e fornece o código dos arquivos revisados. Por exemplo, esta é a versão revisada de `order_service.py`:\n\n```python\nclass OrderService:\n    def place_order(self, order):\n        # In here would be the business logic for placing an order\n        # ...\n        pass\n```\n\nNa versão refatorada do projeto, as mesmas operações de log são executadas, mas o código de log é centralizado em um só arquivo.\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)"}