🚀 Capítulo 02: Programação Procedural e Orientada a Objetos (Tema: Pokémon)
NOTE
Este capítulo utiliza a temática de Pokémon para explicar a diferença entre a Programação Procedural e a Orientada a Objetos (POO). Organizar seus monstrinhos exige um bom modelo mental!
1. 🎯 Objetivo da Aula
Compreender a diferença entre a Programação Procedural (foco em funções que manipulam dados) e a Programação Orientada a Objetos (foco em objetos que agrupam dados e comportamentos).
2. 🏢 O Cenário Prático (Seu Desafio)
Você foi contratado para programar o sistema de batalhas de um novo jogo de Pokémon.
- Abordagem Procedural: Você cria variáveis soltas para a vida do Pikachu (
vidaPikachu = 100) e para o ataque (ataquePikachu = 50). Depois cria uma função soltaatacar(vidaAlvo, forcaAtaque). Os dados e as funções estão separados. - Abordagem Orientada a Objetos (POO): Você cria um molde chamado
Pokemon. Todo Pokémon criado a partir desse molde terá sua própria vida, seu nome e sua própria função de atacar. O Pikachu é um Objeto que contém tanto os dados quanto as ações!
Seu desafio é entender qual dessas abordagens é mais fácil de manter quando o jogo tiver 1.000 Pokémons diferentes!
3. 🧠 Fundamentos: A Teoria Traduzida
📜 1. Programação Procedural
O código é visto como uma sequência de instruções e funções. Os dados são passados de função em função.
- Vantagem: Simples para programas pequenos.
- Desvantagem: Se o sistema cresce, fica difícil saber qual função altera qual variável (o famoso “código espaguete”).
🐶 2. Programação Orientada a Objetos (POO)
O código é organizado em torno de Objetos do mundo real.
- Classe: É o molde ou a receita (Ex: A espécie “Pokémon”).
- Objeto: É a instância real criada a partir do molde (Ex: O “Pikachu” do Ash).
- Atributos: São as características do objeto (Ex:
vida,tipo,nivel). - Métodos: São as ações que o objeto pode fazer (Ex:
atacar(),defender()).
4. 📖 Exemplo Guiado: Comparando os Códigos
Procedural (Dados e Funções separados):
let pikachuVida = 100;
let charmanderVida = 100;
function atacar(atacanteNome, vidaDefensor, dano) {
console.log(`${atacanteNome} atacou!`);
return vidaDefensor - dano;
}
charmanderVida = atacar("Pikachu", charmanderVida, 20);Orientada a Objetos (Dados e Funções juntos):
class Pokemon {
constructor(nome, vida, danoBase) {
this.nome = nome;
this.vida = vida;
this.danoBase = danoBase;
}
atacar(alvo) {
console.log(`${this.nome} atacou ${alvo.nome}!`);
alvo.vida -= this.danoBase;
}
}
const pikachu = new Pokemon("Pikachu", 100, 20);
const charmander = new Pokemon("Charmander", 100, 15);
pikachu.atacar(charmander); // O Pikachu sabe quem ele é e como atacar!5. 🛠️ Prática Obrigatória 1: Identificando Elementos da POO
Com base no exemplo de Orientação a Objetos acima:
- O que é a
class Pokemon? - O que são
pikachuecharmander? - O que são
nome,vidaedanoBase? - O que é
atacar(alvo)?
6. 🛠️ Prática Obrigatória 2: Adicionando Novos Tipos
Imagine que agora queremos adicionar 1.000 novos Pokémons ao jogo.
- Na abordagem Procedural, o que precisaríamos criar para cada novo Pokémon?
- Na abordagem Orientada a Objetos, o que precisaríamos fazer? Qual das duas dá menos trabalho?
7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)
- Faça o Commit: No GitHub Desktop, digite a mensagem (ex:
Finaliza Capítulo 02 Paradigmas) e clique em Commit to main. - Envie para a Nuvem (Push): Clique em Push origin.
8. 📂 Estrutura de Pastas
mod_10_paradigmas_e_padroes_de_projeto/
├── capitulos/
│ ├── capitulo_02_poo.md
│ └── codigos/
│ └── cap02/
│ └── pokemon_procedural.js
│ └── pokemon_oo.js9. 💡 Checkpoint de Lógica
É possível usar funções dentro de um programa orientado a objetos? Sim! Os métodos nada mais são do que funções que pertencem a um objeto.
10. 🔥 Desafio de Fixação
Pesquise o que são os 4 Pilares da POO (Encapsulamento, Abstração, Herança e Polimorfismo) que serão a base de muitos padrões de projeto que veremos adiante.
🔑 Gabarito de Código/Fórmulas
Gabarito da Prática 1:
- É a Classe (o molde).
- São os Objetos (as instâncias).
- São os Atributos (características).
- É um Método (ação).