[{"data":1,"prerenderedAt":978},["ShallowReactive",2],{"navigation_docs":3,"-atividades-atv-13-arquitetura":252,"-atividades-atv-13-arquitetura-surround":973},[4,96,189],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"⚙️ Engenharia de Software","i-lucide-book-open","\u002Fengenharia-software","1.engenharia-software",[10,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92],{"title":5,"path":7,"stem":11},"1.engenharia-software\u002Findex",{"title":13,"path":14,"stem":15},"📋 Plano de Ensino e Aplicações","\u002Fengenharia-software\u002Fengenharia-software-aplicacoes","1.engenharia-software\u002F01.engenharia-software-aplicacoes",{"title":17,"path":18,"stem":19},"Cap 01: Introdução e Natureza do Software","\u002Fengenharia-software\u002Fcap-01","1.engenharia-software\u002F02.cap-01",{"title":21,"path":22,"stem":23},"Cap 02: Modelos de Processo de Software","\u002Fengenharia-software\u002Fcap-02","1.engenharia-software\u002F03.cap-02",{"title":25,"path":26,"stem":27},"Cap 03: As Atividades do Processo","\u002Fengenharia-software\u002Fcap-03","1.engenharia-software\u002F04.cap-03",{"title":29,"path":30,"stem":31},"Cap 04: Metodologias Ágeis","\u002Fengenharia-software\u002Fcap-04","1.engenharia-software\u002F05.cap-04",{"title":33,"path":34,"stem":35},"Cap 05: Fundamentos de Requisitos","\u002Fengenharia-software\u002Fcap-05","1.engenharia-software\u002F06.cap-05",{"title":37,"path":38,"stem":39},"Cap 06: Elicitação e Levantamento","\u002Fengenharia-software\u002Fcap-06","1.engenharia-software\u002F07.cap-06",{"title":41,"path":42,"stem":43},"Cap 07: Especificação de Requisitos (ERS)","\u002Fengenharia-software\u002Fcap-07","1.engenharia-software\u002F08.cap-07",{"title":45,"path":46,"stem":47},"Cap 08: Validação e Gestão","\u002Fengenharia-software\u002Fcap-08","1.engenharia-software\u002F09.cap-08",{"title":49,"path":50,"stem":51},"Cap 09: Fundamentos da Modelagem","\u002Fengenharia-software\u002Fcap-09","1.engenharia-software\u002F10.cap-09",{"title":53,"path":54,"stem":55},"Cap 10: Diagrama de Casos de Uso (Conceitos)","\u002Fengenharia-software\u002Fcap-10","1.engenharia-software\u002F11.cap-10",{"title":57,"path":58,"stem":59},"Cap 11: Casos de Uso (Prática e Relações)","\u002Fengenharia-software\u002Fcap-11","1.engenharia-software\u002F12.cap-11",{"title":61,"path":62,"stem":63},"Cap 12: Diagrama de Classes (Conceitos)","\u002Fengenharia-software\u002Fcap-12","1.engenharia-software\u002F13.cap-12",{"title":65,"path":66,"stem":67},"Cap 13: Herança e Polimorfismo","\u002Fengenharia-software\u002Fcap-13","1.engenharia-software\u002F14.cap-13",{"title":69,"path":70,"stem":71},"Cap 14: Diagrama de Sequência","\u002Fengenharia-software\u002Fcap-14","1.engenharia-software\u002F15.cap-14",{"title":73,"path":74,"stem":75},"Cap 15: Diagramas Dinâmicos (Estados e Atividades)","\u002Fengenharia-software\u002Fcap-15","1.engenharia-software\u002F16.cap-15",{"title":77,"path":78,"stem":79},"Cap 16: Qualidade de Software (SQA)","\u002Fengenharia-software\u002Fcap-16","1.engenharia-software\u002F17.cap-16",{"title":81,"path":82,"stem":83},"Cap 17: Estratégias de Teste","\u002Fengenharia-software\u002Fcap-17","1.engenharia-software\u002F18.cap-17",{"title":85,"path":86,"stem":87},"Cap 18: Manutenção e Evolução","\u002Fengenharia-software\u002Fcap-18","1.engenharia-software\u002F19.cap-18",{"title":89,"path":90,"stem":91},"Cap 19: Gerência de Configuração (SCM)","\u002Fengenharia-software\u002Fcap-19","1.engenharia-software\u002F20.cap-19",{"title":93,"path":94,"stem":95},"Cap 20: Conclusão e Próximos Passos","\u002Fengenharia-software\u002Fcap-20","1.engenharia-software\u002F21.cap-20",{"title":97,"icon":98,"path":99,"stem":100,"children":101},"🛠️ Atividades","i-lucide-wrench","\u002Fatividades","2.atividades",[102,105,109,113,117,121,125,129,133,137,141,145,149,153,157,161,165,169,173,177,181,185],{"title":103,"path":99,"stem":104},"📋 Orientações Gerais","2.atividades\u002Findex",{"title":106,"path":107,"stem":108},"📅 Cronograma","\u002Fatividades\u002Fcronograma","2.atividades\u002F01.cronograma",{"title":110,"path":111,"stem":112},"✏️ Atividade 01: Escopo e Personas","\u002Fatividades\u002Fatv-01-escopo","2.atividades\u002F02.atv-01-escopo",{"title":114,"path":115,"stem":116},"⚙️ Atividade 02: Processos de Software","\u002Fatividades\u002Fatv-02-processos","2.atividades\u002F03.atv-02-processos",{"title":118,"path":119,"stem":120},"📋 Atividade 03: Engenharia de Requisitos","\u002Fatividades\u002Fatv-03-requisitos","2.atividades\u002F04.atv-03-requisitos",{"title":122,"path":123,"stem":124},"📝 Atividade 04: User Stories e Backlog","\u002Fatividades\u002Fatv-04-backlog","2.atividades\u002F05.atv-04-backlog",{"title":126,"path":127,"stem":128},"🎭 Atividade 05: Casos de Uso (UML)","\u002Fatividades\u002Fatv-05-casos-uso","2.atividades\u002F06.atv-05-casos-uso",{"title":130,"path":131,"stem":132},"🖼️ Atividade 06: Prototipagem e Wireframes","\u002Fatividades\u002Fatv-06-prototipagem","2.atividades\u002F07.atv-06-prototipagem",{"title":134,"path":135,"stem":136},"🏛️ Atividade 07: Diagrama de Classes (UML)","\u002Fatividades\u002Fatv-07-classes","2.atividades\u002F08.atv-07-classes",{"title":138,"path":139,"stem":140},"🔀 Atividade 08: Diagrama de Sequência (UML)","\u002Fatividades\u002Fatv-08-sequencia","2.atividades\u002F09.atv-08-sequencia",{"title":142,"path":143,"stem":144},"🧪 Atividade 09: Qualidade e Testes","\u002Fatividades\u002Fatv-09-testes","2.atividades\u002F10.atv-09-testes",{"title":146,"path":147,"stem":148},"🏁 Atividade 10: Projeto Integrador Final","\u002Fatividades\u002Fatv-10-projeto-final","2.atividades\u002F11.atv-10-projeto-final",{"title":150,"path":151,"stem":152},"📊 Atividade 11: Diagrama de Atividades (UML)","\u002Fatividades\u002Fatv-11-atividades","2.atividades\u002F12.atv-11-atividades",{"title":154,"path":155,"stem":156},"🔄 Atividade 12: Diagrama de Transição de Estados (UML)","\u002Fatividades\u002Fatv-12-estados","2.atividades\u002F13.atv-12-estados",{"title":158,"path":159,"stem":160},"🏗️ Atividade 13: Arquitetura de Software e Padrões","\u002Fatividades\u002Fatv-13-arquitetura","2.atividades\u002F14.atv-13-arquitetura",{"title":162,"path":163,"stem":164},"🌐 Atividade 14: Modelagem de APIs REST e Swagger","\u002Fatividades\u002Fatv-14-apis-swagger","2.atividades\u002F15.atv-14-apis-swagger",{"title":166,"path":167,"stem":168},"🌿 Atividade 15: GitFlow e Trabalho Colaborativo","\u002Fatividades\u002Fatv-15-gitflow-colaboracao","2.atividades\u002F16.atv-15-gitflow-colaboracao",{"title":170,"path":171,"stem":172},"🚀 Atividade 16: Pipelines de CI\u002FCD com GitHub Actions","\u002Fatividades\u002Fatv-16-pipelines-cicd","2.atividades\u002F17.atv-16-pipelines-cicd",{"title":174,"path":175,"stem":176},"🐳 Atividade 17: Containerização de Ambientes com Docker","\u002Fatividades\u002Fatv-17-conteineres-docker","2.atividades\u002F18.atv-17-conteineres-docker",{"title":178,"path":179,"stem":180},"🔒 Atividade 18: Segurança no Desenvolvimento e OWASP","\u002Fatividades\u002Fatv-18-seguranca-devsecops","2.atividades\u002F19.atv-18-seguranca-devsecops",{"title":182,"path":183,"stem":184},"📈 Atividade 19: Métricas de Software, Estimativas e DORA","\u002Fatividades\u002Fatv-19-metricas-estimativas","2.atividades\u002F20.atv-19-metricas-estimativas",{"title":186,"path":187,"stem":188},"🏆 Atividade 20: Projeto Final Avançado (Fase 2)","\u002Fatividades\u002Fatv-20-projeto-final-avancado","2.atividades\u002F21.atv-20-projeto-final-avancado",{"title":190,"icon":191,"path":192,"stem":193,"children":194},"🖼️ Galeria de Projetos Integradores","i-lucide-image","\u002Fprojetos-integradores","3.projetos-integradores",[195,197,207,216,225,234,243],{"title":190,"path":192,"stem":196},"3.projetos-integradores\u002Findex",{"title":198,"path":199,"stem":200,"children":201},"🅿️ Projeto 01: Gestão de Estacionamentos","\u002Fprojetos-integradores\u002Fpi-01-gestao-estacionamentos","3.projetos-integradores\u002F01.pi-01-gestao-estacionamentos\u002Findex",[202,203],{"title":198,"path":199,"stem":200},{"title":204,"path":205,"stem":206},"README","\u002Fprojetos-integradores\u002Fpi-01-gestao-estacionamentos\u002Freadme","3.projetos-integradores\u002F01.pi-01-gestao-estacionamentos\u002F2.readme",{"title":208,"path":209,"stem":210,"children":211},"🔐 Projeto 02: Gerador de Senhas","\u002Fprojetos-integradores\u002Fpi-02-gerador-senhas","3.projetos-integradores\u002F02.pi-02-gerador-senhas\u002Findex",[212,213],{"title":208,"path":209,"stem":210},{"title":204,"path":214,"stem":215},"\u002Fprojetos-integradores\u002Fpi-02-gerador-senhas\u002Freadme","3.projetos-integradores\u002F02.pi-02-gerador-senhas\u002F2.readme",{"title":217,"path":218,"stem":219,"children":220},"🍣 Projeto 03: Pedidos Restaurante","\u002Fprojetos-integradores\u002Fpi-03-pedidos-restaurante","3.projetos-integradores\u002F03.pi-03-pedidos-restaurante\u002Findex",[221,222],{"title":217,"path":218,"stem":219},{"title":204,"path":223,"stem":224},"\u002Fprojetos-integradores\u002Fpi-03-pedidos-restaurante\u002Freadme","3.projetos-integradores\u002F03.pi-03-pedidos-restaurante\u002F2.readme",{"title":226,"path":227,"stem":228,"children":229},"📱 Projeto 04: Empréstimos Dispositivos","\u002Fprojetos-integradores\u002Fpi-04-emprestimos-dispositivos","3.projetos-integradores\u002F04.pi-04-emprestimos-dispositivos\u002Findex",[230,231],{"title":226,"path":227,"stem":228},{"title":204,"path":232,"stem":233},"\u002Fprojetos-integradores\u002Fpi-04-emprestimos-dispositivos\u002Freadme","3.projetos-integradores\u002F04.pi-04-emprestimos-dispositivos\u002F2.readme",{"title":235,"path":236,"stem":237,"children":238},"📦 Projeto 05: Gestão de Estoque","\u002Fprojetos-integradores\u002Fpi-05-gestao-estoque","3.projetos-integradores\u002F05.pi-05-gestao-estoque\u002Findex",[239,240],{"title":235,"path":236,"stem":237},{"title":204,"path":241,"stem":242},"\u002Fprojetos-integradores\u002Fpi-05-gestao-estoque\u002Freadme","3.projetos-integradores\u002F05.pi-05-gestao-estoque\u002F2.readme",{"title":244,"path":245,"stem":246,"children":247},"🛵 Projeto 06: Aplicativo de Delivery","\u002Fprojetos-integradores\u002Fpi-06-delivery","3.projetos-integradores\u002F06.pi-06-delivery\u002Findex",[248,249],{"title":244,"path":245,"stem":246},{"title":204,"path":250,"stem":251},"\u002Fprojetos-integradores\u002Fpi-06-delivery\u002Freadme","3.projetos-integradores\u002F06.pi-06-delivery\u002F2.readme",{"id":253,"title":158,"body":254,"description":967,"extension":968,"links":969,"meta":970,"navigation":457,"path":159,"seo":971,"stem":160,"__hash__":972},"docs\u002F2.atividades\u002F14.atv-13-arquitetura.md",{"type":255,"value":256,"toc":946},"minimark",[257,260,265,269,306,308,312,319,332,334,338,345,350,385,390,394,396,400,417,583,587,687,691,715,717,721,727,756,760,763,765,769,774,804,806,810,813,832,834,838,854,856,860,942],[258,259],"hr",{},[261,262,264],"h2",{"id":263},"objetivo-da-aula","🎯 Objetivo da Aula",[266,267,268],"p",{},"Ao final desta atividade, você será capaz de:",[270,271,272,276,292,299],"ul",{},[273,274,275],"li",{},"Diferenciar monólitos, camadas MVC e arquiteturas desacopladas modernas.",[273,277,278,279,283,284,287,288,291],{},"Projetar o fluxo de dados entre ",[280,281,282],"strong",{},"Controller",", ",[280,285,286],{},"Service"," e ",[280,289,290],{},"Repository"," do Spring Boot.",[273,293,294,295,298],{},"Compreender o uso do ",[280,296,297],{},"Thymeleaf + HTMX"," para gerar interfaces reativas sem o peso de frameworks complexos de SPA.",[273,300,301,302,305],{},"Aplicar o padrão de projeto ",[280,303,304],{},"Factory"," para criação desacoplada de objetos de negócio.",[258,307],{},[261,309,311],{"id":310},"o-cenário-prático-seu-desafio","🏢 O Cenário Prático (Seu Desafio)",[266,313,314,315,318],{},"Na ",[280,316,317],{},"TecProExpress",", a equipe de desenvolvimento estava sofrendo: toda vez que precisavam mudar o banco de dados de MySQL para PostgreSQL, tinham que reescrever a validação de rotas, o cálculo do frete e as telas do aplicativo! Tudo estava tão bagunçado e misturado (acoplado) que um erro de digitação no botão da tela derrubava o cálculo do financeiro!",[320,321,322],"blockquote",{},[266,323,324,325,328,329,331],{},"\"Seu desafio como ",[280,326,327],{},"Arquiteto de Software"," é reorganizar a plataforma. Você desenhará a estrutura do sistema em camadas estritas e isoladas no Spring Boot. Além disso, os motoristas exigem notificações de novas rotas via SMS, e-mail ou push móvel. Você implementará o padrão ",[280,330,304],{}," para que o sistema escolha o tipo correto de envio de notificação sem acoplar a lógica de entrega.\"",[258,333],{},[261,335,337],{"id":336},"fundamentos-a-teoria-traduzida","🧠 Fundamentos: A Teoria Traduzida",[266,339,340,341,344],{},"Para que um sistema sobreviva a anos de manutenção, ele deve ser ",[280,342,343],{},"desacoplado"," (cada peça cuida de apenas um assunto).",[346,347,349],"h3",{"id":348},"a-estrutura-em-camadas-spring-boot","A Estrutura em Camadas (Spring Boot)",[351,352,353,359,365,371],"ol",{},[273,354,355,358],{},[280,356,357],{},"View \u002F Interface (Thymeleaf + HTMX):"," Renderiza o HTML dinâmico no servidor com Thymeleaf e realiza requisições parciais assíncronas com HTMX, mantendo o carregamento rápido e leve.",[273,360,361,364],{},[280,362,363],{},"Controller (Camada de Apresentação):"," Recebe os cliques (requisições HTTP), extrai dados do formulário e chama a lógica. Ele nunca calcula regras de negócio!",[273,366,367,370],{},[280,368,369],{},"Service (Camada de Negócio):"," Onde as regras morrem. É o \"cérebro\" do sistema (Ex: calcula desconto, valida se o motorista está ativo).",[273,372,373,376,377,283,381,384],{},[280,374,375],{},"Repository \u002F DAO (Camada de Dados):"," Onde ocorrem as queries SQL (",[378,379,380],"code",{},"SELECT",[378,382,383],{},"INSERT","), salvando e buscando os dados no banco de dados.",[386,387,389],"h4",{"id":388},"visualizando-a-lógica-mvc-camadas","📊 Visualizando a Lógica MVC + Camadas",[391,392],"mermaid",{"code":393},"flowchart TD\n    Browser[\"Navegador (HTML + HTMX)\"] -->|1. Requisição HTTP| Controller[\"Controller (Spring MVC)\"]\n    Controller -->|2. Valida & Encaminha| Service[\"Service (Regras de Negócio)\"]\n    Service -->|3. Consulta Dados| Repository[\"Repository (Acesso ao Banco)\"]\n    Repository -->|4. Retorna Entidades| Service\n    Service -->|5. Retorna Resultados| Controller\n    Controller -->|6. Renderiza Thymeleaf| Browser\n\n    style Browser fill:#eceff1,stroke:#607d8b,stroke-width:2px\n    style Controller fill:#fffde7,stroke:#fbc02d,stroke-width:2px\n    style Service fill:#e1f5fe,stroke:#0288d1,stroke-width:2px\n    style Repository fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px\n",[258,395],{},[261,397,399],{"id":398},"exemplo-guiado-o-padrão-factory-notificações","📖 Exemplo Guiado: O Padrão Factory (Notificações)",[266,401,402,403,283,406,287,409,412,413,416],{},"Quando uma nova rota é atribuída, precisamos despachar um alerta ao entregador. Mas não queremos acoplar as classes ",[378,404,405],{},"SmsNotification",[378,407,408],{},"EmailNotification",[378,410,411],{},"PushNotification"," no código principal. Usaremos a ",[280,414,415],{},"NotificationFactory",".",[418,419,424],"pre",{"className":420,"code":421,"language":422,"meta":423,"style":423},"language-java shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F 1. Interface comum de Notificação\npublic interface Notification {\n    void send(String message, String target);\n}\n\n\u002F\u002F 2. Implementações específicas\npublic class SmsNotification implements Notification {\n    public void send(String message, String target) {\n        System.out.println(\"Disparando SMS para \" + target + \": \" + message);\n    }\n}\n\npublic class EmailNotification implements Notification {\n    public void send(String message, String target) {\n        System.out.println(\"Enviando E-mail para \" + target + \": \" + message);\n    }\n}\n\n\u002F\u002F 3. A Fábrica (Factory) que desacopla a criação\npublic class NotificationFactory {\n    public static Notification createNotification(String type) {\n        if (type == null) return null;\n        if (type.equalsIgnoreCase(\"SMS\")) return new SmsNotification();\n        if (type.equalsIgnoreCase(\"EMAIL\")) return new EmailNotification();\n        throw new IllegalArgumentException(\"Tipo de notificação desconhecido: \" + type);\n    }\n}\n","java","",[378,425,426,434,440,446,452,459,465,471,477,483,489,494,499,505,510,516,521,526,531,537,543,549,555,561,567,573,578],{"__ignoreMap":423},[427,428,431],"span",{"class":429,"line":430},"line",1,[427,432,433],{},"\u002F\u002F 1. Interface comum de Notificação\n",[427,435,437],{"class":429,"line":436},2,[427,438,439],{},"public interface Notification {\n",[427,441,443],{"class":429,"line":442},3,[427,444,445],{},"    void send(String message, String target);\n",[427,447,449],{"class":429,"line":448},4,[427,450,451],{},"}\n",[427,453,455],{"class":429,"line":454},5,[427,456,458],{"emptyLinePlaceholder":457},true,"\n",[427,460,462],{"class":429,"line":461},6,[427,463,464],{},"\u002F\u002F 2. Implementações específicas\n",[427,466,468],{"class":429,"line":467},7,[427,469,470],{},"public class SmsNotification implements Notification {\n",[427,472,474],{"class":429,"line":473},8,[427,475,476],{},"    public void send(String message, String target) {\n",[427,478,480],{"class":429,"line":479},9,[427,481,482],{},"        System.out.println(\"Disparando SMS para \" + target + \": \" + message);\n",[427,484,486],{"class":429,"line":485},10,[427,487,488],{},"    }\n",[427,490,492],{"class":429,"line":491},11,[427,493,451],{},[427,495,497],{"class":429,"line":496},12,[427,498,458],{"emptyLinePlaceholder":457},[427,500,502],{"class":429,"line":501},13,[427,503,504],{},"public class EmailNotification implements Notification {\n",[427,506,508],{"class":429,"line":507},14,[427,509,476],{},[427,511,513],{"class":429,"line":512},15,[427,514,515],{},"        System.out.println(\"Enviando E-mail para \" + target + \": \" + message);\n",[427,517,519],{"class":429,"line":518},16,[427,520,488],{},[427,522,524],{"class":429,"line":523},17,[427,525,451],{},[427,527,529],{"class":429,"line":528},18,[427,530,458],{"emptyLinePlaceholder":457},[427,532,534],{"class":429,"line":533},19,[427,535,536],{},"\u002F\u002F 3. A Fábrica (Factory) que desacopla a criação\n",[427,538,540],{"class":429,"line":539},20,[427,541,542],{},"public class NotificationFactory {\n",[427,544,546],{"class":429,"line":545},21,[427,547,548],{},"    public static Notification createNotification(String type) {\n",[427,550,552],{"class":429,"line":551},22,[427,553,554],{},"        if (type == null) return null;\n",[427,556,558],{"class":429,"line":557},23,[427,559,560],{},"        if (type.equalsIgnoreCase(\"SMS\")) return new SmsNotification();\n",[427,562,564],{"class":429,"line":563},24,[427,565,566],{},"        if (type.equalsIgnoreCase(\"EMAIL\")) return new EmailNotification();\n",[427,568,570],{"class":429,"line":569},25,[427,571,572],{},"        throw new IllegalArgumentException(\"Tipo de notificação desconhecido: \" + type);\n",[427,574,576],{"class":429,"line":575},26,[427,577,488],{},[427,579,581],{"class":429,"line":580},27,[427,582,451],{},[346,584,586],{"id":585},"️-código-do-service-utilizando-a-factory-no-spring-boot","🛠️ Código do Service utilizando a Factory no Spring Boot:",[418,588,590],{"className":420,"code":589,"language":422,"meta":423,"style":423},"@Service\npublic class DeliveryService {\n    \n    @Autowired\n    private DeliveryRepository repository;\n\n    public void processarEntrega(Long deliveryId, String notificationType) {\n        \u002F\u002F Busca a entrega no banco\n        Delivery delivery = repository.findById(deliveryId)\n            .orElseThrow(() -> new RuntimeException(\"Entrega não encontrada\"));\n\n        \u002F\u002F Lógica de Negócio: Atualiza status\n        delivery.setStatus(\"EM_ROTA\");\n        repository.save(delivery);\n\n        \u002F\u002F Uso do Padrão Factory para enviar notificação sem acoplamento\n        Notification notification = NotificationFactory.createNotification(notificationType);\n        notification.send(\"Sua entrega está em rota!\", delivery.getMotoristaContato());\n    }\n}\n",[378,591,592,597,602,607,612,617,621,626,631,636,641,645,650,655,660,664,669,674,679,683],{"__ignoreMap":423},[427,593,594],{"class":429,"line":430},[427,595,596],{},"@Service\n",[427,598,599],{"class":429,"line":436},[427,600,601],{},"public class DeliveryService {\n",[427,603,604],{"class":429,"line":442},[427,605,606],{},"    \n",[427,608,609],{"class":429,"line":448},[427,610,611],{},"    @Autowired\n",[427,613,614],{"class":429,"line":454},[427,615,616],{},"    private DeliveryRepository repository;\n",[427,618,619],{"class":429,"line":461},[427,620,458],{"emptyLinePlaceholder":457},[427,622,623],{"class":429,"line":467},[427,624,625],{},"    public void processarEntrega(Long deliveryId, String notificationType) {\n",[427,627,628],{"class":429,"line":473},[427,629,630],{},"        \u002F\u002F Busca a entrega no banco\n",[427,632,633],{"class":429,"line":479},[427,634,635],{},"        Delivery delivery = repository.findById(deliveryId)\n",[427,637,638],{"class":429,"line":485},[427,639,640],{},"            .orElseThrow(() -> new RuntimeException(\"Entrega não encontrada\"));\n",[427,642,643],{"class":429,"line":491},[427,644,458],{"emptyLinePlaceholder":457},[427,646,647],{"class":429,"line":496},[427,648,649],{},"        \u002F\u002F Lógica de Negócio: Atualiza status\n",[427,651,652],{"class":429,"line":501},[427,653,654],{},"        delivery.setStatus(\"EM_ROTA\");\n",[427,656,657],{"class":429,"line":507},[427,658,659],{},"        repository.save(delivery);\n",[427,661,662],{"class":429,"line":512},[427,663,458],{"emptyLinePlaceholder":457},[427,665,666],{"class":429,"line":518},[427,667,668],{},"        \u002F\u002F Uso do Padrão Factory para enviar notificação sem acoplamento\n",[427,670,671],{"class":429,"line":523},[427,672,673],{},"        Notification notification = NotificationFactory.createNotification(notificationType);\n",[427,675,676],{"class":429,"line":528},[427,677,678],{},"        notification.send(\"Sua entrega está em rota!\", delivery.getMotoristaContato());\n",[427,680,681],{"class":429,"line":533},[427,682,488],{},[427,684,685],{"class":429,"line":539},[427,686,451],{},[386,688,690],{"id":689},"detalhamento-do-processo","🔍 Detalhamento do Processo:",[270,692,693],{},[273,694,695,696,699,700,703,704,706,707,710,711,714],{},"Se amanhã o diretor da TecProExpress exigir o envio de notificações por ",[280,697,698],{},"WhatsApp",", basta criar a classe ",[378,701,702],{},"WhatsAppNotification"," e adicioná-la dentro da ",[378,705,415],{},". O arquivo ",[378,708,709],{},"DeliveryService"," continuará intacto, provando que nosso sistema atende ao ",[280,712,713],{},"Princípio do Aberto\u002FFechado (OCP)"," do SOLID! 🚀",[258,716],{},[261,718,720],{"id":719},"️-prática-obrigatória-1-desenho-arquitetural","🛠️ Prática Obrigatória 1: Desenho Arquitetural",[266,722,723,726],{},[280,724,725],{},"Cenário:"," O projeto semestral da sua equipe.",[351,728,729,736,753],{},[273,730,731,732,735],{},"Desenhe um diagrama ",[378,733,734],{},"flowchart"," no Mermaid representando a arquitetura em camadas do seu projeto de grupo.",[273,737,738,739,742,743,742,746,749,750,416],{},"Mapeie e rotule as caixas indicando onde ficará a sua ",[280,740,741],{},"Interface (Thymeleaf\u002FHTMX)",", seus ",[280,744,745],{},"Controllers",[280,747,748],{},"Services (Regras de Negócio)"," e seus ",[280,751,752],{},"Repositories",[273,754,755],{},"Garanta que a camada de interface fale exclusivamente com o Controller, e o Controller fale exclusivamente com o Service.",[346,757,759],{"id":758},"resultado-esperado-para-sua-referência","🏁 Resultado Esperado (Para sua Referência)",[266,761,762],{},"Um diagrama de arquitetura de camadas profissional documentado em formato Mermaid no corpo do seu arquivo Markdown de entrega.",[258,764],{},[261,766,768],{"id":767},"️-prática-obrigatória-2-modelando-o-padrão-factory","🛠️ Prática Obrigatória 2: Modelando o Padrão Factory",[266,770,771,773],{},[280,772,725],{}," Desacoplando o fluxo criacional de classes do seu projeto.",[351,775,776,791],{},[273,777,778,779,782,783,786,787,790],{},"Identifique uma regra do seu sistema que exige diferentes comportamentos ou envios dependendo de uma escolha do usuário (Ex: Modos de Pagamento ",[427,780,781],{},"Pix, Crédito, Boleto",", Calculadoras de Frete ",[427,784,785],{},"Rápido, Econômico, Sedex",", Relatórios ",[427,788,789],{},"PDF, CSV",").",[273,792,793,794,283,797,800,801,803],{},"Escreva a estrutura de classes (pode ser em pseudo-código ou Java) contendo a ",[280,795,796],{},"Interface comum",[280,798,799],{},"duas classes filhas implementadoras"," e a ",[280,802,304],{}," de decisão criacional.",[258,805],{},[261,807,809],{"id":808},"instruções-de-entrega-microsoft-teams","📤 Instruções de Entrega (Microsoft Teams)",[266,811,812],{},"Após validar suas especificações arquiteturais:",[351,814,815,826,829],{},[273,816,817,818,821,822,825],{},"Salve o arquivo de código e diagramas com o nome ",[378,819,820],{},"Atividade_13.md"," na pasta ",[378,823,824],{},"es-atv-13-arquitetura\u002F"," do seu repositório GitHub.",[273,827,828],{},"Certifique-se de fazer o commit e push para o repositório público.",[273,830,831],{},"Submeta o link do seu repositório no Microsoft Teams para avaliação do professor.",[258,833],{},[261,835,837],{"id":836},"checkpoint-de-lógica","💡 Checkpoint de Lógica",[839,840,843,846,847,850,851,853],"callout",{"color":841,"icon":842},"primary","i-lucide-megaphone",[280,844,845],{},"Importante:"," ",[280,848,849],{},"Reflexão Profissional:","\nPor que na arquitetura profissional de desenvolvimento em camadas do Spring Boot, a classe de ",[280,852,282],{}," nunca deve conter queries SQL ou lógicas pesadas de IF\u002FELSE de negócios? (Resposta: Para manter o desacoplamento e a testabilidade do sistema. O Controller deve apenas gerenciar a comunicação com o protocolo HTTP; se regras de negócio forem colocadas ali, o código ficará amarrado ao ambiente Web, impedindo que essa mesma lógica de negócio seja reutilizada em APIs móveis, agendadores automáticos ou testes unitários JUnit). 🧠🛡️",[258,855],{},[261,857,859],{"id":858},"rubrica-formativa-de-avaliação","📊 Rubrica Formativa de Avaliação",[861,862,864,865,864,888],"table",{"style":863},"width:100%; border-collapse: collapse; font-family: sans-serif; margin: 20px 0; border: 1px solid #ddd; box-shadow: 0 4px 8px rgba(0,0,0,0.1);","\n  ",[866,867,868,869,864],"thead",{},"\n    ",[870,871,873,874,873,879,873,882,873,885,868],"tr",{"style":872},"background-color: #2c3e50; color: white;","\n      ",[875,876,878],"th",{"style":877},"padding: 12px; border: 1px solid #ddd; text-align: left;","Critério de Avaliação",[875,880,881],{"style":877},"Insuficiente (0% - 40%)",[875,883,884],{"style":877},"Regular (41% - 70%)",[875,886,887],{"style":877},"Excelente (71% - 100%)",[889,890,868,891,868,910,868,926,864],"tbody",{},[870,892,873,894,873,901,873,904,873,907,868],{"style":893},"background-color: #f8f9fa;",[895,896,898],"td",{"style":897},"padding: 10px; border: 1px solid #ddd;",[280,899,900],{},"Arquitetura em Camadas (Mermaid Flowchart)",[895,902,903],{"style":897},"Diagrama confuso ou misturando responsabilidades de Controller e Repository.",[895,905,906],{"style":897},"Mapeia as camadas mas sem rotular o fluxo estrito (UI ➔ Controller ➔ Service ➔ Repository).",[895,908,909],{"style":897},"Diagrama Mermaid de arquitetura em camadas perfeitamente desacoplado e rotulado.",[870,911,873,912,873,917,873,920,873,923,868],{},[895,913,914],{"style":897},[280,915,916],{},"Design Pattern Factory (Desacoplamento)",[895,918,919],{"style":897},"Modela criacionalmente sem usar interfaces ou abstração.",[895,921,922],{"style":897},"Cria a Factory mas mantendo alto acoplamento na classe chamadora.",[895,924,925],{"style":897},"Modelagem impecável do padrão Factory respeitando o Princípio Aberto\u002FFechado (OCP) do SOLID.",[870,927,873,928,873,933,873,936,873,939,868],{"style":893},[895,929,930],{"style":897},[280,931,932],{},"Entrega no GitHub",[895,934,935],{"style":897},"Entrega fora da pasta `es-atv-13-arquitetura\u002F`.",[895,937,938],{"style":897},"Arquivo entregue mas sem renderização do diagrama Mermaid.",[895,940,941],{"style":897},"Submete `Atividade_13.md` com código limpo e Mermaid renderizado com sucesso.",[943,944,945],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":423,"searchDepth":436,"depth":442,"links":947},[948,949,950,955,960,963,964,965,966],{"id":263,"depth":436,"text":264},{"id":310,"depth":436,"text":311},{"id":336,"depth":436,"text":337,"children":951},[952],{"id":348,"depth":442,"text":349,"children":953},[954],{"id":388,"depth":448,"text":389},{"id":398,"depth":436,"text":399,"children":956},[957],{"id":585,"depth":442,"text":586,"children":958},[959],{"id":689,"depth":448,"text":690},{"id":719,"depth":436,"text":720,"children":961},[962],{"id":758,"depth":442,"text":759},{"id":767,"depth":436,"text":768},{"id":808,"depth":436,"text":809},{"id":836,"depth":436,"text":837},{"id":858,"depth":436,"text":859},"Bem-vindo a mais uma etapa do seu desenvolvimento técnico! Agora que você domina a modelagem de processos e dados, daremos o passo mais importante para quem quer se tornar um desenvolvedor sênior ou gestor técnico: projetar a arquitetura interna do software. Hoje, aprenderemos a organizar sistemas profissionais em camadas usando o padrão MVC (Model-View-Controller) corporativo com Java 17, Spring Boot 3.5.x, Thymeleaf e HTMX, além de aplicar o padrão de projeto criacional Factory. 🛡️🧩","md",null,{},{"title":158,"description":967},"VXFUaWhj9KPCgOjExJVqc3pZ0DT1cT9fVaA61fLnn7w",[974,976],{"title":154,"path":155,"stem":156,"description":975,"children":-1},"Bem-vindo a mais uma etapa prática do seu treinamento em Engenharia de Software. Na atividade anterior, você aprendeu sobre processos e fluxos lógicos. Hoje, nosso foco muda para o ciclo de vida de uma entidade do sistema. Você aprenderá como modelar os Estados pelos quais um dado transiciona, garantindo que o software nunca entre em inconsistência lógica. 🛡️🧩",{"title":162,"path":163,"stem":164,"description":977,"children":-1},"Bem-vindo a mais uma etapa prática de Engenharia de Software! Agora que você conhece as camadas internas do software, aprenderá como expor e conectar o seu sistema ao mundo externo. Hoje, vamos nos tornar arquitetos de comunicação móvel e web, projetando contratos de integração baseados em APIs RESTful, payloads de dados JSON e documentando tudo com o padrão profissional global Swagger (OpenAPI). 🛡️🧩",1788375145613]