Capítulo 19: Engenharia de Software e Decomposição Algorítmica
🎯 Objetivo da Aula
Programar em alto nível não é apenas escrever linhas de código: é projetar arquiteturas de software funcionais e escaláveis. Antes de abrir a IDE e digitar comandos, um engenheiro de software precisa entender como quebrar um problema gigantesco em partes pequenas, independentes e testáveis (Top-Down Design).
Nesta aula, você aprenderá a:
- Aplicar o método de Decomposição Top-Down para resolução de problemas complexos.
- Implementar o princípio de Separação de Responsabilidades (Single Responsibility Principle - SRP).
- Adotar técnicas de Programação Defensiva (blindagem contra falhas de digitação do operador).
- Construir um subsistema modular completo de controle de estoque com operações de cadastro, listagem e auditoria.
📥 Material de Apoio e Código-Fonte da Aula:
- 📄 Arquivo Pronto (.por): Baixar Capitulo_19.por (abra diretamente no Portugol Studio)
- 📦 Exercícios Separados (.zip): Baixar Capitulo_19.zip
🏢 O Cenário Prático (Seu Desafio)
Situação: O almoxarifado de peças da FastLog opera sem informatização, gerando perdas financeiras por falta de controle do valor total estocado e duplicidade de cadastros. A gerência solicitou um software em terminal que gerencie até 3 produtos em memória, permitindo:
Cadastrar Produtos(com validação de preços e quantidades positivas).Listar Estoque(com exibição tabular alinhada).Calcular Patrimônio Total(somatório financeiro de todos os itens).Pesquisar Produto por Nome(com alerta de não encontrado).
Missão: Projetar e programar esse sistema dividindo rigorosamente as tarefas em funções especializadas, sem concentrar toda a lógica no bloco inicio().
🧠 Fundamentos: A Metodologia Top-Down
1. Decomposição Top-Down (Do Todo para as Partes)
Em vez de tentar resolver o sistema inteiro de uma só vez, nós o quebramos em módulos hierárquicos:
graph TD
Root["Sistema de Estoque FastLog WMS"] --> M1["Módulo 1: Interface & Menu (funcao vazio)"]
Root --> M2["Módulo 2: Entrada & Cadastro (funcao vazio)"]
Root --> M3["Módulo 3: Relatórios & Listagem (funcao vazio)"]
Root --> M4["Módulo 4: Cálculos Financeiros (funcao real)"]
Root --> M5["Módulo 5: Busca por SKU (funcao vazio)"]
style Root fill:#8e44ad,stroke:#fff,color:#fff
style M1 fill:#2980b9,stroke:#fff,color:#fff
style M2 fill:#2980b9,stroke:#fff,color:#fff
style M3 fill:#2980b9,stroke:#fff,color:#fff
style M4 fill:#27ae60,stroke:#fff,color:#fff
style M5 fill:#e67e22,stroke:#fff,color:#fff2. O Princípio da Responsabilidade Única (SRP)
Cada módulo deve ter um único motivo para mudar:
- A função de Cadastro só se preocupa em ler dados e validar se são positivos.
- A função de Listagem só se preocupa em desenhar a tabela formatada.
- A função de Cálculo só se preocupa em fazer a matemática e devolver o número.
📖 Exemplo Guiado: Subsistema Modular de Estoque
Código do Programa:
🛠️ Prática Obrigatória 1: Módulo de Pesquisa por Nome
Passo 1: O Desafio
Adicione ao sistema acima uma função sem retorno chamada funcao vazio buscar_produto():
- Solicite o nome do produto a ser pesquisado.
- Varra o vetor de nomes e, se encontrar, exiba a quantidade e o preço.
- Se não encontrar, emita o aviso de inexistente usando a técnica da flag booleana.
- Adicione a opção
[4] Pesquisar por Nomeao menu principal.
🛠️ Prática Obrigatória 2: Localizador de Item Mais Valioso
Crie uma função funcao cadeia item_mais_valioso() que percorra o vetor de preços e retorne o nome do produto que possui o maior preço unitário cadastrado. Adicione a opção ao menu.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_19_SeuNome_SeuSobrenome.por. - Teste todo o fluxo de navegação do menu e validações.
- No Microsoft Teams, envie na tarefa “Portugol Cap 19 - Decomposição Algorítmica”.
- Clique em Entregar (Turn In).
💡 Checkpoint de Lógica & Engenharia de Software
Você acabou de aplicar o conceito de CRUD (Create, Read, Update, Delete) e SOA (Service-Oriented Architecture). Essa separação clara de responsabilidades é o exato modelo utilizado no desenvolvimento de APIs modernas em Spring Boot, ASP.NET Core e NestJS.
🔥 Desafio de Fixação: Atualização de Saldo de Produto
Crie a função funcao vazio atualizar_quantidade() que receba o nome do produto e permita alterar a quantidade em estoque caso ele exista.
🔑 Gabarito de Código Completo
Prática 1:
Prática 2:
Desafio:
📝 Atividade Extra: Questionário de Fixação (Caderno)
Instruções: Responda no caderno, de próprio punho, as 10 perguntas abaixo com base no que foi estudado neste capítulo. Ao concluir, leve o caderno até o professor para correção e visto.
- O que é a Decomposição Top-Down, segundo os Fundamentos deste capítulo?
- O que estabelece o Princípio da Responsabilidade Única (SRP), segundo o capítulo? Dê um dos exemplos citados no texto.
- No Exemplo Guiado (Subsistema Modular de Estoque), quais módulos/funções são criados e qual a responsabilidade de cada um?
- O que é Programação Defensiva, segundo o uso feito na função
cadastrar_itens()do Exemplo Guiado? Dê um exemplo de validação aplicada. - Na função
calcular_patrimonio_total(), qual cálculo é realizado para cada item do estoque dentro do laço, e o que a função retorna ao final? - Na Prática Obrigatória 1 (Módulo de Pesquisa por Nome), quais são os quatro passos que a função
buscar_produto()deve realizar? - Na Prática Obrigatória 2 (Localizador de Item Mais Valioso), o que a função
item_mais_valioso()deve retornar, e de que tipo é o seu retorno? - Segundo o Checkpoint de Lógica & Engenharia de Software, a que conceitos de arquitetura de software (siglas) a separação de responsabilidades do capítulo é comparada?
- No Exemplo Guiado, quantos produtos o sistema de estoque da FastLog gerencia em memória, e quais são as três opções principais oferecidas no menu (além de Sair)?
- Segundo o Cenário Prático, quais problemas o almoxarifado da FastLog enfrentava por falta de informatização, antes da criação do sistema?