9  POO e Módulos

Programação Orientada a Objetos (POO) ajuda a modelar o mundo real em código usando classes e objetos.

9.1 Conceitos básicos de POO

  • classe: molde para criar objetos;
  • objeto: instância da classe;
  • atributo: característica do objeto;
  • método: comportamento do objeto.

9.2 Criando uma classe

class Pessoa {
  constructor(nome, idade) {
    this.nome = nome;
    this.idade = idade;
  }

  apresentar() {
    return `Meu nome é ${this.nome} e tenho ${this.idade} anos.`;
  }
}

const p1 = new Pessoa("Lia", 17);
console.log(p1.apresentar());

9.3 Encapsulando regras com métodos

class ContaEstudante {
  constructor(saldoInicial = 0) {
    this.saldo = saldoInicial;
  }

  depositar(valor) {
    if (valor <= 0) return;
    this.saldo += valor;
  }

  sacar(valor) {
    if (valor > this.saldo) return "Saldo insuficiente";
    this.saldo -= valor;
    return "Saque realizado";
  }
}

const conta = new ContaEstudante(100);
conta.depositar(50);
console.log(conta.sacar(30));
console.log(conta.saldo);

9.4 Herança

Herança permite reutilizar código de uma classe base.

class Pessoa {
  constructor(nome, idade) {
    this.nome = nome;
    this.idade = idade;
  }
}

class Aluno extends Pessoa {
  constructor(nome, idade, curso) {
    super(nome, idade);
    this.curso = curso;
  }

  dados() {
    return `${this.nome} - ${this.curso}`;
  }
}

const aluno = new Aluno("Rafa", 16, "Informática");
console.log(aluno.dados());

9.5 Polimorfismo (ideia prática)

Diferentes classes podem ter métodos com o mesmo nome e comportamentos específicos.

class Transporte {
  calcularTempo() {
    return "Tempo padrão";
  }
}

class Onibus extends Transporte {
  calcularTempo() {
    return "Tempo estimado: 25 min";
  }
}

class Bicicleta extends Transporte {
  calcularTempo() {
    return "Tempo estimado: 18 min";
  }
}

const opcoes = [new Onibus(), new Bicicleta()];
opcoes.forEach((item) => console.log(item.calcularTempo()));

9.6 Relembrando módulos ES

9.6.1 Export nomeado

matematica.js

export function somar(a, b) {
  return a + b;
}

main.js

import { somar } from "./matematica.js";
console.log(somar(5, 7));

9.6.2 Export default

formatador.js

export default function formatarMoeda(valor) {
  return `R$ ${valor.toFixed(2)}`;
}

app.js

import formatarMoeda from "./formatador.js";
console.log(formatarMoeda(35.5));

9.7 Exemplo integrado: classe + módulo

produto.js

export class Produto {
  constructor(nome, preco) {
    this.nome = nome;
    this.preco = preco;
  }

  aplicarDesconto(percentual) {
    this.preco -= this.preco * (percentual / 100);
  }
}

index.js

import { Produto } from "./produto.js";

const caderno = new Produto("Caderno", 30);
caderno.aplicarDesconto(10);
console.log(caderno);

9.8 Exercícios

  1. Crie uma classe Produto com nome, preço e método de desconto.
  2. Crie Funcionario e Professor usando herança.
  3. Crie uma classe RoteiroTuristico com método para calcular custo total.
  4. Separe funções em módulos e importe no arquivo principal.
  5. Desafio: combine uma classe com persistência em array de objetos.